iic通訊的深入理解(主從裝置通訊)
雖然之前也研究了先iic同行基本的時序你弄明白了,可是在機子寫at24c02驅動的時候由於理解不夠透徹出了點問題。
一.寫資料
24c02的寫入資料,可以看到主從裝置iic中寫的過程:起始訊號->器件地址(7位地址加一個讀寫位)->等待應答->要操作記憶體的地址->等待應答->寫入資料->等待應答->停止
時序圖:
程式碼:
可是上面的程式中箭頭所指的位置可以看出我們在一個write函式中傳送了兩次起始訊號。
第一次起始訊號之後我們只是定址了從裝置地址(就像是配對)配對完我們給了要寫入資料的地址然後給了一個開始訊號。
第二次起始訊號後由於我們沒有嚴格按照上面的通訊協議(寫器件地址)就直接傳送資料由於此時我們沒有定址從器件地址(配對)那麼我們直接寫資料是無法成功的。
那麼有人會納悶了我們之前不是寫入地址了嗎怎麼會無法寫入資料了。
答案就是:你太弱了,沒有理解24c04讀寫時序圖(在編寫iic通訊器件驅動是嚴格按照從裝置讀寫時序寫)
在第一次起始訊號時雖然我們定址了器件地址和要寫入的記憶體地址,可是我們在配對完成後有給了一個起始訊號,那麼相當於我們第一次的配對斷開了第一次配對所設定的寫資料地址那些不付出在。
在第二個起始訊號中我們我們沒有寫器件地址你肯定的無法再特定記憶體段寫入資料。
那麼這個程式我們要怎麼改了?
一種方法:去掉第二個起始訊號相當於只開啟了配對一次從裝置。
另一種方法:你不想去掉第二個起始訊號那麼你就只需要在第二個起始訊號後加上從-裝置地址和要寫記憶體段的地址就ok(注意兩個地址必須加)這樣的話相當於但你的第一次配對啥都沒做(不提倡)如下圖:
二.讀資料
24c02中iic協議中讀資料的過程:起始訊號->器件地址(7+1位寫(0))->應答->讀取地址->應答->起始訊號-.>器件地址(7位+讀(1))->應答->讀取資料->傳送應答->停止訊號
時序圖:
附帶程式碼:
注:iic——read函式自帶應答。
注:在我們寫從裝置的與主裝置通訊iic驅動是一定要檢視通訊的時序(讀寫時序)而我們的程式碼其實就是按照時序來寫。。
轉載請標明原貼出處:https://blog.csdn.net/zj490044512