关于CC2541 uart驱动的问题
时间:10-02
整理:3721RD
点击:
看hal里面的UART DMA驱动如下定义:
#define HAL_UART_DMA_NEW_RX_BYTE(IDX) ((uint8)DMA_PAD == HI_UINT16(dmaCfg.rxBuf[(IDX)])) #define HAL_UART_DMA_GET_RX_BYTE(IDX) (*(volatile uint8 *)(dmaCfg.rxBuf+(IDX))) #define HAL_UART_DMA_CLR_RX_BYTE(IDX) (dmaCfg.rxBuf[(IDX)] = BUILD_UINT16(0, (DMA_PAD ^ 0xFF)))
检测有没有RX到数据是通过判断rxBuf的高字节是否等于DMA_PAD,那么请问,这个高字节是DMA在接收到8bit数据后自动将高字节异或吗?
因为看到清空这个高字节时是赋值了一个DMA_PAD^0xFF。如果不是DMA自动将高字节进行异或,那这种宏写法的意图是什么?
参考HalUARTInitDMA()里面的注释
/* The trick is to cfg DMA to xfer 2 bytes for every 1 byte of Rx.
* The byte after the Rx Data Buffer is the Baud Cfg Register,
* which always has a known value. So init Rx buffer to inverse of that
* known value. DMA word xfer will flip the bytes, so every valid Rx byte
* in the Rx buffer will be preceded by a DMA_PAD char equal to the
* Baud Cfg Register value.
*/
and the code:
(void)memset(dmaCfg.rxBuf, (DMA_PAD ^ 0xFF), HAL_UART_DMA_RX_MAX * sizeof(uint16));
懂了,谢谢哈
如果有帮助,请确认一下。
