|
|||||||||||
| 技術(shù)交流 | 電路欣賞 | 工控天地 | 數(shù)字廣電 | 通信技術(shù) | 電源技術(shù) | 測控之家 | EMC技術(shù) | ARM技術(shù) | EDA技術(shù) | PCB技術(shù) | 嵌入式系統(tǒng) 驅(qū)動編程 | 集成電路 | 器件替換 | 模擬技術(shù) | 新手園地 | 單 片 機(jī) | DSP技術(shù) | MCU技術(shù) | IC 設(shè)計(jì) | IC 產(chǎn)業(yè) | CAN-bus/DeviceNe |
AT91SAM7S64串口PDC報"DATA ABORT"故障 |
| 作者:mytempid 欄目:ARM技術(shù) |
現(xiàn)在我在應(yīng)用串口1的PDC時發(fā)現(xiàn)串口通訊會造成程序產(chǎn)生"Data abort"故障。 一般通訊1分鐘內(nèi)就會出現(xiàn)一次"Data abort"故障。 由于初次使用,目前尚未查出問題。請兩位幫忙看看代碼有無疏漏。 謝謝! 代碼如下: // 中斷服務(wù)部分 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) { // 發(fā)送結(jié)束,使能接收 // Clear ENDTX flag, PDC_TCR寫大于1的值能清除ENDTX標(biāo)志 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) { // 關(guān)閉接收 pUSART1->US_PTCR = AT91C_PDC_RXTDIS; // 處理數(shù)據(jù) 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 |
|
|
| 免費(fèi)注冊為維庫電子開發(fā)網(wǎng)會員,參與電子工程師社區(qū)討論,點(diǎn)此進(jìn)入 |
Copyright © 1998-2006 m.58mhw.cn 浙ICP證030469號 |