1. 程式人生 > >I2C(smbus、pmbus)和SPI協議分析

I2C(smbus、pmbus)和SPI協議分析

I2C和SPI作為兩種非常常用的低速外部匯流排,已經不是什麼新新技術了。
有些知識點,明白了,一段時間不用了,又忘記了。所以決定乘最近正好碰過這兩個東西,還是寫下來以備後患。

I2C

I2C是以前的飛利浦半導體制定的標準,也就是如今的NXP。

I2C匯流排由一條資料線(SDA)和一條時鐘線(SCL)組成。裝置分主從,主裝置提供時鐘,併發起操作。
這裡寫圖片描述

看一下這張I2C協議必須和可選的功能表。最簡單的模式的話,只需要實現4個功能,start、stop、ack、7bit address。
這裡寫圖片描述

當scl為高時,sda下拉表示start。當scl為低時,sda上拉表示stop。
這裡寫圖片描述

根據下面這個圖,我們來討論這4個基本功能。

  • master控制sda、scl:發起一個start標記
  • master控制sda、scl:start之後的1-7位表示的是slave裝置的7bit address
  • master控制sda、scl:第8位表示是讀(1)還是寫(0)操作,所以我們其實可以把7bit address和這1bit讀寫位結合起來當成一個byte。
  • master控制scl,slave控制sda:slave強制拉低sda來表示第9位為ack

這裡寫圖片描述

分析好了這第一個byte的內容,就可以繼續後面更復雜的了。這個時序一共進行了2個byte的寫操作。
- master控制sda、scl:start
- master控制sda、scl:7位地址
- master控制sda、scl:1位寫
- master控制scl,slave控制sda:slave ack
- master控制sda、scl:1位元組資料
- master控制scl,slave控制sda:slave ack
- master控制sda、scl:1位元組資料
- master控制scl,slave控制sda:slave ack
- master控制sda、scl:stop
這裡寫圖片描述

再看個讀操作的
- master控制sda、scl:start
- master控制sda、scl:7位地址
- master控制sda、scl:1位讀
- master控制scl,slave控制sda:slave ack
- master控制scl,slave控制sda:1位元組資料
- master控制sda、scl:master ack
- master控制scl,slave控制sda:1位元組資料
- master控制sda、scl:master ack
- master控制sda、scl:stop
這裡寫圖片描述

純粹的讀和純粹的寫我們都會了,下面就要讀寫混合了。最常見的場景就是通過I2C從裝置那讀取某個暫存器的值。
- master控制sda、scl:start
- master控制sda、scl:7位地址
- master控制sda、scl:1位寫
- master控制scl,slave控制sda:slave ack
- master控制sda、scl:1位元組資料
- master控制scl,slave控制sda:slave ack
- master控制sda、scl:start
- master控制sda、scl:7位地址
- master控制sda、scl:1位讀
- master控制scl,slave控制sda:slave ack
- master控制scl,slave控制sda:1位元組資料
- master控制sda、scl:master ack
- master控制sda、scl:stop
這裡寫圖片描述

基本功能的I2C介紹就這些了,但是剛才說到I2C還有許多的可選功能,譬如clock stretching功能,這次就遇到一個bug和這個功能有關。

我們再來看看剛才看過的這個圖,在第一個byte傳輸完之後的一段時間內,scl為低。為什麼會出現這種情況那?其實不一定是在第一個位元組之後,也可能是master要從slave那讀取某個暫存器的值,第一個位元組的slave address發過去了,然後第二個位元組的暫存器地址又發過去了,後面就該slave來返回一個byte的資料了。但是可能這個資料並不是那麼簡單的得到的,slave可能會先進入中斷,然後做一些計算才能得到要返回的值,而這個計算又比較耗時。那slave可以強制拉低scl來表示現在我在忙,要等我做完事情了才可以繼續返回資料。假如slave有這種功能,而master又不支援,那就完蛋了,資料全亂了。幸好,我們的master是CPLD的,通過修改支援了這個功能,操作就正常了。
這裡寫圖片描述

SMBUS

SMBUS是一種基於I2C而擴展出來的協議。有一些更為複雜的操作,但是原理都還是基於I2C的。
這裡寫圖片描述

這裡寫圖片描述

這裡寫圖片描述

PMBUS

PMBUS是基於SMBUS,定義了很多和電源管理相關的命令。在物理傳輸上,和SMBUS是完全一致的。

SPI

SPI有四根線,一根時鐘,一根收資料,一根發資料,一根片選。當有多個裝置時,他就需要多根片選,所以相比I2C而言,佈線更為複雜。
這裡寫圖片描述

SPI只規定了如何收發資料,但是資料的具體格式含義並沒有定義。譬如在I2C中跟在7位地址後面的1位表示讀寫,所有裝置都需要遵循。但是SPI不是這樣,每個slave都有自己定義的資料格式,各不相同。我們先看看下面這個例子。master傳送的第一個位元組裡01表示寫,而05表示讀。根據第一個位元組的不同,slave會做出不一樣的響應。
這裡寫圖片描述
這裡寫圖片描述
而我還見過一種是slave規定,master發給slave的前兩個位元組代表暫存器的地址,但是0-15位的第15位不當地址來用,而當讀寫位來用,但是我找不到這個例子的時序圖了。我舉這個例子是想說明SPI傳輸資料必須要根據slave裝置的timing來,不可想當然。

相關推薦

I2CsmbuspmbusSPI協議分析

I2C和SPI作為兩種非常常用的低速外部匯流排,已經不是什麼新新技術了。 有些知識點,明白了,一段時間不用了,又忘記了。所以決定乘最近正好碰過這兩個東西,還是寫下來以備後患。 I2C I2C是以前的飛利浦半導體制定的標準,也就是如今的NXP。 I2C

IGPRIPOSPFEGPBGP

0x01 AS(autonomous system,自治系統) 在網際網路中,一個自治系統(AS)是一個有權自主地決定在本系統中應採用何種路由協議的小型單位。這個網路單位可以是一個簡單的網路也可以是一個由一或多個普通的網路管理員來控制的網路群體,它是一個單獨的可

collection介面listsetmap介面的區別

collection Collection是最基本的集合介面,聲明瞭適用於JAVA集合(只包括Set和List)的通用方法。Map介面並不是Collection介面的子介面,但是它仍然被看作是Collection框架的一部分。 list List的長度可變

Extjs5.0(6):控制器ControllerViewController路由器Router

控制器 上一篇文章我們已經為專案添加了左側導航欄,接下來要為導航欄新增點選事件,點選左側導航欄,右側介面出現相應變化。 為元件新增事件,就要用到控制器了。Extjs5提供了兩種控制器:Controller和ViewController,這兩種控制器都繼承自BaseCon

css 雙飛翼佈局flex float 聖盃佈局

雙飛翼佈局 雙飛翼佈局,是一種頁面佈局的形象的表達。具體表現形式為 兩邊頂寬,中間自適應寬度的三欄佈局,中間欄要放在HTML文件流的最前,優先渲染 實現方式 float 浮動流 頁面基本佈局很簡單,總共有三欄,中間欄位於文件流的最前面,優先渲染 `

mysql筆記五——資料庫連線池原理構建java動態代理的使用

資料庫連線池 1、什麼是資料庫連線池?       資料庫連線池負責分配、管理和釋放資料庫連線,它允許應用程式重複使用一個現有的資料庫連線,而不是再重新建立一個;釋放空閒時間超過最大空閒時間的資料庫連線來避免因為沒有釋放資料庫連線而引起的資料庫連線遺漏。這項

Java String類StringBuffer

image 存在 equal 分享 buffer 大寫 移除 能夠 nal Java String 類 字符串廣泛應用 在Java 編程中,在 Java 中字符串屬於對象,Java 提供了 String 類來創建和操作字符串。 創建字符串 // ==比

蘋果產品時間發布表統計iPhoneiPad,以及32位64位機的說明

bsp 產品 13.10 上市 pos min ipad mini 時間排序 手機 之前因為某些原因,需要對apple家族的手機和pad產品做一個上市時間排序,以及分析分別是哪種CPU機型 總結如下: iPad家族: 1、iPad     - 2010.1.27發布 2、

獲取碼值各種類型字符的ASCII進制轉換系統包括正負數小數

獲取碼值 進制轉換 十進制小數負數轉二進制 java進制轉換 ASCII 獲取碼值和進制轉換程序由來: 本人發現計算機中的計算器木有將十進制小數轉二進制的功能,後來發現一些網站將十進制負數轉二進制只是求出整數的二進制,然後前面加“-”,這種表示不是真正的負數二進制。於是愛較真兒

Python語法之選擇迴圈ifwhile

前言:在程式開發中,一共有三種流程方式: 順序:從上向下,順序執行程式碼 分支:根據條件判斷,決定執行程式碼的分支 迴圈:讓特定程式碼重複執行(解決程式設計師重複工作) 1.判斷的定義: 如果條件滿足,才能做某件事 如果條件不滿足,就做另外一件事情,或者什麼也不做 正是有了判斷,才使得程式世界豐富多彩,充滿

httpd安裝配置cgiwsgi

參考:http://webpy.org/cookbook/mod_wsgi-apache.zh-cn   一、yum方式安裝: 1、yum install httpd 輸入y後繼續。   2、看到一下類似的返回,說明安裝成功 &n

蔡高廳老師 - 高等數學閱讀筆記 - 14 定積分 -定積分的換元法 - 廣義積分伽馬函式6566

不定積分有第一,第二換元,定積分只有換元: 周期函式的定積分 定積分的分部積分法 利用歸納法和分部積分法

基於深度學習遷移學習的遙感影象場景分類實踐AlexNetResNet

卷積神經網路(CNN)在影象處理方面有很多出色的表現,在ImageNet上有很多成功的模型都是基於CNN的。AlexNet是具有歷史意義的一個網路,2012年提出來當年獲得了當年的ImageNet LSVRC比賽的冠軍,此後ImageNet LSVRC的冠軍都是都是用CNN做的,並且層

winform控制元件縮寫水晶報表其他

winform控制元件縮寫(八)水晶報表 序號 縮寫 空間名 1 crv CrystalReportViewer 2 rpd

LeetCode 560. 為K的子陣列C++python

給定一個整數陣列和一個整數 k,你需要找到該陣列中和為 k 的連續的子陣列的個數。 示例 1 : 輸入:nums = [1,1,1], k = 2 輸出: 2 , [1,1] 與 [1,1] 為兩種不同的情況。 說明 : 陣列的長度為 [1, 20,0

【心得】LatticeXilinx工具關鍵特性對比DiamondISE

【根索引】 【索引】FPGA相關 背景 由於FPGA器件選型為Lattice的,所以由之前熟悉的ISE切換到Diamond,目前還在不斷適應中,有些過程體會,記錄下來供參考。按開發流程,講一些常用的特性進行對比,列舉如下: IP Core管理 Diamond初次見面的坑 內建邏輯分析儀(俗

Android RecyclerView 詳解 RecyclerView的動畫實現移除新增改變移動自定義動畫的實現

一丶新增刪除時候的重新整理問題 先上一下效果圖吧 1.為了方便起見我們還是先新增三個按鈕分別實現新增刪除和改變 2.在Adapter中寫呼叫方法並進行重新整理 public void remove(int position){ list.re

【Android】adb抓取不同分類Logkernelradioeventmain獲取ANR log

Log分類     Android日誌主要分為kernel、radio、event、main這四種log。 Kernel Log     kernel log屬於Linux核心的log ,可以通過讀取/proc/kmsg或者通過串列埠來抓取。     adb 抓取ke

【Log】android手機除錯AP側mainkernelBP側ANRhcidump的log抓取方法

AP的log抓取   主要有main log和kernel log兩種。 1、Main log   註釋:     Main log為應用程式的log,也是最常用的一種。提交功能性bug時,一般都要提供Main log。   方法1:     在手機後臺裡開一個程

安裝R軟體Rstudio的安裝包下載官網教程

                                                                          安裝R軟體(R、studio) R X64 3.5.1 ---->Rstudio 下面以Windows X64系統為例