登录 免费注册 首页 | 行业黑名单 | 帮助
维库电子市场网
技术交流 | 电路欣赏 | 工控天地 | 数字广电 | 通信技术 | 电源技术 | 测控之家 | EMC技术 | ARM技术 | EDA技术 | PCB技术 | 嵌入式系统
驱动编程 | 集成电路 | 器件替换 | 模拟技术 | 新手园地 | 单 片 机 | DSP技术 | MCU技术 | IC 设计 | IC 产业 | CAN-bus/DeviceNe

AT91SAM7S64串口PDC报"DATA ABORT"故障

作者:mytempid 栏目:ARM技术
AT91SAM7S64串口PDC报"DATA ABORT"故障

    现在我在应用串口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
参与讨论
昵称:
讨论内容:
 
 
相关帖子
有关AT91SAM7S64的中断嵌套启动文件的问题
哪位大侠知道油田测量系统的0-1500V,0-250A该如何测量?
有关nandflash/K9F1G08U0A的问题
往有数据的flash地址写数据
现在搞44B0的朋友还多吗?
免费注册为维库电子开发网会员,参与电子工程师社区讨论,点此进入


Copyright © 1998-2006 www.dzsc.com 浙ICP证030469号