最近想用 armink 的 SFUD 库代替原本自己写的 SPI FLASH 驱动库,他的支持似乎更全面更标准。
驱动 SPI 时有如下两种方式连续收发数据
[C] 纯文本查看 复制代码 HAL_SPI_Transmit_DMA(spi_dev->spix, (uint8_t *)write_buf, write_size); // SPI发送data中的数据
HAL_SPI_Receive_DMA(spi_dev->spix, (uint8_t *)read_buf, read_size); // SPI读取data中的数据
[C] 纯文本查看 复制代码 HAL_SPI_Transmit(spi_dev->spix, (uint8_t *)write_buf, write_size, 1000); // SPI发送data中的数据
HAL_SPI_Receive(spi_dev->spix, (uint8_t *)read_buf, read_size, 1000); // SPI读取data中的数据
因为 hal 库的限制,使用 DMA 方式时,发送通道还没有完成,调用接收通道时会报 HAL_BUSY,无法及时打开接收通道。
如果 while 死等发送通道完毕,那似乎用不用 DMA 也没有太大区别。
这个地方有没有比较好的方法进行处理呢?
想到一个解决方法是利用 RTOS 的信号量,发送 DMA 的结束回调可以给出这个信号量,再立即开启接收通道。但是这样做,是否给出信号量、是否后续还有接收,是不同的处理,导致发送 DMA 的结束回调并不一致。
因为原本自己的库是开通了足够大的全局 buffer 以供发送通道填充 DUMMY 也就是 0xFF,可以直接使用 TransmitReceive_DMA ,而 SFUD 到处都是临时数组,不敢直接开 TransmitReceive_DMA 。
|