1. 程式人生 > >STM32硬體IIC與51模擬IIC通訊

STM32硬體IIC與51模擬IIC通訊

IIC介紹

  IIC協議規定:SDA上傳輸的資料必須在SCL為高電平期間保持穩定,SDA上的資料只能在SCL為低電平期間變化。IIC期間在脈衝上升沿把資料放到SDA上,在脈衝下降沿從SAD上讀取資料。這樣的話,在SCL高電平期間,SDA上的資料是穩定的。在脈衝下降沿之後的保持時間以後,SDA上的資料可以變化,直到脈衝上升沿之前。

STM32與51 IIC通訊實驗

  下面是在使用51模擬IIC作為主機、STM32硬體IIC作為從機時發生的一些問題:

  • STM32地址不匹配:
      1、STM32工作為從機接收器模式下時,STM32設定IIC地址為0x0A但是I2C_OAR1暫存器中的地址為0x05,所以51傳送地址時,應該傳送0x05,通過移位之後在最後一位加上R/W位,如果在最後以為加上0表示向STM32傳送資料,STM32產生I2C_EVENT_SLAVE_RECEIVER_ADDRESS_MATCHED/* BUSY and ADDR flags */事件
      2、STM32工作為從機發送器模式下時,在接受地址之後,進入的是I2C_EVENT_SLAVE_RECEIVER_ADDRESS_MATCHED/* BUSY and ADDR flags /事件中斷,而不是I2C_EVENT_SLAVE_TRANSMITTER_ADDRESS_MATCHED/

    TRA, BUSY, TXE and ADDR flags */事件中斷,是由於TRANSMITTER這個標誌中包含了RECEIVER標誌的暫存器中的位,所以當TRANSMITTER放在RECEIVER之後的話,會提前進入RECEIVER事件中斷,而無法進入TRANSMITTER事件中斷;

  • STM32無法正確返回ACK訊號的原因:
      1、當從機不能響應從機地址時(例如它正忙於其他事而無法響應IIC匯流排的操作,或者這個地址沒有對應的從機),在第9個SCL週期內SDA線沒有拉低,即沒有ACK訊號。這時,主機發出一個P訊號終止傳輸或者重新發出一個S訊號開始新的傳輸。
      2、如果從機接收器在傳輸過程中不能接收更多的資料時,它不會發出ACK訊號。這樣,主機就可以意識到這點,從而發出一個P訊號終止傳輸或者重新發出一個S訊號開始新的傳輸。
      3、主機接收器在接收到最後一個位元組後,也不會發出ACK訊號。於是,從機發送器釋放SDA線,以允許主機發出P訊號結束傳輸。

  • STM32只能夠返回一個ACK訊號的原因:
      1、STM32工作為從機接收器模式下時,在接收到地址後觸發I2C_EVENT_SLAVE_RECEIVER_ADDRESS_MATCHED/* BUSY and ADDR flags */事件,但是沒有清除ADDR標誌位;
      2、STM32工作為從機接收器模式下時,在收到資料之後觸發I2C_EVENT_SLAVE_BYTE_RECEIVED/* BUSY and RXNE flags */事件,但是沒有清除RXNE標誌位;