初级会员

- 积分
- 136
- 金钱
- 136
- 注册时间
- 2020-1-15
- 在线时间
- 39 小时
|
1金钱
本帖最后由 叶孤城999 于 2020-5-30 20:46 编辑
UART的DMA我一般是用普通发送,DMA接收。
利用IDLE中断,DMA在后台默默接收,IDLE中断后进去收一波数据到内存,然后重置DMA继续。

这样的的话,做出来的UART驱动对上层就比较友好,发的时候是完整的一帧,收的时候也是完整的一帧。
至少不用一个BYTE就进一次中断,我个人比较讨厌这样。
但是SPI没有UART那样的IDLE中断寄存器啊。

SPI要用DMA的话,则是在读取FLASH这类芯片时,能够预知对面回复的数据长度。
比如我发送了读取N个数据,那我DMA的读取长度就设置为N。
如果对面的回复长度不能预知,又没有IDLE中断,只能利用DMA完成中断来判断,这样就不准确。
所以为认为
1、能预知对面回复长度的SPI通信场景,比如读取FLASH,AD之类的,可以用DMA,就不用循环读取数据。
2、如果对面的回复不可预计,比如两台MCU用SPI通信,数据包的长度是不定的,这时候用DMA就没有意义。
请问下各位大神,我的理解对吗?
HAL_StatusTypeDef HAL_SPI_Transmit(SPI_HandleTypeDef *hspi, uint8_t *pData, uint16_t Size, uint32_t Timeout);
HAL_StatusTypeDef HAL_SPI_Receive(SPI_HandleTypeDef *hspi, uint8_t *pData, uint16_t Size, uint32_t Timeout);
HAL_StatusTypeDef HAL_SPI_TransmitReceive(SPI_HandleTypeDef *hspi, uint8_t *pTxData, uint8_t *pRxData, uint16_t Size,uint32_t Timeout);
HAL_StatusTypeDef HAL_SPI_Transmit_IT(SPI_HandleTypeDef *hspi, uint8_t *pData, uint16_t Size);
HAL_StatusTypeDef HAL_SPI_Receive_IT(SPI_HandleTypeDef *hspi, uint8_t *pData, uint16_t Size);
HAL_StatusTypeDef HAL_SPI_TransmitReceive_IT(SPI_HandleTypeDef *hspi, uint8_t *pTxData, uint8_t *pRxData,uint16_t Size);
HAL_StatusTypeDef HAL_SPI_Transmit_DMA(SPI_HandleTypeDef *hspi, uint8_t *pData, uint16_t Size);
HAL_StatusTypeDef HAL_SPI_Receive_DMA(SPI_HandleTypeDef *hspi, uint8_t *pData, uint16_t Size);
HAL_StatusTypeDef HAL_SPI_TransmitReceive_DMA(SPI_HandleTypeDef *hspi, uint8_t *pTxData, uint8_t *pRxData,
|
-
-
|