DA1468x
6个月前
发布的batman230865点 5回复嗨
我的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个月前
嗨
谢谢回复,在调试模式下,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个月前
你好,
你能不能试着跟上SPI适配器的概念教程?请使用类似于5.6节中的prvSPITask_ECHO()任务的代码。环回测试任务代码。如图18所示,使用逻辑分析仪捕获的SPI双工事务,ad_spi_complex_transact()工作正常。
谢谢,PM_Dialog
6个月前
嗨
我现在可以得到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引脚必须配置相同的端口?
谢谢~ ~
6个月前
你好,
谢谢你的在线问题。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