請問各位
當我下達讀取設備指令後
要如何去判斷從設備有資料回覆?
以下是我下達讀取的方式..
UCB3CTL1 &= ~UCTR;
UCB3CTL1 |= UCTXSTT;
while( !(UCB3IFG & UCTXIFG));
while( !(UCB3IFG & UCRXIFG));
BUFF[0] = UCB3RXBUF;
while( !(UCB3IFG & UCRXIFG));
BUFF[1] = UCB3RXBUF;
UCB3CTL1 |=UCTXNACK; // 發送停止位和NACK位 UCB3CTL1 |=UCTXSTP;
上面這些代碼 我比較想知道
while( !(UCB3IFG & UCRXIFG)); 這行的用意到底是不是真的能確保讀取資料的完整性?
我看資料文件有提到說當UCBxRXBUF被讀取後UCRXIFG會被自動重置
這樣寫能否確定可以連續讀取兩個從設備的的回傳資料?
感謝回覆
Jefferey Chiu:
Hi, Cpo
能不能先讓我知道你是用MSP430那一個料號?
謝謝.
Chen pochi:
回复 Jefferey Chiu:
很抱歉 沒說明是使用哪款….
我使用的是MSP430F5436
感謝回覆
Edward Hsiung:
回复 Chen pochi:
CPO您好,
1.關於是否能確保資料的完整性:當RxBUFFER收到資料時,UCRxIFG會被設為1while( !(UCB3IFG & UCRXIFG)); while迴圈才能跳出繼續執行下面的程式2.關於要接收多個從設備:我想你必須使用另外一組I2C,MSP430F5436應該有四組的I2C可以用似乎只有在MSP430當MASTER,並且為發送端時才能用同一組的I2C去指定SLAVE ADDRESS可參考下面這網址:http://e2e.ti.com/support/microcontrollers/msp43016-bit_ultra-low_power_mcus/f/166/t/105944.aspx
Chen pochi:
回复 Edward Hsiung:
Hsiung 您好,
很感謝您的回覆
對於資料完整性 我發現我遇到另一種奇怪現象
以下片段程式碼是指發送讀取指令至設備並且讀回兩byte資料,
UCB3CTL1 &= ~UCTR; UCB3CTL1 |= UCTXSTT;while( !(UCB3IFG & UCTXIFG));while( !(UCB3IFG & UCRXIFG));BUFF[0] = UCB3RXBUF; // 讀取第一個bytewhile( !(UCB3IFG & UCRXIFG));BUFF[1] = UCB3RXBUF; // 讀取第二個byteUCB3CTL1 |=UCTXNACK; // 發送停止位和NACK位 UCB3CTL1 |=UCTXSTP;
當程式執行完一次後,UCB3RXBUF並沒有被清除掉,導致 第二次執行該命令時
BUFF[0] 會讀到前一次回圈中的UCB3RXBUF的值
這個問題讓我很困惑,當我在這個命令前加入UCB3RXBUF=0; 所有動作才看起來正常?
請問為甚麼會這樣?
感謝回覆
Triton Zhang:
回复 Chen pochi:
按照Datasheet上的说法,UCRXIFG位应该在读UCBxRXBUF之后就被reset, 从你上面的描述看BUFF[0] = UCB3RXBUF 这个语句并未reset UCRXIFG.
1. BUFF[] 这个数组只有赋值,没有使用,一定优化级别的编译器可能会把BUFF[0] = UCB3RXBUF 这句话给优化掉,你可以打开汇编的代码看下这句话是否有被编译器优化掉.
2. UCB3RXBUF=0; 这句话按照数据手册上描述应该是非法的,UCB3RXBUF寄存器是RO寄存器,对它赋值应该是不成功的,而且即使你能给UCB3RXBUF赋值0,也不能代表I2C的RXBUF为空,从而触发RESET UCRXIFG。<0值并不是空>。 所以我建议你在UCB3RXBUF=0; 这个语句位置加上一个延时,看一下问题是否依然存在.
3. UCRXIFG 标志位是WR,即可读写的,为了确保操作正确你可以用软件清零UCRXIFG标志位。
Chen pochi:
回复 Triton Zhang:
您好:
1.BUFF[]這個數值在經過取值後, 是有經過運算後將值傳遞出去, 如下
heading= (BUFF[0]<< 8) | (BUFF[1]); return heading;
所以應該會將UCRXIFG清除
2.我曾經嘗試過延遲一段時間在讀取,依舊無法解決問題
3.是否將UCRXIFG清零後UCBxRXBUF就會被重置? .因為我有透過示波器去看.動作上都正常就是UCBxRXBU硬是被延遲一個時程((僅第一次執行時正常)
感謝回覆
Edward Hsiung:
回复 Chen pochi:
Dear Cpo,應該是當RxBUF滿的時候,UCRXIFG會被設為1,通知CPU去讀RxBUF的資料當CPU開始讀RxBUF的資料時,UCRXIFG會自動設為0在CPU讀完RxBUF後,RxBUF應該就是空的了