|
技术交流 | 电路欣赏 | 工控天地 | 数字广电 | 通信技术 | 电源技术 | 测控之家 | EMC技术 | ARM技术 | EDA技术 | PCB技术 | 嵌入式系统 驱动编程 | 集成电路 | 器件替换 | 模拟技术 | 新手园地 | 单 片 机 | DSP技术 | MCU技术 | IC 设计 | IC 产业 | CAN-bus/DeviceNe |
AT91SAM7S64串口PDC报"DATA ABORT"故障 |
作者:mytempid 栏目:ARM技术 |
现在我在应用串口1的PDC时发现串口通讯会造成程序产生"Data abort"故障。 一般通讯1分钟内就会出现一次"Data abort"故障。 由于初次使用,目前尚未查出问题。请两位帮忙看看代码有无疏漏。 谢谢! 代码如下: // 中断服务部分 void serial1_handler(void) { unsigned int status; unsigned SHORT txd_len; AT91S_PDC *pUSART1_PDC = (AT91S_PDC *)&(pUSART1->US_RPR); // get Usart status register status = pUSART1->US_CSR; if ( status & AT91C_US_ENDTX) { // 发送结束,使能接收 // Clear ENDTX flag, PDC_TCR写大于1的值能清除ENDTX标志 pUSART1_PDC->PDC_PTCR = AT91C_PDC_TXTDIS; pUSART1_PDC->PDC_TCR = 2; // Open UART1 PDC-RX,各寄存器赋值 pUSART1->US_CR = AT91C_US_STTTO; // Start Time-out pUSART1_PDC->PDC_PTCR = AT91C_PDC_RXTDIS;// Disable PDC-Rx pUSART1_PDC->PDC_RPR = (unsigned int)uart1_RxBuff; pUSART1_PDC->PDC_RCR = USART1_RxBuf_LEN; pUSART1_PDC->PDC_RNPR = 0; pUSART1_PDC->PDC_RNCR = 0; pUSART1_PDC->PDC_PTCR = AT91C_PDC_RXTEN;// Enable PDC-Rx } if ( status & AT91C_US_TIMEOUT) { // 关闭接收 pUSART1->US_PTCR = AT91C_PDC_RXTDIS; // 处理数据 txd_len = ModbusPrs(); if (txd_len >= MD_MIN_TX_LEN) { pUSART1_PDC->PDC_TPR = (unsigned int) uart1_TxBuff; pUSART1_PDC->PDC_TCR = txd_len; pUSART1_PDC->PDC_RNPR = 0; pUSART1_PDC->PDC_RNCR = 0; pUSART1_PDC->PDC_PTCR = AT91C_PDC_TXTEN;// Enable PDC-Tx } else { // Open UART1 PDC-RX pUSART1->US_CR = AT91C_US_STTTO; // Start Time-out pUSART1_PDC->PDC_PTCR = AT91C_PDC_RXTDIS; pUSART1_PDC->PDC_RPR = (unsigned int)uart1_RxBuff; pUSART1_PDC->PDC_RCR = USART1_RxBuf_LEN; pUSART1_PDC->PDC_RNPR = 0; pUSART1_PDC->PDC_RNCR = 0; // Receive Next Counter Register pUSART1->US_PTCR = AT91C_PDC_RXTEN; } } pUSART1->US_CR = AT91C_US_STTTO | // Start Time-out AT91C_US_RSTSTA; // Reset the status bit } // USART1初始化部分 //================================================================== void init_serial1 (void) // Initialize Serial Interface { AT91S_AIC *pAIC = AT91C_BASE_AIC; AT91S_PDC *pUSART1_PDC = (AT91S_PDC *)&(pUSART1->US_RPR; *AT91C_PIOA_PDR = AT91C_PA21_RXD1 | // Enable RxD1 Pin AT91C_PA22_TXD1 | // Enalbe TxD1 Pin AT91C_PA24_RTS1; // Enalbe RTS1 Pin pUSART1->US_CR = AT91C_US_RSTRX | // Reset RECEIVER AT91C_US_RSTTX | // Reset Transmitter AT91C_US_RXDIS | // RECEIVER Disable AT91C_US_TXDIS; // Transmitter |
|
|
免费注册为维库电子开发网会员,参与电子工程师社区讨论,点此进入 |
Copyright © 1998-2006 www.dzsc.com 浙ICP证030469号 |