前言:搞過很長時間的stm32 了,但是一直沒有深入的研究底層,iic方面之前多是作為主機 ,而且多是使用io口模擬的,網上在這方面有用的東西確實不多,由于作業需要學習了下iic硬體從機的使用,使用cube創建工程,hal庫,上次用cube還是三年前,調iic從機陷入困境,經老大指導再次用起,結果~真香,,但是要注意移植的時候的坑點
任務目標:先介紹下目標任務-----樹莓派與32通過iic雙向實時通信(本文做到樹莓派能檢測到32從機的ID地址即可),32作為下位機,所以是從機了,實作方法有軟體模擬和硬體iic,
軟體模擬iic從機沒試過,因為這次試用硬體iic通過了就沒必要試驗了,但是估計也行,用中斷來實作,借助時序圖寫下思路,下次需要時可據此快速開發,可以將SDA設定為外部io中斷,跳變沿觸發,觸發后檢測sda電平高低,根據高低可以判斷是開始還是結束,只要知道是開始就可以了,后面要做的就是根據iic的時序圖寫出自己的接收發送程式,細節可以自行研究實作,
基礎知識補充一:iic通信中有三種信號
開始信號:SCL高時,SDA從高變為低
結束信號:SCL高時,SDA從低變為高
應答信號:資料接收端收到8bit資料后要發送應答信號ACK
注意:開始信號必須有,結束與應答可以沒有,iic通信只能由主機主動發起,即使主機從從機讀取資料也要由主機先發送獲取指令,
基礎知識補充二:IIC總線的資料傳送
IIC總線上的每一個設備都可以作為主設備或者從設備,而且每一個設備都會對應一個唯一的地址(地址通過物理接地或者拉高),主從設備之間就通過這個地址來確定與哪個器件進行通信,在通常的應用中,我們把CPU帶I2C總線介面的模塊作為主設備,把掛接在總線上的其他設備都作為從設備,
也就是說,主設備在傳輸有效資料之前要先指定從設備的地址,地址指定的程序和上面資料傳輸的程序一樣,只不過大多數從設備的地址是7位的,然后協議規定再給地址添加一個最低位用來表示接下來資料傳輸的方向,0表示主設備向從設備寫資料,1表示主設備向從設備讀資料,
- 主設備往從設備中寫資料,資料傳輸格式如下:
淡藍色部分表示資料由主機向從機傳送,粉紅色部分則表示資料由從機向主機傳送,
寫用0來表示(高電平),讀用1來表示(低電平),
- 主設備從從設備中讀資料,資料傳輸格式如下:
這里圖顏色和程序上面寫資料不同,讀之后的應答由從機產生,之后的資料也是從機的,再之后的應答是主機的,
基礎知識補充三:cubemx建立工程全步驟
參考:https://mp-new.csdn.net/mp_blog/creation/editor/117856825
主要操作:
1.cube中設定iic引數,注意地址填多少地址就是多少,但是程式初始化中不會是這個數,因為還有別的1位

2.設定iic中斷

3.修改代碼----只有cube的初始化的話主機無法檢測從機,無法進iic接收中斷(主回圈寫輪詢接收也可以實作主機的檢測與資料接收)
(1)iic初始化中加這個接收函式,否則不進中斷---------串口通信uart初始化同理,不清楚其他中斷等方式,需要注意
HAL_I2C_Slave_Receive_IT(&hi2c2, (uint8_t *)aRxBuffer_iic, 1);

(2)接收中斷添加這句話,不加下次應該進不來中斷

(3)自此能把資料存進aRxBuffer_iic陣列了,主機(比如樹莓派能檢測到已經掛載的從機了)
編外:樹莓派查看iic設備指令sudo i2cdetect -y 1
如40就是個從機ID,就是cubemx中設定的從機地址,沒有的話檢查硬體連接,或者看iic選擇器是否跳轉到對應的通道
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/287463.html
標籤:其他
