跳过主要内容

我不能从DA14683-00A9DEVKT-P的SPI读取函数获得任何数据

DA1468x

6个月前

发布的batman230865点 5回复
0的问题

我的SPI读功能有问题,DA14683用SPI接口和其他芯片通信,我用SPI功能向这个芯片写命令成功,但从这个芯片读数据失败,我得不到任何读数据。我用示波器确保SPI信号正常传输,MISO和MOSI的信号是正确的,但是我在软件上读不到任何数据,我的代码有什么问题?

我的代码如下。

========== gpio_map_config.h ==================

#定义HW_GPIO_PORT_MT6381_SPI_CLK HW_GPIO_PORT_3
#定义HW_GPIO_PIN_MT6381_SPI_CLK HW_GPIO_PIN_1

#定义HW_GPIO_PORT_MT6381_SPI_DI HW_GPIO_PORT_2
#定义HW_GPIO_PIN_MT6381_SPI_DI HW_GPIO_PIN_1

#定义HW_GPIO_PORT_MT6381_SPI_DO HW_GPIO_PORT_3
#定义HW_GPIO_PIN_MT6381_SPI_DO HW_GPIO_PIN_2

#定义HW_GPIO_PORT_MT6381_SPI_CSN HW_GPIO_PORT_3
#定义HW_GPIO_PIN_MT6381_SPI_CSN HW_GPIO_PIN_0

========== platform_devices.h ==================

SPI_BUS (SPI1)
Spi_slave_device (spi1, mt6381_spi, hw_gpio_port_mt6381_spi_csn, hw_gpio_pin_mt6381_spi_csn, hw_spi_word_8bit, hw_spi_pol_low, hw_spi_pha_mode_0, hw_spi_freq_div_8, hw_dma_channel_0);
SPI_BUS_END

========== SPI的任务 ==================

#定义MT6381_SPI_BUFFER_LEN (uint8_t) 32

static spi_device mt6381_spi_handle = NULL;

static uint8_t spi_tx_buf[MT6381_SPI_BUFFER_LEN] = {0};

static uint8_t spi_rx_buf[MT6381_SPI_BUFFER_LEN] = {0};

hw_gpio_set_pin_function(HW_GPIO_PORT_MT6381_SPI_CLK, HW_GPIO_PIN_MT6381_SPI_CLK, HW_GPIO_MODE_OUTPUT, HW_GPIO_FUNC_SPI_CLK);
hw_gpio_set_pin_function(HW_GPIO_PORT_MT6381_SPI_DI, HW_GPIO_PIN_MT6381_SPI_DI, HW_GPIO_MODE_INPUT, HW_GPIO_FUNC_SPI_DI);
hw_gpio_set_pin_function(HW_GPIO_PORT_MT6381_SPI_DO, HW_GPIO_PIN_MT6381_SPI_DO, HW_GPIO_MODE_OUTPUT, HW_GPIO_FUNC_SPI_DO);
hw_gpio_set_pin_function(HW_GPIO_PORT_MT6381_SPI_CSN, HW_GPIO_PIN_MT6381_SPI_CSN, HW_GPIO_MODE_OUTPUT, HW_GPIO_FUNC_SPI_EN);
hw_gpio_set_active (HW_GPIO_PORT_MT6381_SPI_CSN HW_GPIO_PIN_MT6381_SPI_CSN);

ad_spi_init ();
mt6381_spi_handle = ad_spi_open (MT6381_SPI);

spi_tx_buf[0] = (reg_ADDRESS>> 8) & 0xff;
spi_tx_buf[1] = reg_ADDRESS & 0xff;
spi_tx_buf[2] = (reg_DATA>> 8) & 0xff;
spi_tx_buf[3] = reg_DATA & 0xff;

Tx_len = 4;
Rx_len = 4;

ad_spi_transaction (mt6381_spi_handle, spi_tx_buf, tx_len, spi_rx_buf, rx_len);

printf (" SPI读出:% d % d % d % d !r \ n \”,(int) spi_rx_buf [0], (int) spi_rx_buf [1], (int) spi_rx_buf [2], (int) spi_rx_buf [3]);

===========================================

spi_rx_buf总是零

谢谢。

6个月前

PM_Dialog

你好,

谢谢你的在线问题。ad_spi_transact()调用ad_spi_complex_transact(),后者调用hw_spi_read_buf()来通过SPI读取字节。请您在调试代码中运行您的代码,在hw_spi_read_buf()中添加一个断点,并检查ii是否正常运行?

在调试模式下,当调用ad_spi_transact()时,spi_rx_buf是否包含您想要读取的字节?

能否请你用逻辑分析仪工具探测SPI线并分享一张截图?

您还可以尝试使用ad_spi_write()而不是ad_spi_transact()来执行只写事务。

谢谢,PM_Dialog

6个月前

batman2308 65点

谢谢回复,在调试模式下,spi_rx_buf不能读任何字节,但有一件事我想确认,我们的SPI模式是32位双工传输(同时写和读),请参考附件的图片,这是示波器图片SPI信号(只显示SCLK &味噌)是正确的,下面的代码是正确的? ?好像是先写后读?我不确定

spi_tx_buf[0] = (reg_ADDRESS>> 8) & 0xff;
spi_tx_buf[1] = reg_ADDRESS & 0xff;
spi_tx_buf[2] = (reg_DATA>> 8) & 0xff;
spi_tx_buf[3] = reg_DATA & 0xff;

Tx_len = 4;
Rx_len = 4;

ad_spi_transaction (mt6381_spi_handle, spi_tx_buf, tx_len, spi_rx_buf, rx_len);

=============================================================

Void ad_spi_complex_transaction (spi_device dev, spi_transfer_data * transfer_size, size_t count)

Spi_device_config *device = (Spi_device_config *) dev;
const HW_SPI_ID id = device->bus_id;
size_t我;

ad_spi_device_acquire (dev);
ad_spi_bus_acquire (dev);

ad_spi_bus_activate_cs (dev);

For (i = 0;我<数;+ + i) {
如果(转移[我].wbuf) {
如果(转移[我].rbuf) {
hw_spi_writeread_buf (id、转移[我]。wbuf,转移[我].rbuf,
转移[我]。长度、ad_spi_wait_event设备);
其他}{
hw_spi_write_buf (id、转移[我]。wbuf,转移[我]. length,
ad_spi_wait_event、设备);

其他}{
hw_spi_read_buf (id、转移[我]。rbuf,转移[我]. length,
ad_spi_wait_event、设备);

OS_EVENT_WAIT(设备- > bus_data - >事件,OS_EVENT_FOREVER);

ad_spi_bus_deactivate_cs (dev);

ad_spi_bus_release (dev);
ad_spi_device_release (dev);

Void ad_spi_transact(spi_device dev, uint8_t *wbuf, size_t wlen, uint8_t *rbuf,),
size_t rlen)

sp_transfer_data传输[2]= {
{wbuf, NULL, wlen},
{NULL, rbuf, rlen}
};

ad_spi_complex_transact (dev,转移,1);

谢谢~ ~

附件 大小
圖片2. png 2.1 MB

6个月前

PM_Dialog

你好,

你能不能试着跟上SPI适配器的概念教程?请使用类似于5.6节中的prvSPITask_ECHO()任务的代码。环回测试任务代码。如图18所示,使用逻辑分析仪捕获的SPI双工事务,ad_spi_complex_transact()工作正常。

谢谢,PM_Dialog

6个月前

batman2308 65点

我现在可以得到SPI读取数据,但是仅仅使用你建议的类似代码是不够的,之后,我改变了SPI GPIO引脚设置,最后我们可以得到SPI读取数据

原始SPI GPIO引脚设置

SPI_CS:销3.0

SPI_CLK: pin3.1

SPI_DI: pin2.1

SPI_DO: pin3.2

最新的SPI GPIO引脚设置

SPI_CS:销3.0

SPI_CLK: pin3.1

SPI_DI: pin3.3

SPI_DO: pin3.2

这是否意味着所有SPI引脚必须配置相同的端口?

谢谢~ ~

3个月前

PM_Dialog

你好,

不是所有SPI引脚都需要配置在同一个端口。

也许pin2.1用于另一个函数。

(抱歉耽搁了,我错过了你最后一个问题)

谢谢,PM_Dialog