最近調STM8的I2C簡直是爽呆呆,一直不成功,收不到從機寄存器的數據,最后終于完成,究其原因可以總結為以下幾個方面:
1、I2C配置問題,一定要注意配置問題,特別的是I2C的時鐘,SCL時鐘的高低電平占空比,如果采用100kHz,占空比為1:1,若為400KHz,高低占空比為1:2,配置好之后直接應答使能,方便后面通訊過程。注意配置好之后,程序運行到這里SCL和SDA就會置1,并且能用電壓表和示波器查看電壓和波形;一定要去ST官網下載資料查看寄存器的配置,否則容易出錯。
2、I2C讀數據通訊過程一定是包含這樣幾個過程:起始位,判斷CR1_SB,發送從機地址(7bit+1bit寫操作),判斷ADDR,讀SR3清寄存器,發數據,判斷BTF是否成功發送,重復起始,再讀SB,讀操作,ADDR,SR3,判斷RXNE,保存接收數據,最后結束位和重新應答使能;適當的加nop延遲,I2C來不及應答,注意不要多操作也不要少操作,嚴格按照流程來,不然就會出錯。只要寫能成功,讀肯定沒問題。
3、通過I/O口實現模擬I2C通訊,若實在是I2C硬件功能調不通,可先用對應的I/O模擬出I2C的通訊過程。編程也是按照I2C通訊協議一步步走,不要漏掉和多出什么,否則容易出錯。基本過程如下:1.配置系統時鐘(關鍵,時鐘決定了I2C通訊的速率);2.配置延時程序(這一點必須配置好,否者無法通訊成功);3.I2C初始化程序;4.起始信號程序;5.結束信號程序;6.接收從機應答程序(給從機一個應答位,保證接收到應答才能進行下一步操作);7.主機發送ack和Nack程序;8.檢測是否接收到應答(對應第6步,保證I2C數據傳輸正確,也可不要)9.寫一個字節程序;10.讀一個字節程序。
將所有的這些程序編寫好之后就能按照I2C通訊過程進行調用和編寫,網上程序很多可以對著看,就不貼源代碼了。
|