你好:
我用的IC是LM4F231H5QR,系统想用UDAM进行UART的接收和发送,软件如下:
1. UART的初始化:
void UartInit(void)
{
ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_UDMA);
ROM_uDMAEnable();
ROM_uDMAControlBaseSet(ucControlTable);
uDMAChannelAssign(UDMA_CH17_UART3TX);
uDMAChannelAssign(UDMA_CH16_UART3RX);
/*** config the UART *************/
ROM_UARTConfigSetExpClk(UART3_BASE, ROM_SysCtlClockGet(), 115200,
UART_CONFIG_WLEN_8 | UART_CONFIG_STOP_ONE |
UART_CONFIG_PAR_NONE);
ROM_UARTFIFOLevelSet(UART3_BASE, UART_FIFO_TX4_8, UART_FIFO_RX4_8);
ROM_UARTEnable(UART3_BASE);
ROM_UARTDMAEnable(UART3_BASE, UART_DMA_RX | UART_DMA_TX);
/*********************************/
/** RX ***/
ROM_uDMAChannelAttributeDisable(UDMA_CHANNEL_ADC2,
UDMA_ATTR_USEBURST |
UDMA_ATTR_HIGH_PRIORITY |
UDMA_ATTR_REQMASK);
uDMAChannelControlSet(UDMA_CHANNEL_ADC2 | UDMA_PRI_SELECT,
UDMA_SIZE_8 | UDMA_SRC_INC_NONE | UDMA_DST_INC_8 |
UDMA_ARB_4);
ROM_uDMAChannelTransferSet(UDMA_CHANNEL_ADC2 | UDMA_PRI_SELECT,
UDMA_MODE_BASIC, (void *)(UART3_BASE + UART_O_DR),
rx_buffer,
sizeof(rx_buffer));
// ROM_uDMAChannelAttributeEnable(UDMA_CHANNEL_ADC2, UDMA_ATTR_USEBURST);
ROM_uDMAChannelEnable(UDMA_CHANNEL_ADC2);
/******* TX ********/
ROM_uDMAChannelAttributeDisable(UDMA_CHANNEL_ADC3,
UDMA_ATTR_USEBURST |
UDMA_ATTR_HIGH_PRIORITY |
UDMA_ATTR_REQMASK);
ROM_uDMAChannelControlSet(UDMA_CHANNEL_ADC3 | UDMA_PRI_SELECT,
UDMA_SIZE_8 | UDMA_SRC_INC_8 | UDMA_DST_INC_NONE |
UDMA_ARB_4);
ROM_uDMAChannelTransferSet(UDMA_CHANNEL_ADC3 | UDMA_PRI_SELECT,
UDMA_MODE_BASIC,
tx_buffer,(void *)(UART3_BASE + UART_O_DR),
sizeof(tx_buffer));
// ROM_uDMAChannelAttributeEnable(UDMA_CHANNEL_ADC3, UDMA_ATTR_USEBURST);
/***** when we want to send , then enable it *****/
// ROM_uDMAChannelEnable(UDMA_CHANNEL_ADC3);
/**************************************************************************************/
//
// Enable the UART peripheral interrupts. Note that no UART interrupts
// were enabled, but the uDMA controller will cause an interrupt on the
// UART interrupt signal when a uDMA transfer is complete.
//
ROM_IntEnable(INT_UART3);
}
对于上面的程序,如果我使能了卒发请求(图中红色背景),在接受256个字节的时候,后4个字节一直接收不到,后来我用:
data = ROM_UARTCharGet(UART3_BASE); 查看FIFO内的内容, 发现
后四个字节还在UART的FIFO里面,没有移入rx_buffer,如果我取消掉这个语句(图中红色背景),那么256个可以完整接收,而对于发送,似乎是否使能卒发请求(绿色背景部分),
都没什么影响。
我的问题是:
1. 对于我上面说到的情况,应如何解释?
2. 对于卒发请求,不是很理解,规格书看了也不大清楚,是否可以帮忙解释透彻一些?谢谢。
3. 在UDAM中,以UART为例,设定的FIFO的深度,同仲裁字节,他们的设定有没有什么根据?是否两个都要设成一样,如果不一样,情况如何?
A. 仲裁字节比FIFO多。
B. 仲裁字节比FIFO少。
4. 既然设定了仲裁的数目,那么系统如何实现可以一次传多个字节?以前认为每发生一次仲裁,系统就会中断一次,后来发现,我发送256个字节,
等发送完毕后,系统才中断一次。
5. 由于UART每次接收的字节数不一样,对于UDMA,能不能做到:在开始接收第一个数据开始,等一段时间,如果没有数据进来,系统产生中断(不用等到你
设定的字节数填充完了,才产生中断)。