Page 1 of 1

再请教SPI的一个问题

Posted: Sun Apr 24, 2022 2:46 am
by djqlyy
spi传输中有两种方式:
1,spi_slave_transmit()阻塞
2,spi_slave_queue_trans() + spi_slave_get_trans_result()
请问第二种为什么还要有spi_slave_get_trans_result()?当接收到数据时会触发 my_post_trans_cb()
为什么还要在主程序里面一直轮询查询???既然有中断,还有DMA这种,还必须在主程序轮询是不是有点不合理???
如果我不在循环里调用spi_slave_transmit或spi_slave_queue_trans,只设置了 my_post_trans_cb(),是不是根本不会接收到数据?

Re: 再请教SPI的一个问题

Posted: Mon May 09, 2022 12:11 pm
by ESP_Yake
你看的应该是 demo, 我们的 demo 更多的是演示我们能实现的所有功能。
我来说明一下这两者接口
1,spi_slave_transmit()阻塞 这个是将数据挂载到底层,然后 SPI 硬件确定传输完成了之后会返回。
2,spi_slave_queue_trans() + spi_slave_get_trans_result() 前面的只是将 buffer 发送到 DMA,但是具体是否有传输完成还未知,spi_slave_get_trans_result就是确定传输完成。

my_post_trans_cb 和 my_post_setup_cb 的主要作用是保证 SPI master 传输数据之前 slave 这边都是有 buffer 挂载到 DMA 的,因为 slave 是受控端,但是如果 slave 不能同步给 master 状态,那么有可能出现 slave 上次接收的数据还没有处理,下次的数据就把 DMA 给刷掉,导致数据丢失。