近日公司的項目重心要往米思齊的Arduino圖形化編程上轉移了,須要我將STM32和Arduino的IIC通信調通。以前Arduino並沒怎麼使用過,僅僅是將超聲波的代碼移植成TOF激光測距而已。網上並沒見到STM32與Arduino的IIC通信實例,惟一的線索是APM中有這部分代碼,由於APM的超聲波模塊與飛控之間是有一個Arduino芯片進行信息交互的,而飛控與Arduino的通信方式就是IIC。編程
在直接使用以前MPU6050的IIC協議與Arduino進行通信無反應以後,懶得去查看APM源碼找其IIC驅動,因此直接上邏輯分析儀分析波形,把飛控讀取Arduino的超聲波數據的波形採集進行分析。ui
上圖即APM飛控做爲IIC主設備讀取一次Arduino數據的過程。一開始我極爲迷惑的是,Arduino做爲從設備代碼中設置的從設備地址是0x70,爲何到這裏讀取的指令變成了0xE1?調試到最後恍然大悟:地址是7位的數據,最後一位是用來標誌讀寫指令的。0x70的二進制編碼是 0111 0000,實際IIC主設備的會將地址放在高位,即將其左移一位變成 1110 0000,而後最後一位置1的話就是讀取0x70地址的命令,置0的話是寫0x70的命令。編碼
根據波形來看,發送讀取命令以後並不須要發送讀取的地址,這一點和MPU6050是不一樣的,由於MPU6050緊接着須要發送讀取的地址,從這裏看來每一個不一樣的設備都有不一樣的IIC協議的規則,須要具體查閱手冊。後面的寫命令比較疑惑,不知道是出於什麼目的須要將0x51寫入Arduino。調試
上圖爲我使用STM32與Arduino進行IIC採集到的波形。blog