0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

SPI協(xié)議詳解(以ADS1118為例)

云深之無跡 ? 來源:云深之無跡 ? 2024-05-07 14:58 ? 次閱讀

最近要寫一個協(xié)議,所以再復習一次SPI。(存草稿太久了,再不發(fā)就忘了)

一開始先分析了SPI的協(xié)議特點,使用ADS1118這個器件作為承載物進行分析,后面用邏輯分析儀從位到字節(jié)進行解碼,最后使用TI給的demo移植到STM32平臺。

SPI是一個環(huán)形總線結構,由ss(cs)、sck、sdisdo構成,其時序其實很簡單,主要是在sck的控制下,兩個雙向移位寄存器進行數據交換。

上升沿發(fā)送、下降沿接收、高位先發(fā)送。

上升沿到來的時候,sdo上的電平將被發(fā)送到從設備的寄存器中。

下降沿到來的時候,sdi上的電平將被接收到主設備的寄存器中。 各家的名字可能不一樣,反正你就看傳輸方向就行。

239e7bf4-0a00-11ef-a297-92fbcf53809c.png

這個是時序圖,因為是雙向的傳輸,在主機發(fā)給從機這段時間,從機也是發(fā)數據的,但是相當于亂發(fā)無意義的:

23af1554-0a00-11ef-a297-92fbcf53809c.png

另外:密封的菱形部分,注意要密封,表示數據有效,Valid Data這個詞也顯示了這點。

關于時間的標注,這也是個十分重要的信息,這些時間的標注表明了某些狀態(tài)所要維持的最短或最長時間。

因為器件的工作速度也是有限的,一般都跟不上主控芯片的速度,所以它們直接之間要有時序配合。

外部12MHz晶振,指令周期就是一個時鐘周期為(1/12MHz)us,所以至少確定了它執(zhí)行一條指令的時間是us級別的。我們看到,以上給的時間參數全部是ns級別的,所以即便我們在程序里不加延時程序

23b39782-0a00-11ef-a297-92fbcf53809c.png

10的-3次方

23d25cc6-0a00-11ef-a297-92fbcf53809c.png

時序時間

專有的時鐘引腳上面是有施密特輸入的

23dcff1e-0a00-11ef-a297-92fbcf53809c.png

這個名字好,DIN,然后數據鎖存在下降沿上:

23f5b018-0a00-11ef-a297-92fbcf53809c.png

GPIO開啟了引腳的弱上拉電阻

24042080-0a00-11ef-a297-92fbcf53809c.png

上升沿移出,下降沿準備:

24085998-0a00-11ef-a297-92fbcf53809c.png

這個是輸出的一個時鐘周期

24138c1e-0a00-11ef-a297-92fbcf53809c.png

這個樣子的意思是,數據有高有低,靠后的線是數據輸出,前面是數據準備?;蛘呤潜绘i定

24221d24-0a00-11ef-a297-92fbcf53809c.png

2428ccf0-0a00-11ef-a297-92fbcf53809c.png

不確定是不是所有的這樣。和上面的分析差不多

2445cd1e-0a00-11ef-a297-92fbcf53809c.png

看一個連續(xù)輸出

2452825c-0a00-11ef-a297-92fbcf53809c.png

在時序上面

MCU的數據中,一個大的時鐘周期由32個小周期組成,兩個字節(jié)來說明轉換的結果,也就是本身的數據,MSB在前。后面兩個是寄存器的回讀,這里我理解是把輸出的控制命令又回流一次。

2459cc42-0a00-11ef-a297-92fbcf53809c.png

2^16,兩個16位

DIN是MCU給器件的信息,MSB+LSB發(fā)一次,剩下二分之一如果你不變化,就可以讓這個DIN的引腳在后一個周期里面一直低或者高都可以。

246e86c8-0a00-11ef-a297-92fbcf53809c.png

你看嘛,就是這樣

2472a6d6-0a00-11ef-a297-92fbcf53809c.png

還有16為輸出模式,可以交替的拉低CS來輸出

247a788e-0a00-11ef-a297-92fbcf53809c.png

這個是輸出16位值的寄存器的樣子,0~15,上面每一位都是一個0或者1,一次16位。

248f54de-0a00-11ef-a297-92fbcf53809c.png

這個是配置的寄存器,從0開始寫,一直配好到15,組成一個16位的序列,發(fā)送。

數據手冊里面的寫法是倒著來,先15,說這個寄存器的位置在15,名字叫SS,可以讀可以寫,重啟之后是0h,描述是斷電的時候設置一次,在轉換過程中換不了。

2493be66-0a00-11ef-a297-92fbcf53809c.png

這個是3位,8種情況,對應個個采集方式:

249771e6-0a00-11ef-a297-92fbcf53809c.png

如果對地的話,那就是差分

增益放大器

24a7d1bc-0a00-11ef-a297-92fbcf53809c.png

速率:

24abb58e-0a00-11ef-a297-92fbcf53809c.png

連續(xù)還是單發(fā):

24c2c724-0a00-11ef-a297-92fbcf53809c.png

默認是單發(fā)

找了找就這個圖出現(xiàn)的次數最多。

24ca9fbc-0a00-11ef-a297-92fbcf53809c.png

OK

擴展SPI還增加了SDR(Single Data Rate)和DDR(Double Data Rate)兩種模式。在標準SPI 協(xié)議的SDR 模式下,只在SCK 的單邊沿進行數據傳輸,即一個SCK 時鐘只傳輸一位數據;而在DDR 模式下,會在SCK 的上升沿和下降沿都進行數據傳輸,即一個SCK 時鐘能傳輸兩位數據,傳輸速率提高一倍。

24e6a496-0a00-11ef-a297-92fbcf53809c.png

就是這樣

24ebeb5e-0a00-11ef-a297-92fbcf53809c.png

沒問題,可以看到時序圖內在CLK的上下沿,數據線上的電平確實是穩(wěn)定的,可以讀取。

1. 2-bit Dual SPI模式

2-bit Dual SPI模式,也稱為Dual SPI模式,是標準SPI的一個變體,它使用兩條數據線(通常是MOSI和MISO)同時傳輸數據。在此模式下,數據在時鐘信號的上升沿和下降沿同時被發(fā)送和接收,使得數據吞吐量相比單線SPI翻倍。

它只是針對SPI Flash而言,不是針對所有SPI外設。對于SPI Flash,全雙工并不常用,因此擴展了mosi和miso的用法,讓它們工作在半雙工,用以加倍數據傳輸。也 就是對于Dual SPI Flash,可以發(fā)送一個命令字節(jié)進入dual mode,這樣mosi變成SIO0(serial io 0),mosi變成SIO1(serial io 1),這樣一個時鐘周期內就能傳輸2個bit數據,加倍了數據傳輸。

數據線:使用MOSI和MISO同時傳輸數據。

數據速率:相比于標準SPI,數據傳輸速率翻倍,因為它同時使用兩條線傳輸數據。

使用場景:適用于需要比標準SPI更高數據傳輸率但又不需要四線Quad SPI的場景。

2. DDR SPI模式

DDR SPI(雙數據率SPI)模式在每個時鐘周期的上升沿和下降沿都進行數據傳輸。這意味著在每個時鐘脈沖上,都可以發(fā)送或接收數據,從而有效地加倍了數據傳輸速率。這種模式通常用于高速數據采集系統(tǒng)中。

數據線:通常使用一條或多條數據線,但每個時鐘周期傳輸兩次數據。

數據速率:數據速率是標準SPI的兩倍,因為它在時鐘的上升沿和下降沿都傳輸數據。

使用場景:適合高性能需求的應用,如高速數據采集或高分辨率視頻傳輸。

區(qū)別 數據傳輸方式:Dual SPI利用兩條數據線在時鐘的每個邊沿傳輸數據;而DDR SPI可能只使用一條數據線,但在每個時鐘的上升沿和下降沿都傳輸數據。

復雜性:DDR SPI通常在實現(xiàn)上更復雜,因為它要求在時鐘的每個邊緣精確控制數據的采樣和輸出,這對時鐘同步提出了更高的要求。

效率:盡管兩者都提高了數據傳輸速率,但在具體實現(xiàn)和系統(tǒng)兼容性方面,它們各有優(yōu)勢和局限。

如果你的設計對時鐘同步的要求極高,可能會更傾向于使用Dual SPI而不是DDR SPI,因為后者需要更精確的控制和可能導致的時鐘偏差問題。

相反,如果需要極高的數據傳輸效率,DDR SPI可能是更好的選擇。

24fbbd22-0a00-11ef-a297-92fbcf53809c.png

HI-Z是什么?

補充:

Hi-Z是數字電路常見術語,指的是電路的一種輸出狀態(tài),既不是高電平也不是低電平,如果高阻態(tài)再輸入下一級電路的話,對下級電路無任何影響,和沒接一樣,如果用萬用表測的話有可能是高電平也有可能是低電平,隨它后面接的東西定。高阻態(tài): 高阻態(tài)的實質電路分析時高阻態(tài)可做開路理解。

模式1:

250d89f8-0a00-11ef-a297-92fbcf53809c.png

上升沿改變,下降沿讀取。

手邊還有一個ESP32-C3的單片機,這個是它的數據手冊,有三個SPI,或者是一個SPI配六個CS線。

251327aa-0a00-11ef-a297-92fbcf53809c.png

外部焊盤,通過MUX,多路轉換到接口上面,可以走DMA或者Cache到CPU,等等,之后再說。

251ebab6-0a00-11ef-a297-92fbcf53809c.png

25304b78-0a00-11ef-a297-92fbcf53809c.png

這個就更專業(yè)啦

SPI 主機驅動允許總線上連接多個設備(共享單個 ESP32-C3 SPI 外設)。每個設備僅由一個任務訪問時,驅動程序線程安全。反之,若多個任務嘗試訪問同一 SPI 設備,則驅動程序非線程安全。

254efea6-0a00-11ef-a297-92fbcf53809c.png

所有的SPI協(xié)議都可以分成這樣的步驟。

當傳輸事務數據等于或小于 32 位時,為數據分配一個緩沖區(qū)將是次優(yōu)的選擇。

SPI 主機逐字節(jié)地將數據讀入和寫入內存。默認情況下,數據優(yōu)先以最高有效位 (MSB) 發(fā)送,極少數情況下會優(yōu)先使用最低有效位 (LSB)。如果需要發(fā)送一個小于 8 位的值,這些位應以 MSB 優(yōu)先的方式寫入內存。

例如,如果需要發(fā)送 0b00010,則應將其寫成 uint8_t 變量,讀取長度設置為 5 位。此時,設備仍然會收到 8 位數據,并另有 3 個“隨機”位,所以讀取過程必須準確。

傳輸速度主要有以下三個限制因素:

傳輸事務間隔時間

SPI 時鐘頻率

緩存缺失的 SPI 函數,包括回調

影響大傳輸事務傳輸速度的主要參數是時鐘頻率。而多個小傳輸事務的傳輸速度主要由傳輸事務間隔時長決定。

256078c0-0a00-11ef-a297-92fbcf53809c.png

在捕捉的時候可以對 SPI 進行詳細設置

2564ad64-0a00-11ef-a297-92fbcf53809c.png

三個解碼層級的設置

256f7672-0a00-11ef-a297-92fbcf53809c.png

這里的解碼有幾個層級,首先是bit級別,就是0,1,接著是轉換,就是0,1拼成別的進制數據。還有就是轉換成數據。

25776fd0-0a00-11ef-a297-92fbcf53809c.png

全是0

257cf75c-0a00-11ef-a297-92fbcf53809c.png

16進制的我喜歡使用

25835a20-0a00-11ef-a297-92fbcf53809c.png

可以看到是一個不斷分組,組裝的過程

258c1b56-0a00-11ef-a297-92fbcf53809c.png

先看一個時鐘的變化

259b3528-0a00-11ef-a297-92fbcf53809c.png

有八個上升沿,也就是8個0,也就是下面的00.是轉換的層級,8個字節(jié)是一位-00.

下面就是兩個字節(jié)變成了一word-16bit

25a7f858-0a00-11ef-a297-92fbcf53809c.png

25af52a6-0a00-11ef-a297-92fbcf53809c.png

第二個字節(jié)

25ba3d6a-0a00-11ef-a297-92fbcf53809c.png

大概就是這樣的解碼啦

25bec704-0a00-11ef-a297-92fbcf53809c.png

這就是解碼出來的第一個數據

25c5ea7a-0a00-11ef-a297-92fbcf53809c.png

前面是bit位,下一個是字節(jié)位,下一個是word位

25cbba5e-0a00-11ef-a297-92fbcf53809c.png

按照16字節(jié)來解碼

25dc87f8-0a00-11ef-a297-92fbcf53809c.png

因為可以自由的傳輸任意的字節(jié)數據,也可以在這里自己定義這個事情

這里就開始移植,看這個TI的意思是隨便整,推薦自己實現(xiàn)SPI的接口:

25f00be8-0a00-11ef-a297-92fbcf53809c.png

下載最后一個

2642dc92-0a00-11ef-a297-92fbcf53809c.png

這里先說一下頭文件如何加

我們的工作是要在代碼里面實現(xiàn)STM32的SPI接口移植,然后在線測量所有的參數來更加詳細的學習SPI。

先看懂給的代碼,明白要干啥:

2646f71e-0a00-11ef-a297-92fbcf53809c.png

這些是TI的庫

NSS管腳及我們熟知的片選信號,作為主設備NSS管腳為高電平,從設備NSS管腳為低電平。

當NSS管腳為低電平時,該spi設備被選中,可以和主設備進行通信。在stm32中,每個spi控制器的NSS信號引腳都具有兩種功能,即輸入和輸出。所謂的輸入就是NSS管腳的信號給自己。所謂的輸出就是將NSS的信號送出去,給從機。

對于NSS的輸入,又分為軟件輸入和硬件輸入。

軟件輸入: NSS分為內部管腳和外部管腳,通過設置spi_cr1寄存器的ssm位和ssi位都為1可以設置NSS管腳為軟件輸入模式且內部管腳提供的電平為高電平,其中SSM位為使能軟件輸入位。SSI位為設置內部管腳電平位。同理通過設置SSM和SSI位1和0則此時的NSS管腳為軟件輸入模式但內部管腳提供的電平為0。若從設備是一個其他的帶有spi接口的芯片,并不能選擇NSS管腳的方式,則可以有兩種辦法,一種是將NSS管腳直接接低電平。另一種就是通過主設備的任何一個gpio口去輸出低電平選中從設備。

硬件輸入: 主機接高電平,從機接低電平。

265e61a6-0a00-11ef-a297-92fbcf53809c.png

2662917c-0a00-11ef-a297-92fbcf53809c.png

這樣

26669d6c-0a00-11ef-a297-92fbcf53809c.png

cs 自己換普通gpio,好像是自動的引腳有些問題

267774de-0a00-11ef-a297-92fbcf53809c.png

外部晶振為8MHz

1選擇外部時鐘HSE 8MHz

2PLL鎖相環(huán)倍頻9倍

3系統(tǒng)時鐘來源選擇為PLL

4設置APB1分頻器為 /2

5使能CSS監(jiān)視時鐘

2688506a-0a00-11ef-a297-92fbcf53809c.png

后來我找到了中文的數據手冊

269cb352-0a00-11ef-a297-92fbcf53809c.png

這個地方 4 種模式選擇

26e186b2-0a00-11ef-a297-92fbcf53809c.png

打開窗口

26e5db18-0a00-11ef-a297-92fbcf53809c.png

打開中斷

26f07000-0a00-11ef-a297-92fbcf53809c.png

編譯 Ok

26f50ef8-0a00-11ef-a297-92fbcf53809c.png

這個是TI硬件層的所有東西,一會兒就重寫

27053e0e-0a00-11ef-a297-92fbcf53809c.png

ti 的板子我用的少

272a75c0-0a00-11ef-a297-92fbcf53809c.png

中斷狀態(tài)

27465c40-0a00-11ef-a297-92fbcf53809c.png

開啟中斷

275e6b14-0a00-11ef-a297-92fbcf53809c.png

開啟中斷引腳

276272b8-0a00-11ef-a297-92fbcf53809c.png

下降邊沿觸發(fā)中斷

27735182-0a00-11ef-a297-92fbcf53809c.png

這個有用

因為STM32的SPI中斷和TI的中斷對不上,下面就看HAL的API:

2787d864-0a00-11ef-a297-92fbcf53809c.png

SPI的中斷有這些

27a5461a-0a00-11ef-a297-92fbcf53809c.png

所有的函數

27b1c200-0a00-11ef-a297-92fbcf53809c.png

中斷

27be89c2-0a00-11ef-a297-92fbcf53809c.png

在main里面的文件

27d29106-0a00-11ef-a297-92fbcf53809c.png

我要做的工作是在HAL文件里面構建STM32 SPI的硬件重構

27e25b0e-0a00-11ef-a297-92fbcf53809c.png

需要實現(xiàn)的是ms和us的延時,CS的控制和收發(fā)功能

27ee1cb4-0a00-11ef-a297-92fbcf53809c.png

SPI函數

280c9126-0a00-11ef-a297-92fbcf53809c.png

這里是延時和CS的實現(xiàn)

ADS1118的內部就可以不用管了。別看寫的簡單,debug也很耗時。

28289e2a-0a00-11ef-a297-92fbcf53809c.png

編譯無錯誤,移植完成

283f5322-0a00-11ef-a297-92fbcf53809c.png

可以看看ADS1118的定位

https://www.stmcu.com.cn/Designresource/detail/software/711298

術語表:

Standard SPI: CLK, /CS, DI, DO, /WP, /Hold Dual SPI: CLK, /CS, IO0, IO1, /WP, /Hold Quad SPI: CLK, /CS, IO0, IO1, IO2, IO3 SIO0(serial io 0)

接口說明

CLK(Serial Clock):時鐘線

/CS(Chip Select):片選接口

DI(Serial Data Input):數據輸入端口

DO(Serial Data Output):輸出輸出端口

2919473a-0a00-11ef-a297-92fbcf53809c.png

2930b12c-0a00-11ef-a297-92fbcf53809c.png



審核編輯:劉清

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 上拉電阻
    +關注

    關注

    5

    文章

    360

    瀏覽量

    30621
  • 寄存器
    +關注

    關注

    31

    文章

    5343

    瀏覽量

    120348
  • STM32
    +關注

    關注

    2270

    文章

    10900

    瀏覽量

    355981
  • 增益放大器
    +關注

    關注

    2

    文章

    100

    瀏覽量

    29049
  • SPI協(xié)議
    +關注

    關注

    0

    文章

    18

    瀏覽量

    8362

原文標題:SPI協(xié)議詳解以ADS1118為例

文章出處:【微信號:TT1827652464,微信公眾號:云深之無跡】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    請問ADS1120在熱電偶測溫度能否完全代替ADS1118?

    目前想測一種K型熱電偶,測溫范圍約為1000度,看中了ADS1118這款芯片。然后偶然間發(fā)現(xiàn)了ADS1120這款芯片,簡單對比了一下性能指標,ADS1120的采樣率和可調增益范圍要優(yōu)于
    發(fā)表于 08-27 07:13

    ADS1118默認上電狀態(tài),是低功耗模式,怎么啟動轉換呢?

    ADS1118是上電之后,先選中芯片,將CS拉低,直接送配置字,然后拉高CS。再就是直接讀數據? SPI_CS_Low(); //拉低CS SPI_Write_byte(0x85
    發(fā)表于 12-13 16:33

    ADS1118采用電壓返回數據恒0,采樣溫度返回值固定為29700,為什么?

    ,ADS1118_SDIN_PIN_NUM)) /*ADS1118 SPI 數據輸出SDO*/ /*說明:這是一個三態(tài)輸出端口(430相應管腳設為輸入) 當CS高電平時,SDO
    發(fā)表于 12-26 07:11

    STC12C5A60S2與ADS1118通過SPI通訊的問題

    問題:STC的SPI是8位的,ADS1118的命令和數據都是16位的,都有SPI功能,兩者通過SPI協(xié)議通訊,是否可以使用STC的
    發(fā)表于 11-07 17:18

    STC12C5A60S2與ADS1118通過SPI通訊的問題

    問題:STC的SPI是8位的,ADS1118的命令和數據都是16位的,都有SPI功能,兩者通過SPI協(xié)議通訊,是否可以使用STC的
    發(fā)表于 11-08 08:32

    ADS1118測試

    求助一下各位大神:我用的是51開發(fā)板調試ADS1118的,并且用的是串口調試,但為什么一直輸出同樣的值:如圖所示:模擬輸入量我給的是一個直流量,而且可以通過一個電位器改變電壓值,做了幾天了一直沒效果。馬上就要交工了,希望各位大神幫幫我
    發(fā)表于 07-05 19:01

    ADS1118

    哪位用過ADS1118 ,請教個問題:關于多通道采集的問題,如何控制選擇指定的通道采集?
    發(fā)表于 04-20 17:13

    ADS1118產品選型及參考設計指南

    ADS1118程序關于51單片機調試ADS1118芯片ADS1118請教 關于ADS1118的程序問題 :返回的數據不對 抱歉我只有35分STC12C5A60S2與
    發(fā)表于 08-29 19:25

    請問如何才從ADS1118中讀回命令寄存器中的值

    參照ADS1118的說明書,我使用CC2530的串口1的SPI方式向ADS1118連接寫入4個字節(jié)的命令,我想問一下我如何才從ADS1118中讀回命令寄存器中的值呢。意思就是在我寫入命
    發(fā)表于 05-27 07:37

    請問怎么在ADS1118中讀取第二通道的值?

    再次求助,ads1118要讀取第二通道,按如下設置,讀到的都是第一通道的值,無法讀取第二通道的值,請高人再次指點。感謝??!#include "msp430x54xA.h"void
    發(fā)表于 06-06 11:23

    關于ADS1118的調試筆記(基于STM32)精選資料分享

    最近調試了ADS1118芯片,單片機用的是STM32ZET6,用IO口模擬SPI通信,連接兩片1118AD采集芯片,講采集到的八通道數據在串口顯示界面打印出來。下面是.c代碼#include
    發(fā)表于 08-17 08:23

    ADS1118轉換寄存器

    0x01:寄存器ADS1118有兩個寄存器可以通過SPI接口訪問。轉換寄存器包含最后一次轉換的結果。配置寄存器允許用戶改變ADS1118的工作模式。并查詢設備的狀態(tài)。1、轉換寄存器[reset
    發(fā)表于 08-23 07:31

    ADS1115和ADS1118的主要區(qū)別是什么?

    ADS1115和ADS1118的主要區(qū)別是什么
    發(fā)表于 10-09 06:39

    ads1118

    ADS1118 Introduction ASD1118的基本介紹。
    發(fā)表于 05-04 11:09 ?31次下載

    ads1118中文手冊

    ADS1118的中文手冊,希望能夠幫助到別人。
    發(fā)表于 05-09 14:36 ?189次下載