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

評(píng)論