|
|||||||||||
| 技術交流 | 電路欣賞 | 工控天地 | 數(shù)字廣電 | 通信技術 | 電源技術 | 測控之家 | EMC技術 | ARM技術 | EDA技術 | PCB技術 | 嵌入式系統(tǒng) 驅(qū)動編程 | 集成電路 | 器件替換 | 模擬技術 | 新手園地 | 單 片 機 | DSP技術 | MCU技術 | IC 設計 | IC 產(chǎn)業(yè) | CAN-bus/DeviceNe |
請教[UART發(fā)送數(shù)據(jù)沒有問題,接收到的數(shù)據(jù)都是0]的原因 |
| 作者:pupu_x 欄目:單片機 |
大家好啊,請教大家一個問題。 我用C8051F236單片機,用MAX3490作rs422接口芯片。 調(diào)試單片機程序時,發(fā)現(xiàn)單片機可以給計算機發(fā)送數(shù)據(jù),并且計算機收到的是正確的 但是計算機給單片機發(fā)送數(shù)據(jù)的時候,單片機可以進入中斷,收到數(shù)據(jù),但是收到的數(shù)據(jù)都是0 請問這是什么原因? 謝謝大家了。 單片機串口配置程序是: void UART_Init (void) { SCON = 0x50; // SCON0: mode 1, 8-bit UART, enable RX PCON |= 0x80; // SMOD=1 CKCON |= 0x10; // Timer1使用系統(tǒng)時鐘做時基 TH1 = -(SYSCLK/BAUDRATE/16); // Timer 1 High Byte TL1 = 0x00; // Timer 1 Low Byte TMOD |= 0x20; // Timer1采用8位自動重載計數(shù)器(模式2) TCON |= 0x50; // Timer CONTROL Register TR1 = 1; // Start Timer1 } void PORT_Init(void) { // 配置外設 PRT0MX = 0x01; // UART使能 PRT1MX = 0x00; // PRT1MX: Initial Reset VALUE PRT2MX = 0x41; // 禁止所有端口的弱上拉,使能SPI //配置端口輸出模式 // PORT configuration (1 = PUSH Pull OUTPUT) PRT0CF = 0x01; // TX采用PUSH pull模式輸出 PRT1CF = 0x00; // 其他端口都采用開漏輸出模式 PRT2CF = 0x10; // NSS采用PUSH pull,其他open-drain PRT3CF = 0x00; // // View PORT pinout // P0.0 = UART0 TX (PUSH-Pull OUTPUT)(DIGITAL) // P0.1 = UART0 RX (Open-Drain OUTPUT/Input)(DIGITAL) // P2.0 = SPI Bus SCK (Open-Drain OUTPUT/Input)(DIGITAL) // P2.2 = SPI Bus MOSI (Open-Drain OUTPUT/Input)(DIGITAL) // P2.4 = CS_SPI (Open-Drain OUTPUT/Input)(DIGITAL) } 這是我的端口初始化的程序。在初始化時,UART的tx使用PUSH-pull模式,rx采用open drain模式。在這里我比較困惑的時候,斷口弱上拉電阻該如何設置。 串口中斷程序中,我使用了定時器0作為串口通訊超時的定時器,如果在規(guī)定的時間間隔里沒有收到計算機發(fā)送來的一幀數(shù)據(jù)中的剩余數(shù)據(jù)時,就退出串口中斷程序,防止程序在中斷程序中等待而退不出來。 現(xiàn)在我的串口中斷程序能夠收到計算機通過rs422接口盒發(fā)送過來的數(shù)據(jù),但是數(shù)據(jù)都是0。串口發(fā)送到計算機,計算機能收到正確的數(shù)據(jù)。不知道這種情況是硬件的還是軟件的問題。 單片機的中斷服務程序如下: void UART0_ISR (void) interrupt 4 { uchar * tmp,counter; if( RI==1) { TH0 = 0x00; TL0 = 0x00; TR0 = 1; UART0Buf[0] = SBUF; RI = 0; while( RI==0 && UART0TimeOut==0); UART0Buf[1] = SBUF; RI = 0; while( RI==0 && UART0TimeOut==0); UART0Buf[2] = SBUF; RI = 0; tmp = &(UART0Buf[3]); counter = UART0Buf[2]; do { while( RI==0 && UART0TimeOut==0); *tmp = SBUF; tmp++; counter--; RI = 0; } while( UART0TimeOut==0 && counter!=0); if(!UART0TimeOut) { UART0Rx_Ok = 1; } TR0=0; } if(TI == 1) { TI = 0; UART_Sending_Flag = 1; } } |
| 2樓: | >>參與討論 |
| 作者: NE5532 于 2006/12/17 16:57:00 發(fā)布:
你的串口中斷服務函數(shù)寫得太糟了 定時器是自動加載,不需要你關心。你先調(diào)試接收1個字節(jié)的程序,通了再調(diào)這個接收多個字節(jié)的,否則不容易找到問題。 |
|
| 3樓: | >>參與討論 |
| 作者: pupu_x 于 2006/12/17 17:11:00 發(fā)布:
謝謝,我先調(diào)試單字節(jié)接收 謝謝您的提醒,我先調(diào)試單字節(jié)收發(fā)能否正確。一般這種問題是硬件方面的還是軟件? |
|
| 4樓: | >>參與討論 |
| 作者: NE5532 于 2006/12/18 12:20:00 發(fā)布:
單字節(jié)不對一般就去找相關寄存器的設置問題了 |
|
|
|
| 免費注冊為維庫電子開發(fā)網(wǎng)會員,參與電子工程師社區(qū)討論,點此進入 |
Copyright © 1998-2006 m.58mhw.cn 浙ICP證030469號 |