會員登陸
帳號:

密碼:

記住我



忘記密碼?

現在註冊!
網站導航
最新下載
訪問統計 (自2012/5/3)


正在流覽:   1 名訪客





PIC32MX370F512L UART1 TX flag 清除無效
中級會員
註冊日期:
2008/01/25 17:50
來自 台北
所屬群組:
註冊會員
文章: 42
等級: 5; EXP: 27
HP : 0 / 106
MP : 14 / 3090
離線
請教先進,

如題。才致能U1TX,程式就一直進入中斷,形成一個無窮迴路。請問有無解法?BAUD設定正確,波形輸出正常,在示波器上量過。但是旗標無法清為0。謝謝指正!

程式如下:

void __ISR(_UART_1_VECTOR, IPL2SOFT) Uart1Handler(void)
{
if (IFS1bits.U1RXIF) {
U1RxBuffer = U1RXREG;
IFS1bits.U1RXIF = 0;
}

if (IFS1bits.U1TXIF) {
IFS1bits.U1TXIF = 0;
// 一直進入中斷,旗標清除無效
}
}


void U1Setup(void) {

U1BRG = 80000000 / 115200 / 16 - 1;
U1STA = 0;
U1MODEbits.ON = 1;
U1MODEbits.ABAUD = 0;
U1MODEbits.IREN = 0;
U1MODEbits.LPBACK = 0;
U1MODEbits.PDSEL = 0;
U1MODEbits.RTSMD = 1;
U1MODEbits.RXINV = 0;
U1MODEbits.SIDL = 0;
U1MODEbits.STSEL = 0;
U1MODEbits.UARTEN = 1;
U1MODEbits.UEN = 0;
U1MODEbits.USIDL = 0;
U1MODEbits.WAKE = 0;

U1STAbits.ADDEN = 0;
U1STAbits.UTXISEL = 2;
U1STAbits.UTXINV = 0;
U1STAbits.URXEN = 1;
U1STAbits.UTXBRK = 0;
U1STAbits.UTXEN = 1;
U1STAbits.URXISEL = 0;
U1STAbits.ADDEN = 0;
U1STAbits.OERR = 0;

IPC7bits.U1IP = 2;
IPC7bits.U1IS = 0;
IFS1bits.U1RXIF = 0;
IEC1bits.U1RXIE = 1;
IFS1bits.U1TXIF = 0;
IEC1bits.U1TXIE = 1;
_nop();
_nop(); // 無法執行到這條指令
}

5月05日 18:14:10
轉換PDF檔 列印


Re: PIC32MX370F512L UART1 TX flag 清除無效
資深會員
註冊日期:
2007/11/05 08:29
所屬群組:
註冊會員
文章: 204
等級: 13; EXP: 32
HP : 0 / 308
MP : 68 / 9102
離線
UxTXIF 的用法不是你想像的那樣

UTXISEL<1:0>: TX Interrupt Mode Selection bits
11 = Reserved, do not use
10 = Interrupt is generated and asserted while the transmit buffer is empty
01 = Interrupt is generated and asserted when all characters have been transmitted
00 = Interrupt is generated and asserted while the transmit buffer contains at least one empty space

根據 UTXISEL 的設定 傳送的緩衝區沒資料或還有空間 UxTXIF 就會被觸發 他那是自動的 你去清成零 並沒有用

5月05日 18:28:37
轉換PDF檔 列印


Re: PIC32MX370F512L UART1 TX flag 清除無效
中級會員
註冊日期:
2008/01/25 17:50
來自 台北
所屬群組:
註冊會員
文章: 42
等級: 5; EXP: 27
HP : 0 / 106
MP : 14 / 3090
離線
感謝 timijk。我再試試看其他二個設定。

5月07日 19:18:28
轉換PDF檔 列印


Re: PIC32MX370F512L UART1 TX flag 清除無效
版主
註冊日期:
2004/04/30 10:53
來自 CAE, Microchip
所屬群組:
站務管理者
註冊會員
MICROCHIP
文章: 14184
等級: 72; EXP: 56
HP : 1073 / 1789
MP : 4728 / 71251
離線
UART 的接收,建議一定要用中斷接收方式。

但 UART 的傳送? 對初學者來說建議不要使用中斷傳送模式。

因為 TXIF 只要 Tx FIFO 一有空位就會設成 1 進入中斷模式要你將下一個資料填進 Tx FIFO 裡做資料的傳送。
注意: TXIF 並不是指資料已經傳送完畢才設成 1 的,TXIF 是代表我有空位可以將資料傳給 Tx 的 FIFO 。

如果要採用中斷方式來傳送資料,你必須建立一個 Ring-Buffer 的資料結構,先將資料填到 Ring-Buffer 後再啟動 TXIE 做中斷的傳輸。


底下程式摘自教育訓練: MCC201 v1.00 MPLAB Code Configurator New! 的 Page 134 :euasrt1.c 傳送程式解說
範例是用 PIC18F45K22 ,但原理事一樣的。


void EUSART1_Write
(uint8_t txData)
{
    while(
0 == eusart1TxBufferRemaining)  // 檢查 Tx Ring Buffer 是否還有暫存資料
    
{  // 沒有,在這裡輸入您的程式
    
}

    if (
0 == PIE1bits.TX1IE)    // 中斷傳輸模式是否開啟?
    
{
        
TX1REG = txData;    // 沒有使用中斷模式傳輸,送出傳輸資料,
    
}            // 這裡沒有做TX Busy 的檢查,所以呼叫者要做
    
else
    {            
// 使用中斷傳輸模式
        
PIE1bits.TX1IE = 0;
        
eusart1TxBuffer[eusart1TxHead++] = txData;    // 資料寫到 Tx Ring Buffer 裡
        
if (sizeof(eusart1TxBuffer) <= eusart1TxHead)    // 檢查索引值是否到頂了
        
{
            
eusart1TxHead = 0;            // 索引值到頂,歸零
        
}
        
eusart1TxBufferRemaining--;
    }
    
PIE1bits.TX1IE = 1;        // 啟動傳輸中斷
}

5月09日 17:54:51
轉換PDF檔 列印


Re: PIC32MX370F512L UART1 TX flag 清除無效
中級會員
註冊日期:
2008/01/25 17:50
來自 台北
所屬群組:
註冊會員
文章: 42
等級: 5; EXP: 27
HP : 0 / 106
MP : 14 / 3090
離線
感謝 Ryang、timijk的回答與解釋。
不論哪種模式,實驗時,U1TXIF一直ON。正如timijk所說,是認知問題。後來修改程式後,可以正常執行了。
再次感謝二位。

5月11日 14:18:48
轉換PDF檔 列印






無法在此發表文章
可以在此觀看文章
無法回覆文章
無法編輯自己的文章
無法刪除自己的文章
無法發起投票調查
無法在此投票
無法上傳附加檔案
無法不經審核直接發表文章

[進階搜尋]


搜尋
Microchip連結

網頁捷徑
2017 Summer Elite 報名
教育訓練
其它網站連結
電話: 02-25000405
產品技術問題產品技術支援專線:0800-717718 台北02-25088600 新竹03-5778366 Ext. 8600 高雄07-2137830 MicrochipDIRECT 專線: 07-2137830
Powered by XOOPS © 2001-2012 The XOOPS Project