如何使用外部传感器配置SPI通信,例如MPU6500

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

嗨对话,

我正在尝试将DA14580 DK_BASIC与MPU6500,3D加速器计和陀螺仪一起使用。我想使用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中
#define spi_en_gpio_port gpio_port_0
#define spi_en_gpio_pin gpio_pin_3

#define spi_clk_gpio_port gpio_port_0
#define spi_clk_gpio_pin gpio_pin_0

#define spi_do_gpio_port gpio_port_1
#define spi_do_gpio_pin gpio_pin_3

#define spi_di_gpio_port gpio_port_1
#define 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,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;
void initspi(void)
{
spi_mpu6500_cs_pad.pin = spi_en_gpio_pin;
spi_mpu6500_cs_pad.port = 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_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(void)
{
// spi_set_bitmode(spi_mode_16bit);
// uint16_t read_data =(((whoami&r_bit)<< 8)|(0x00);
// uint8_t receed_data = spi_transaction(read_data);
uint8_t接收_data = readreg(whoami);
返回接收_data;
}

void 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(0xff);
返回结果;
}
我的SPI初始化有问题吗?

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

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

附件:
mt_dialog
离线
最后一次露面:1年3个月前
职员
加入:2015-06-08 11:34
嗨,温坎格。

嗨,温坎格。

我们没有在SPI界面上使用该传感器,我能做的就是为您提供一些有关如何调试此传感器的建议,据我所知,我在SPI的初始化中看不到任何错误580与传感器的设置相对应,以读取数据的方式,也许您可​​以尝试与CS手动交互并使用spi_access()函数以读取传感器而不是spi_transaction()(spi_transaction()(SPI_TRANSACTION())每次调用CS PIN)也会通过使用逻辑分析仪更容易调试CS PIN),检查数据是否在SPI BUS上运行。另外,您可以尝试降低大师时钟,并检查传感器是否响应。此外,由于传感器具有1MHz的限制,因此SPI_INIT中的CLK_PER_REG的设置和SPI_XTAL_DIV_8在SPI_CTRL_REG中的SPI_XTAL_DIV_8为2MHz。

谢谢mt_dialog

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

你好,

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

mt_dialog
离线
最后一次露面:1年3个月前
职员
加入:2015-06-08 11:34
嗨,温坎格尔,

嗨,温坎格尔,

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

谢谢mt_dialog

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

你好,

我正在处理相同的方案,其中我必须将一些数据从外部处理器(Quark C1000)发送到BLE模块(TDK SESUB-PAN-D14580)进行广告。
这两个设备都是通过SPI接口进行通信。我对SPI配置进行了以下更改 -

1.在user_periph_setup.h中

定义spi引脚
#define spi_gpio_port gpio_port_0
#define spi_clk_pin gpio_pin_0
#define spi_cs_pin gpio_pin_1
#define spi_do_pin gpio_pin_2
#define spi_di_pin gpio_pin_3
#define spi_dready_pin gpio_pin_7

#ifndef __DA14583__
#define spi_en_gpio_port gpio_port_0
#define spi_en_gpio_pin gpio_pin_1

#define spi_clk_gpio_port gpio_port_0
#define spi_clk_gpio_pin gpio_pin_0

#define spi_do_gpio_port gpio_port_0
#define spi_do_gpio_pin gpio_pin_2

#define spi_di_gpio_port gpio_port_0
#define spi_di_gpio_pin gpio_pin_3
#else // DA14583
#define spi_en_gpio_port gpio_port_2
#define spi_en_gpio_pin gpio_pin_3

#define spi_clk_gpio_port gpio_port_2
#define spi_clk_gpio_pin gpio_pin_0

#define spi_do_gpio_port gpio_port_2
#define spi_do_gpio_pin gpio_pin_9

#define spi_di_gpio_port gpio_port_2
#define spi_di_gpio_pin gpio_pin_4
#万一

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,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,output,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;

void initspi(void)
{
spi_da14580_cs_pad.pin = 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_xtal_div_8);
}

在periph_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;
if(app_env [connection_idx] .conidx!= gap_invalid_conidx)
{
app_connection_idx = connection_idx;

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

//检查已建立连接的参数是否是首选。
//如果没有,请安排连接参数更新请求。
if((param-> con_interval (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);
if(data_rec)
休息;
}
}
别的
{
//尚未建立连接,重新启动广告
user_app_adv_start();
}

default_app_on_connection(connection_idx,param);
}

可以告诉我我做错了什么或错过了什么,因为上述更改无法正常工作。

谢谢。

mt_dialog
离线
最后一次露面:1年3个月前
职员
加入:2015-06-08 11:34
嗨,Swong86,

嗨,Swong86,

我不太了解您要做的事情,580可以在完全嵌入或完全托管的模式下工作,我在您的帖子上看到您已经对580侧进行了一些修改,因此您正在运行的内容,完全托管还是完全嵌入?由于您提到要将其与外部处理器连接起来,因此尚不清楚您是否希望外部设备运行系统的应用程序部分。您可以查看Prox_reporter_ext_spi项目中的SDK,以便检查如何在从模式下正确初始化SPI(即580应该处于从模式下)。

谢谢mt_dialog

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

你好,

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

谢谢。

mt_dialog
离线
最后一次露面:1年3个月前
职员
加入:2015-06-08 11:34
嗨,Swong86,

嗨,Swong86,

似乎您还没有完全了解580的可用配置和功能,我将尝试在这里总结一些内容,但是您需要查看可用的文档并定义设备的要求。

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

如果不喜欢完全嵌入的配置,并且您的应用程序应在580上运行,并且您希望外部应用程序仅通过SPI发送一些字节,然后将580的应用程序FW发送到580的应用程序来处理该数据并相应地运行情况不同。

我VE的应用程序表示是一个完全托管的应用程序,但是从该示例中,您将能够查看如何以SPI从模式配置580。此应用程序正在使用\ da1458x_sdk \ 5.0.4 \ projects \ host_apps \ da1458x \ proximity \ reporter fw,该\ reporter \ reporter fw充当外部设备(在580上运行),该设备将命令发送到SPI上的从属580。因此,您希望系统具有什么样的配置。

另外,如果您没有任何调试的方法,那么很难进行调试,因为如果您粘贴代码并且设备不起作用,我将无法追踪任何错误。

谢谢mt_dialog