如何配置与外部传感器的SPI通信,例如MPU6500

9个员额/ 0个新员额
最后一篇文章
wenkangl
离线
最后一次露面:4年5个月前
加入:2016-06-23 13:01
如何配置与外部传感器的SPI通信,例如MPU6500

嗨,对话框中,

我正在尝试使用MPU6500,3D加速度计和陀螺仪使用DA14580 DK_BASIC。我想使用SPI配置将传感器与DA14580连接,但是,似乎SPI不起作用。(如果它有效,当我读取Whoami寄存器时,输出应该是0x70,但现在我只有0xff!)

在MPU6500的数据表中,它说(时序图在下面连接)
SPI操作特征
1.数据首先交付MSB和LSB
2.数据锁定在SCLK的上升边缘
3.数据应在SCLK下降沿转移
4. SCLK的最大频率为1MHz
5.SPI读写操作在16个或更多时钟周期(两个或更多字节)内完成。第一个字节包含SPI地址,下一个字节包含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

spspi_di, spspi_di_gpio_port, spspi_di_gpio_pin, pid_spi_di
spe_gpio (spe_do, spe_do_gpio_port, spe_do_gpio_pin, pid_spi_spi_do);
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, OUTPUT, PID_SPI_EN, true);
GPIO_ConfigurePin(SPI_CLK_GPIO_PORT, SPI_CLK_GPIO_PIN, OUTPUT, PID_SPI_CLK, false);
GPIO_ConfigurePin(SPI_DO_GPIO_PORT, SPI_DO_GPIO_PIN, OUTPUT, PID_SPI_DO, false);
GPIO_ConfigurePin(SPI_DI_GPIO_PORT, SPI_DI_GPIO_PIN, INPUT_PULLUP, PID_SPI_DI, false);

(3)SPI初始化
SPI_Pad_t spi_mpu6500_CS_Pad;
空白initSPI(空白)
{
spi_mpu6500_cs_pad.pin = 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寄存器

#define whoami(0x75)

UINT8_T R_BIT = 0x80;
uint8_t W_MASK = 0x7F;

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

void writeReg(uint8_t address, uint8_t data)
{
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 result = (Uint8_t)spi_transaction(0xff);
返回结果;
}
我的SPI初始化有什么问题吗?

设备:
wenkangl
离线
最后一次露面:4年5个月前
加入:2016-06-23 13:01
这是硬件

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

mt_dialog.
离线
最后一次露面:2个月3个星期前
职员
加入:2015-06-08 34
嗨wenkangl。

嗨wenkangl。

我们没有在SPI接口上使用此传感器,我可以做的就是给你一些关于你如何调试这一点的建议,就我所能告诉我在与SPI初始化中没有看到任何错误,就像设置一样580对应于传感器的设置,关于您读取数据的方式,也许您可​​以尝试手动与CS交互并使用SPI_Access()函数才能读取传感器而不是SPI_Transaction()(SPI_Transaction()将每次调用CS引脚),也可以使用逻辑分析仪会使此问题更易于调试,请检查数据是否在SPI总线上运行。此外,您也可以尝试降低大师时钟并检查传感器是否响应。此外,由于传感器具有1MHz的限制,SPI的SPI时钟与SPI_INIT中的CLK_PER_REG的设置和SPI_CTRL_REG中的SPI_XTAL_DIV_8为2MHz。

谢谢mt_dialog.

wenkangl
离线
最后一次露面:4年5个月前
加入:2016-06-23 13:01
你好,

你好,

谢谢,SPI现在开始工作了。你会将这些示例添加到SDK中吗?我想,许多开发者都希望看到这些参考设计。^_^

mt_dialog.
离线
最后一次露面:2个月3个星期前
职员
加入:2015-06-08 34
嗨wenkangl,

嗨wenkangl,

你指的是哪个例子?为了演示580外围设备的功能,SDK包含了一些基本示例。我不认为SDK中会包含不同类型传感器的驱动程序。

谢谢mt_dialog.

swong86
离线
最后一次露面:3年8个月前
加入:2016-07-18 02:53
你好,

你好,

我正在处理相同的场景,我必须将一些数据从外部处理器(Quark 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
#define 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
#define 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
#define 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()中添加了以下代码。
保留_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);
spe_gpio (spi_do, spi_gpio_port, spi_do_pin, pid_spi_do);
保留_ PPIO(SPI_DI,SPI_GPIO_PORT,SPI_DI_PIN,PID_SPI_DI);

在set_pad_functions()中添加了以下代码。
GPIO_ConfigurePin(SPI_GPIO_PORT, SPI_CLK_PIN, OUTPUT, PID_SPI_CLK, false);
GPIO_ConfigurePin(SPI_GPIO_PORT, SPI_CS_PIN, OUTPUT, PID_SPI_EN, true);
gpio_configurepin(spi_gpio_port,spi_do_pin,输出,pid_spi_do,false);
gpio_configurepin(spi_gpio_port,spi_di_pin,input_pulldown,pid_spi_di,false);

创建以下函数
SPI_Pad_t spi_da14580_CS_Pad;

空白initSPI(空白)
{
spi_da14580_CS_Pad。销= SPI_EN_GPIO_PIN;
spi_da14580_cs_pad.port = 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);
}

在外围init()中调用InitSPI()

3.在user_profile.c

我更新了下面的函数,以便在连接时读取spi。
Void user_app_connection(uint8_t connection_idx, struct gapc_connection_req_ind const *param)
{
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))
{
//连接参数不是我们期望的param
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);
if(data_rec)
打破;
}
}
其他的
{
//没有建立连接,重启广告
user_app_adv_start();
}

default_app_on_connection (connection_idx参数);
}

有没有人能告诉我,我做错了什么或者错过了什么,因为上面的变化不能正常工作。

谢谢。

mt_dialog.
离线
最后一次露面:2个月3个星期前
职员
加入:2015-06-08 34
嗨swong86,

嗨swong86,

我不太得到你想要做的事情,580可以在完全嵌入或完全托管模式下工作,我看到你的帖子你已经应用了一些修改我想到了580领域,所以你正在运行的东西,完全托管或完全嵌入?由于您提到您希望将其与外部处理器连接,因此如果您希望将外部设备运行系统的应用程序部分,则不清楚它。您可以查看Prox_reporter_ext_spi项目中的SDK,以检查如何在从模式下正确初始化SPI(即580应在从模式中)。

谢谢mt_dialog.

swong86
离线
最后一次露面:3年8个月前
加入:2016-07-18 02:53
你好,

你好,

我想配置DA14580为SPI从模式接收数据从外部微控制器(夸克C1000)。
两者都是通过SPI连接的。
夸克被配置为SPI Master,它正在正确地写入数据。
在我的应用程序中,我必须将DA14580配置为SPI从模式,然后读取来自Master(外部微控制器)的数据,然后使用BLE堆栈广播数据。
我没有调试工具来调试应用程序。
我尝试了prox_reporter_ext_spi项目。我能够编译和生成它的十六进制。但是在闪烁十六进制之后,我无法在android应用程序中检测到我的BLE。
你能告诉我写申请还需要做些什么吗?

谢谢。

mt_dialog.
离线
最后一次露面:2个月3个星期前
职员
加入:2015-06-08 34
嗨swong86,

嗨swong86,

似乎您尚未完全理解580的可用配置和功能,我将尝试在此概括一些事情,但您需要看看可用文档并定义设备的要求。

为了使580工作,它需要一个应用程序,以便向BLE堆栈发送命令并指示堆栈它应该如何表现。因此,当应用程序在580之外运行时,配置被调用完全嵌入(就像我建议的示例,我建议您看看),并且当应用程序在580中运行时(大多数我们的BLE示例),调用配置完全托管。因此,如果您有一个完全嵌入式系统,需要指示580从外部MCU执行任何功能性,外部MCU和580的通信通过GTL(580中使用的自定义协议),而GTL也可以实现通过UART或SPI。

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

I VE指示其完全托管应用程序的应用程序,但是从该示例中,您将能够查看如何在SPI从模式下配置580。此应用程序正在使用作为外部设备(在580上运行)的外部设备(在580上运行)将命令发送到SPI的外部设备(运行580)。那么你想要你的系统的配置是什么样的配置。

同样,如果你没有任何方法来调试事情是有点困难的,因为我不会能够跟踪任何错误,如果你只是粘贴你的代码和你的设备不工作。

谢谢mt_dialog.