最近要寫(xiě)一個(gè)協(xié)議,所以再復習一次SPI。(存草稿太久了,再不發(fā)就忘了)
一開(kāi)始先分析了SPI的協(xié)議特點(diǎn),使用ADS1118這個(gè)器件作為承載物進(jìn)行分析,后面用邏輯分析儀從位到字節進(jìn)行解碼,最后使用TI給的demo移植到STM32平臺。
SPI是一個(gè)環(huán)形總線(xiàn)結構,由ss(cs)、sck、sdi、sdo構成,其時(shí)序其實(shí)很簡(jiǎn)單,主要是在sck的控制下,兩個(gè)雙向移位寄存器進(jìn)行數據交換。
上升沿發(fā)送、下降沿接收、高位先發(fā)送。
上升沿到來(lái)的時(shí)候,sdo上的電平將被發(fā)送到從設備的寄存器中。
下降沿到來(lái)的時(shí)候,sdi上的電平將被接收到主設備的寄存器中。 各家的名字可能不一樣,反正你就看傳輸方向就行。
這個(gè)是時(shí)序圖,因為是雙向的傳輸,在主機發(fā)給從機這段時(shí)間,從機也是發(fā)數據的,但是相當于亂發(fā)無(wú)意義的:
另外:密封的菱形部分,注意要密封,表示數據有效,Valid Data這個(gè)詞也顯示了這點(diǎn)。
關(guān)于時(shí)間的標注,這也是個(gè)十分重要的信息,這些時(shí)間的標注表明了某些狀態(tài)所要維持的最短或最長(cháng)時(shí)間。
因為器件的工作速度也是有限的,一般都跟不上主控芯片的速度,所以它們直接之間要有時(shí)序配合。
外部12MHz晶振,指令周期就是一個(gè)時(shí)鐘周期為(1/12MHz)us,所以至少確定了它執行一條指令的時(shí)間是us級別的。我們看到,以上給的時(shí)間參數全部是ns級別的,所以即便我們在程序里不加延時(shí)程序
10的-3次方
時(shí)序時(shí)間
專(zhuān)有的時(shí)鐘引腳上面是有施密特輸入的
這個(gè)名字好,DIN,然后數據鎖存在下降沿上:
GPIO開(kāi)啟了引腳的弱上拉電阻:
上升沿移出,下降沿準備:
這個(gè)是輸出的一個(gè)時(shí)鐘周期
這個(gè)樣子的意思是,數據有高有低,靠后的線(xiàn)是數據輸出,前面是數據準備?;蛘呤潜绘i定
不確定是不是所有的這樣。和上面的分析差不多
看一個(gè)連續輸出
在時(shí)序上面
給MCU的數據中,一個(gè)大的時(shí)鐘周期由32個(gè)小周期組成,兩個(gè)字節來(lái)說(shuō)明轉換的結果,也就是本身的數據,MSB在前。后面兩個(gè)是寄存器的回讀,這里我理解是把輸出的控制命令又回流一次。
2^16,兩個(gè)16位
DIN是MCU給器件的信息,MSB+LSB發(fā)一次,剩下二分之一如果你不變化,就可以讓這個(gè)DIN的引腳在后一個(gè)周期里面一直低或者高都可以。
你看嘛,就是這樣
還有16為輸出模式,可以交替的拉低CS來(lái)輸出
這個(gè)是輸出16位值的寄存器的樣子,0~15,上面每一位都是一個(gè)0或者1,一次16位。
這個(gè)是配置的寄存器,從0開(kāi)始寫(xiě),一直配好到15,組成一個(gè)16位的序列,發(fā)送。
數據手冊里面的寫(xiě)法是倒著(zhù)來(lái),先15,說(shuō)這個(gè)寄存器的位置在15,名字叫SS,可以讀可以寫(xiě),重啟之后是0h,描述是斷電的時(shí)候設置一次,在轉換過(guò)程中換不了。
這個(gè)是3位,8種情況,對應個(gè)個(gè)采集方式:
如果對地的話(huà),那就是差分
增益放大器:
速率:
連續還是單發(fā):
默認是單發(fā)
找了找就這個(gè)圖出現的次數最多。
OK
擴展SPI還增加了SDR(Single Data Rate)和DDR(Double Data Rate)兩種模式。在標準SPI 協(xié)議的SDR 模式下,只在SCK 的單邊沿進(jìn)行數據傳輸,即一個(gè)SCK 時(shí)鐘只傳輸一位數據;而在DDR 模式下,會(huì )在SCK 的上升沿和下降沿都進(jìn)行數據傳輸,即一個(gè)SCK 時(shí)鐘能傳輸兩位數據,傳輸速率提高一倍。
就是這樣
沒(méi)問(wèn)題,可以看到時(shí)序圖內在CLK的上下沿,數據線(xiàn)上的電平確實(shí)是穩定的,可以讀取。
1. 2-bit Dual SPI模式
2-bit Dual SPI模式,也稱(chēng)為Dual SPI模式,是標準SPI的一個(gè)變體,它使用兩條數據線(xiàn)(通常是MOSI和MISO)同時(shí)傳輸數據。在此模式下,數據在時(shí)鐘信號的上升沿和下降沿同時(shí)被發(fā)送和接收,使得數據吞吐量相比單線(xiàn)SPI翻倍。
它只是針對SPI Flash而言,不是針對所有SPI外設。對于SPI Flash,全雙工并不常用,因此擴展了mosi和miso的用法,讓它們工作在半雙工,用以加倍數據傳輸。也 就是對于Dual SPI Flash,可以發(fā)送一個(gè)命令字節進(jìn)入dual mode,這樣mosi變成SIO0(serial io 0),mosi變成SIO1(serial io 1),這樣一個(gè)時(shí)鐘周期內就能傳輸2個(gè)bit數據,加倍了數據傳輸。
數據線(xiàn):使用MOSI和MISO同時(shí)傳輸數據。
數據速率:相比于標準SPI,數據傳輸速率翻倍,因為它同時(shí)使用兩條線(xiàn)傳輸數據。
使用場(chǎng)景:適用于需要比標準SPI更高數據傳輸率但又不需要四線(xiàn)Quad SPI的場(chǎng)景。
2. DDR SPI模式
DDR SPI(雙數據率SPI)模式在每個(gè)時(shí)鐘周期的上升沿和下降沿都進(jìn)行數據傳輸。這意味著(zhù)在每個(gè)時(shí)鐘脈沖上,都可以發(fā)送或接收數據,從而有效地加倍了數據傳輸速率。這種模式通常用于高速數據采集系統中。
數據線(xiàn):通常使用一條或多條數據線(xiàn),但每個(gè)時(shí)鐘周期傳輸兩次數據。
數據速率:數據速率是標準SPI的兩倍,因為它在時(shí)鐘的上升沿和下降沿都傳輸數據。
使用場(chǎng)景:適合高性能需求的應用,如高速數據采集或高分辨率視頻傳輸。
區別 數據傳輸方式:Dual SPI利用兩條數據線(xiàn)在時(shí)鐘的每個(gè)邊沿傳輸數據;而DDR SPI可能只使用一條數據線(xiàn),但在每個(gè)時(shí)鐘的上升沿和下降沿都傳輸數據。
復雜性:DDR SPI通常在實(shí)現上更復雜,因為它要求在時(shí)鐘的每個(gè)邊緣精確控制數據的采樣和輸出,這對時(shí)鐘同步提出了更高的要求。
效率:盡管兩者都提高了數據傳輸速率,但在具體實(shí)現和系統兼容性方面,它們各有優(yōu)勢和局限。
如果你的設計對時(shí)鐘同步的要求極高,可能會(huì )更傾向于使用Dual SPI而不是DDR SPI,因為后者需要更精確的控制和可能導致的時(shí)鐘偏差問(wèn)題。
相反,如果需要極高的數據傳輸效率,DDR SPI可能是更好的選擇。
HI-Z是什么?
補充:
Hi-Z是數字電路常見(jiàn)術(shù)語(yǔ),指的是電路的一種輸出狀態(tài),既不是高電平也不是低電平,如果高阻態(tài)再輸入下一級電路的話(huà),對下級電路無(wú)任何影響,和沒(méi)接一樣,如果用萬(wàn)用表測的話(huà)有可能是高電平也有可能是低電平,隨它后面接的東西定。高阻態(tài): 高阻態(tài)的實(shí)質(zhì)電路分析時(shí)高阻態(tài)可做開(kāi)路理解。
模式1:
上升沿改變,下降沿讀取。
手邊還有一個(gè)ESP32-C3的單片機,這個(gè)是它的數據手冊,有三個(gè)SPI,或者是一個(gè)SPI配六個(gè)CS線(xiàn)。
外部焊盤(pán),通過(guò)MUX,多路轉換到接口上面,可以走DMA或者Cache到CPU,等等,之后再說(shuō)。
這個(gè)就更專(zhuān)業(yè)啦
SPI 主機驅動(dòng)允許總線(xiàn)上連接多個(gè)設備(共享單個(gè) ESP32-C3 SPI 外設)。每個(gè)設備僅由一個(gè)任務(wù)訪(fǎng)問(wèn)時(shí),驅動(dòng)程序線(xiàn)程安全。反之,若多個(gè)任務(wù)嘗試訪(fǎng)問(wèn)同一 SPI 設備,則驅動(dòng)程序非線(xiàn)程安全。
所有的SPI協(xié)議都可以分成這樣的步驟。
當傳輸事務(wù)數據等于或小于 32 位時(shí),為數據分配一個(gè)緩沖區將是次優(yōu)的選擇。
SPI 主機逐字節地將數據讀入和寫(xiě)入內存。默認情況下,數據優(yōu)先以最高有效位 (MSB) 發(fā)送,極少數情況下會(huì )優(yōu)先使用最低有效位 (LSB)。如果需要發(fā)送一個(gè)小于 8 位的值,這些位應以 MSB 優(yōu)先的方式寫(xiě)入內存。
例如,如果需要發(fā)送 0b00010,則應將其寫(xiě)成 uint8_t 變量,讀取長(cháng)度設置為 5 位。此時(shí),設備仍然會(huì )收到 8 位數據,并另有 3 個(gè)“隨機”位,所以讀取過(guò)程必須準確。
傳輸速度主要有以下三個(gè)限制因素:
傳輸事務(wù)間隔時(shí)間
SPI 時(shí)鐘頻率
緩存缺失的 SPI 函數,包括回調
影響大傳輸事務(wù)傳輸速度的主要參數是時(shí)鐘頻率。而多個(gè)小傳輸事務(wù)的傳輸速度主要由傳輸事務(wù)間隔時(shí)長(cháng)決定。
在捕捉的時(shí)候可以對 SPI 進(jìn)行詳細設置
三個(gè)解碼層級的設置
這里的解碼有幾個(gè)層級,首先是bit級別,就是0,1,接著(zhù)是轉換,就是0,1拼成別的進(jìn)制數據。還有就是轉換成數據。
全是0
16進(jìn)制的我喜歡使用
可以看到是一個(gè)不斷分組,組裝的過(guò)程
先看一個(gè)時(shí)鐘的變化
有八個(gè)上升沿,也就是8個(gè)0,也就是下面的00.是轉換的層級,8個(gè)字節是一位-00.
下面就是兩個(gè)字節變成了一word-16bit
第二個(gè)字節
大概就是這樣的解碼啦
這就是解碼出來(lái)的第一個(gè)數據
前面是bit位,下一個(gè)是字節位,下一個(gè)是word位
按照16字節來(lái)解碼
因為可以自由的傳輸任意的字節數據,也可以在這里自己定義這個(gè)事情
這里就開(kāi)始移植,看這個(gè)TI的意思是隨便整,推薦自己實(shí)現SPI的接口:
下載最后一個(gè)
這里先說(shuō)一下頭文件如何加
我們的工作是要在代碼里面實(shí)現STM32的SPI接口移植,然后在線(xiàn)測量所有的參數來(lái)更加詳細的學(xué)習SPI。
先看懂給的代碼,明白要干啥:
這些是TI的庫
NSS管腳及我們熟知的片選信號,作為主設備N(xiāo)SS管腳為高電平,從設備N(xiāo)SS管腳為低電平。
當NSS管腳為低電平時(shí),該spi設備被選中,可以和主設備進(jìn)行通信。在stm32中,每個(gè)spi控制器的NSS信號引腳都具有兩種功能,即輸入和輸出。所謂的輸入就是NSS管腳的信號給自己。所謂的輸出就是將NSS的信號送出去,給從機。
對于NSS的輸入,又分為軟件輸入和硬件輸入。
軟件輸入: NSS分為內部管腳和外部管腳,通過(guò)設置spi_cr1寄存器的ssm位和ssi位都為1可以設置NSS管腳為軟件輸入模式且內部管腳提供的電平為高電平,其中SSM位為使能軟件輸入位。SSI位為設置內部管腳電平位。同理通過(guò)設置SSM和SSI位1和0則此時(shí)的NSS管腳為軟件輸入模式但內部管腳提供的電平為0。若從設備是一個(gè)其他的帶有spi接口的芯片,并不能選擇NSS管腳的方式,則可以有兩種辦法,一種是將NSS管腳直接接低電平。另一種就是通過(guò)主設備的任何一個(gè)gpio口去輸出低電平選中從設備。
硬件輸入: 主機接高電平,從機接低電平。
這樣
cs 自己換普通gpio,好像是自動(dòng)的引腳有些問(wèn)題
外部晶振為8MHz
1選擇外部時(shí)鐘HSE 8MHz
2PLL鎖相環(huán)倍頻9倍
3系統時(shí)鐘來(lái)源選擇為PLL
4設置APB1分頻器為 /2
5使能CSS監視時(shí)鐘
后來(lái)我找到了中文的數據手冊
這個(gè)地方 4 種模式選擇
打開(kāi)窗口
打開(kāi)中斷
編譯 Ok
這個(gè)是TI硬件層的所有東西,一會(huì )兒就重寫(xiě)
ti 的板子我用的少
中斷狀態(tài)
開(kāi)啟中斷
開(kāi)啟中斷引腳
下降邊沿觸發(fā)中斷
這個(gè)有用
因為STM32的SPI中斷和TI的中斷對不上,下面就看HAL的API:
SPI的中斷有這些
所有的函數
中斷
在main里面的文件
我要做的工作是在HAL文件里面構建STM32 SPI的硬件重構
需要實(shí)現的是ms和us的延時(shí),CS的控制和收發(fā)功能
SPI函數
這里是延時(shí)和CS的實(shí)現
ADS1118的內部就可以不用管了。別看寫(xiě)的簡(jiǎn)單,debug也很耗時(shí)。
編譯無(wú)錯誤,移植完成
可以看看ADS1118的定位
https://www.stmcu.com.cn/Designresource/detail/software/711298
術(shù)語(yǔ)表:
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)
接口說(shuō)明
CLK(Serial Clock):時(shí)鐘線(xiàn)
/CS(Chip Select):片選接口
DI(Serial Data Input):數據輸入端口
DO(Serial Data Output):輸出輸出端口
審核編輯:劉清
-
上拉電阻
+關(guān)注
關(guān)注
5文章
351瀏覽量
30329 -
寄存器
+關(guān)注
關(guān)注
30文章
5167瀏覽量
118249 -
STM32
+關(guān)注
關(guān)注
2247文章
10693瀏覽量
349921 -
增益放大器
+關(guān)注
關(guān)注
2文章
95瀏覽量
28953 -
SPI協(xié)議
+關(guān)注
關(guān)注
0文章
18瀏覽量
8290
原文標題:SPI協(xié)議詳解以ADS1118為例
文章出處:【微信號:TT1827652464,微信公眾號:云深之無(wú)跡】歡迎添加關(guān)注!文章轉載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論