SerialApp - UART DMA接收
static uint16 HalUARTReadDMA(uint8 *buf, uint16 len)
{
uint16 cnt;
for (cnt = 0; cnt < len; cnt++)
{
if (!HAL_UART_DMA_NEW_RX_BYTE(dmaCfg.rxHead))
{
break;
}
*buf++ = HAL_UART_DMA_GET_RX_BYTE(dmaCfg.rxHead); //dmaCfg.rxHead在哪裡初始化的呢
HAL_UART_DMA_CLR_RX_BYTE(dmaCfg.rxHead); //讀完之後就清零了嗎?
if (++(dmaCfg.rxHead) >= HAL_UART_DMA_RX_MAX)
{
dmaCfg.rxHead = 0;
}
}
PxOUT &= ~HAL_UART_Px_RTS; // Re-enable the flow on any read.
return cnt;
}
#define HAL_UART_DMA_NEW_RX_BYTE(IDX) (DMA_PAD == HI_UINT16(dmaCfg.rxBuf[(IDX)]))
這裡有一個不明白的地方:在初始化的時候rxBuf中填充的是DMA_PAD^0xFF,為什麼將HI_UINT16(dmaCfg.rxBuf[(IDX)與DMA_PAD比較,且兩者相同時就說明rxBuf中有數據了。然後就是每次串口接收數據將其發送到rxBuf中某個內存的低地址還是高地址,this is a problem!
另外,HAL_UART_DMA_NEW_RX_BYTE(dmaCfg.rxHead))這句話很詭異,似乎是當串口收到數據後,DMA自動將數據搬到damCfg.rxBuf中
請問是哪一個 function 自動數據搬到damCfg.rxBuf中
DMA直接内存访问,就是不需要MCU参与,有相应事件就实现数据搬移。CC2530有很多事件与DMA关联,仔细看看数据手册和DMA初始化的部分。
程序中的注释
/* 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.
*/
數據手冊是指哪一個? 我找很久都沒看到
DMA初始化看過了 還是不懂 可以說明仔細點嗎?
我就是這段也看不明白才問 能回答嗎?