微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 无线和射频 > TI无线射频设计 > SerialApp - UART DMA接收

SerialApp - UART DMA接收

时间:12-22 整理:3721RD 点击:

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初始化看過了 還是不懂 可以說明仔細點嗎?

我就是這段也看不明白才問 能回答嗎?

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top