如何配置SPI通信与外部传感器,如mpu6500

9新职位/ 0
最后发表
wenkangl
离线
最后看到:5年5个月前
加入:2016-06-23 13:01
如何配置SPI通信与外部传感器,如mpu6500

嗨,对话框中,

我试图使用DA14580 DK_BASIC mpu6500, 3 d-accelerometer和陀螺仪。我想使用SPI配置连接传感器DA14580,然而,SPI似乎并不工作。(如果它工作,当我读到WHOAMI登记,输出应该0 x70、但是现在我只有0 xff !)

在数据表ofMPU6500,它说(计时图附后)
SPI操作功能
1。数据交付MSB第一和LSB
2。数据锁定SCLK的前沿
3所示。数据应该转变SCLK的下降沿
4所示。SCLK的最大频率是1 mhz
5。SPI读和写操作完成16个或多个时钟周期(两个或两个以上的字节)。第一个字节包含SPI地址和以下字节(s)包含(s) SPI数据。第一部分包含读/写的第一个字节,表示读(1)或写(0)操作。以下7位包含寄存器地址。在多字节读/写的情况下,两个或两个以上的数据字节。

在我的代码:
(1)在user_periph_setup.h
#定义SPI_EN_GPIO_PORT GPIO_PORT_0
#定义SPI_EN_GPIO_PIN GPIO_PIN_3

#定义SPI_CLK_GPIO_PORT GPIO_PORT_0
#定义SPI_CLK_GPIO_PIN GPIO_PIN_0

#定义SPI_DO_GPIO_PORT GPIO_PORT_1
#定义SPI_DO_GPIO_PIN GPIO_PIN_3

#定义SPI_DI_GPIO_PORT GPIO_PORT_1
#定义SPI_DI_GPIO_PIN GPIO_PIN_1

(2)在user_periph_setup.c

RESERVE_GPIO (SPI_DI SPI_DI_GPIO_PORT、SPI_DI_GPIO_PIN PID_SPI_DI);
RESERVE_GPIO (SPI_DO SPI_DO_GPIO_PORT、SPI_DO_GPIO_PIN PID_SPI_DO);
RESERVE_GPIO (SPI_CLK SPI_CLK_GPIO_PORT、SPI_CLK_GPIO_PIN PID_SPI_CLK);
RESERVE_GPIO (SPI_EN SPI_EN_GPIO_PORT、SPI_EN_GPIO_PIN PID_SPI_EN);

/ / Init SPI
GPIO_ConfigurePin (SPI_EN_GPIO_PORT SPI_EN_GPIO_PIN、输出PID_SPI_EN, true);
GPIO_ConfigurePin (SPI_CLK_GPIO_PORT SPI_CLK_GPIO_PIN、输出PID_SPI_CLK,假);
GPIO_ConfigurePin (SPI_DO_GPIO_PORT SPI_DO_GPIO_PIN、输出PID_SPI_DO,假);
GPIO_ConfigurePin (SPI_DI_GPIO_PORT SPI_DI_GPIO_PIN、INPUT_PULLUP PID_SPI_DI,假);

(3)SPI初始化
SPI_Pad_t spi_mpu6500_CS_Pad;
空白initSPI(空白)
{
spi_mpu6500_CS_Pad。销= SPI_EN_GPIO_PIN;
spi_mpu6500_CS_Pad。端口= SPI_EN_GPIO_PORT;
spi_init (&spi_mpu6500_CS_Pad、SPI_MODE_8BIT SPI_ROLE_MASTER、SPI_CLK_IDLE_POL_HIGH SPI_PHA_MODE_1, SPI_MINT_ENABLE, SPI_XTAL_DIV_8);
resetSPI ();
}

(4)读WHAMI登记

#定义WHOAMI (0 x75)

uint8_t R_BIT = 0 x80;
uint8_t W_MASK = 0 x7f;

uint8_t getWHOAMI(空白)
{
/ / spi_set_bitmode (SPI_MODE_16BIT);
/ / uint16_t read_data = ((WHOAMI & R_BIT) < < 8) | (0 x00);
/ / uint8_t receive_data = spi_transaction (read_data);
uint8_t receive_data = readReg (WHOAMI);
返回receive_data;
}

空白writeReg (uint8_t地址,uint8_t数据)
{
spi_set_bitmode (SPI_MODE_8BIT);
地址& = W_MASK;
spi_transaction(地址);
spi_transaction(数据);
_sleep_ (1000);
}

uint8_t readReg (uint8_t地址)
{
spi_set_bitmode (SPI_MODE_8BIT);
地址| = R_BIT;
spi_transaction(地址);
uint8_t结果= (uint8_t) spi_transaction (0 xff);
返回结果;
}
有任何问题与我的SPI初始化?

设备:
wenkangl
离线
最后看到:5年5个月前
加入:2016-06-23 13:01
这是硬件

这是硬件连接。希望有人能帮帮我!谢谢! ! !

MT_dialog
离线
最后看到:1年3个月前
工作人员
加入:2015-06-08 34
嗨wenkangl。

嗨wenkangl。

我们不使用这个传感器的SPI接口,我能做的就是给你一些建议关于如何调试,只要我可以告诉我不要看错什么与SPI的初始化设置在580对应传感器的设置,关于你读取数据的方式,也许你可以尝试手动与CS和交互使用spi_access()函数来读取传感器代替spi_transaction () (spi_transaction()将切换CS销每次被调用),也通过使用逻辑分析仪将使这个问题更容易调试,检查数据是否通过SPI总线运行。你也可以试着降低大师时钟和检查传感器响应。另外因为传感器1 mhz限制SPI的时钟的设置与SPI_XTAL_DIV_8 CLK_PER_REG spi_init和SPI_CTRL_REG是2 mhz。

由于MT_dialog

wenkangl
离线
最后看到:5年5个月前
加入:2016-06-23 13:01
你好,

你好,

谢谢你,和SPI现在工作。SDK将你添加这些例子?许多开发人员希望看到这些参考设计,我认为。^ _ ^

MT_dialog
离线
最后看到:1年3个月前
工作人员
加入:2015-06-08 34
嗨wenkangl,

嗨wenkangl,

你参照的例子?SDK包含一些基本例子为了证明580年的外围设备的功能。我不认为不同种类的传感器驱动程序将包含在SDK。

由于MT_dialog

swong86
离线
最后看到:4年9个月前
加入:2016-07-18 02:53
你好,

你好,

我工作在相同的场景,我发送一些数据从外部处理器(夸克C1000) BLE模块(TDK SESUB-PAN-D14580)广告。
设备都是通过SPI接口通信。我做了以下更改为- SPI配置

1。在user_periph_setup.h

定义- SPI别针
#定义SPI_GPIO_PORT GPIO_PORT_0
#定义SPI_CLK_PIN GPIO_PIN_0
#定义SPI_CS_PIN GPIO_PIN_1
#定义SPI_DO_PIN GPIO_PIN_2
#定义SPI_DI_PIN GPIO_PIN_3
#定义SPI_DREADY_PIN GPIO_PIN_7

的ifndef __DA14583__
#定义SPI_EN_GPIO_PORT GPIO_PORT_0
#定义SPI_EN_GPIO_PIN GPIO_PIN_1

#定义SPI_CLK_GPIO_PORT GPIO_PORT_0
#定义SPI_CLK_GPIO_PIN GPIO_PIN_0

#定义SPI_DO_GPIO_PORT GPIO_PORT_0
#定义SPI_DO_GPIO_PIN GPIO_PIN_2

#定义SPI_DI_GPIO_PORT GPIO_PORT_0
#定义SPI_DI_GPIO_PIN GPIO_PIN_3
# / / DA14583
#定义SPI_EN_GPIO_PORT GPIO_PORT_2
#定义SPI_EN_GPIO_PIN GPIO_PIN_3

#定义SPI_CLK_GPIO_PORT GPIO_PORT_2
#定义SPI_CLK_GPIO_PIN GPIO_PIN_0

#定义SPI_DO_GPIO_PORT GPIO_PORT_2
#定义SPI_DO_GPIO_PIN GPIO_PIN_9

#定义SPI_DI_GPIO_PORT GPIO_PORT_2
#定义SPI_DI_GPIO_PIN GPIO_PIN_4
# endif

2。在user_periph_setup.c

添加下面的代码在GPIO_reservations ()。
RESERVE_GPIO (SPI_CLK SPI_GPIO_PORT、SPI_CLK_PIN PID_SPI_CLK);
RESERVE_GPIO (SPI_EN SPI_GPIO_PORT、SPI_CS_PIN PID_SPI_EN);
RESERVE_GPIO (SPI_DO SPI_GPIO_PORT、SPI_DO_PIN PID_SPI_DO);
RESERVE_GPIO (SPI_DI SPI_GPIO_PORT、SPI_DI_PIN PID_SPI_DI);

添加下面的代码在set_pad_functions ()。
GPIO_ConfigurePin (SPI_GPIO_PORT SPI_CLK_PIN、输出PID_SPI_CLK,假);
GPIO_ConfigurePin (SPI_GPIO_PORT SPI_CS_PIN、输出PID_SPI_EN, true);
GPIO_ConfigurePin (SPI_GPIO_PORT SPI_DO_PIN、输出PID_SPI_DO,假);
GPIO_ConfigurePin (SPI_GPIO_PORT SPI_DI_PIN、INPUT_PULLDOWN PID_SPI_DI,假);

创建以下函数
SPI_Pad_t spi_da14580_CS_Pad;

空白initSPI(空白)
{
spi_da14580_CS_Pad。销= SPI_EN_GPIO_PIN;
spi_da14580_CS_Pad。端口= SPI_EN_GPIO_PORT;
spi_init (&spi_da14580_CS_Pad、SPI_MODE_8BIT SPI_ROLE_MASTER、SPI_CLK_IDLE_POL_LOW SPI_PHA_MODE_0, SPI_MINT_DISABLE, SPI_XTAL_DIV_8);
}

在periph_init调用InitSPI () ()

3所示。在user_profile.c

我更新以下函数读取spi的连接。
空白user_app_connection (uint8_t connection_idx, struct gapc_connection_req_ind const *参数)
{
uint8_t data_sen = 2;
如果(app_env [connection_idx]。conidx ! = GAP_INVALID_CONIDX)
{
app_connection_idx = connection_idx;

/ /停止广告数据更新定时器
app_easy_timer_cancel (app_adv_data_update_timer_used);

/ /检查是否建立连接的参数是首选的方法。
/ /如果不是然后安排一个连接请求更新参数。
如果((param - > con_interval < user_connection_param_conf.intv_min) | |
(param - > con_interval > user_connection_param_conf.intv_max) | |
(param - > con_latency ! = user_connection_param_conf.latency) | |
(param - > sup_to ! = user_connection_param_conf.time_out))
{
/ /连接参数不是这些,我们期望
app_param_update_request_timer_used = app_easy_timer (APP_PARAM_UPDATE_REQUEST_TO param_update_request_timer_cb);
}
而(1)
{
data_rec = spi_access ((uint32_t) data_sen);
如果(data_rec)
打破;
}
}
其他的
{
/ /没有建立连接,重启广告
user_app_adv_start ();
}

default_app_on_connection (connection_idx参数);
}

任何一个能告诉我我做错了什么或错过,因为上面的变化不正常工作。

谢谢。

MT_dialog
离线
最后看到:1年3个月前
工作人员
加入:2015-06-08 34
嗨swong86,

嗨swong86,

我不明白你想做什么,580年完全可以工作嵌入或完全托管模式下,我看到了你的帖子,你有一些修改我想应用于580年的,所以你正在运行,完全托管或完全嵌入?既然你提到你想连接与外部处理器,所以它不清楚如果你想的外部设备运行应用程序部分您的系统。你可以看看SDK prox_reporter_ext_spi项目为了检查如何正确初始化您的SPI在奴隶模式(即如果580年奴隶应该模式)。

由于MT_dialog

swong86
离线
最后看到:4年9个月前
加入:2016-07-18 02:53
你好,

你好,

我想DA14580进入SPI奴隶模式配置为接收数据从外部微控制器(夸克C1000)。
两者都是通过SPI连接。
夸克是配置为SPI主写正确的数据。
在我的应用程序配置DA14580 SPI奴隶模式,然后读取数据来自大师(外部微控制器),然后广泛使用ble堆栈的数据。
我没有调试工具调试应用程序。
我试着prox_reporter_ext_spi项目。我能够编译和生成十六进制。但闪烁的十六进制后,我无法检测到我的祝福在android应用程序。
你能告诉我我应该做写什么应用程序?

谢谢。

MT_dialog
离线
最后看到:1年3个月前
工作人员
加入:2015-06-08 34
嗨swong86,

嗨swong86,

看来你还没有完全理解580年可用的配置和功能,我将试着summurize几件事情在这里但是你需要看看可用的文档和定义你的设备的要求。

为了580年的工作需要一个应用程序以发送命令BLE栈和指示堆栈应该如何表现。所以当580年之外的应用程序运行的配置被称为完全围住(就像我已经建议的例子你看看),当应用程序运行在580年(我们的大多数例子)被称为完全托管的配置。如果你有一个完整的嵌入式系统需要指导580年执行任何functionallities从外部的单片机,单片机外部的沟通和580年完成了GTL(580)中使用的自定义协议,和GTL通过UART实现SPI。

如果不会喜欢一个完全嵌入的配置,和您的应用程序应该运行在580,你希望外部应用程序通过SPI发送一些字节,然后应用fw的580来处理数据和操作相应的东西是不同的。

我的应用程序显示其完全托管应用程序,但从这个例子你可以看到580年SPI奴隶可以配置模式。这个应用程序是使用\ DA1458x_SDK \ 5.0.4 \ host_apps \ da1458x \ \项目邻近\记者弗兰克-威廉姆斯,充当一个外部设备(580)上运行,在SPI发送命令奴隶580。所以你想什么样的配置你的系统。

如果你不该有任何意味着调试事情有点困难,因为我不会能够跟踪任何错误如果你只是粘贴你的代码和你的设备不工作。

由于MT_dialog