最近正在調(diào)試一個芯片的評估板,其中配置寄存器使用的是SPI通信協(xié)議。其實很多芯片寄存器的配置都用到了SPI通信協(xié)議,我們今天就需要實現(xiàn)這個SPI通信協(xié)議。
首先,我們需要了解SPI協(xié)議的基本內(nèi)容,SPI主要有四根傳輸線,分別為SPI_CLK, SPI_EN, SPI_DI, SPI_DO。
主設備會將數(shù)據(jù)時鐘通過SPI_CLK傳送給從設備,從設備根據(jù)SPI_CLK進行接收發(fā)送工作;SPI需要注意的是極性CPOL和相位CPHA;CPOL指的是時鐘極性,CPHA指的是時鐘相位。一個時鐘周期內(nèi),會有兩個跳變沿,它既有可能是上升沿也有可能是下降沿;CPOL的值決定了SPI數(shù)據(jù)時鐘在空閑狀態(tài)下保持為高電平(CPOL=1)還是低電平(CPOL=0),CPHA的值決定了SPI的采樣邊沿是第一個邊沿(CPHA=0)還是第二個邊沿(CPHA=1)。
舉個例子,從某芯片手冊上看,該芯片手冊SPI的時序圖如下:
芯片SPI寫時序
可以看到,SPI_CLK在開始和結(jié)束時都保持了低電平狀態(tài),所以CPOL=0,而每次SPI_DI在SPI_CLK的上升沿改變電平值,在SPI_CLK的下降沿保持電平不變,所以可以推斷,SPI的采樣邊沿是第二個邊沿,CPHA=1;
從圖中我們還可以知道,SPI需要工作的時候,SPI_ENB需要拉低,這就是SPI的片選信號,由于SPI沒有尋址機制,所以需要使用片選信號選擇總線上不同的設備。
所以說,SPI_EN的工作最為輕松,在需要發(fā)送數(shù)據(jù)的時候?qū)PI_EN反相,在發(fā)送結(jié)束后再反相回來;SPI_CLK就是在不斷地發(fā)送周期性方波;SPI_DI則是在恰當?shù)臅r機根據(jù)要發(fā)送的數(shù)據(jù)進行高低電平轉(zhuǎn)換,然后保持不變。
芯片SPI讀時序
這里簡單說一下這個芯片SPI的協(xié)議內(nèi)容,發(fā)送的第一位(MSB)決定了SPI讀寫操作,為1是寫入,為0是讀??;接下來發(fā)送5位0,接著發(fā)送10位的寄存器地址;如果SPI是寫操作,繼續(xù)寫入8位數(shù)據(jù),否則開始接收SPI_DO上的數(shù)據(jù)。
指令解釋
這里我列出了狀態(tài)機跳轉(zhuǎn)的狀態(tài):
首先狀態(tài)機不管在任何狀態(tài)都會回到IDLE空閑狀態(tài),在IDLE空閑狀態(tài)下,接收到發(fā)送數(shù)據(jù)的命令就會跳轉(zhuǎn)到WRITE_ADDR寫地址狀態(tài),在寫完前16位數(shù)據(jù)后,根據(jù)第一位的值決定是跳轉(zhuǎn)到WRITE_DATA狀態(tài)接著向芯片寄存器寫入數(shù)據(jù)還是轉(zhuǎn)向READ狀態(tài)讀取寄存器的值;操作結(jié)束后最終狀態(tài)機回到IDLE空閑狀態(tài)。
其實只需要理解芯片手冊上SPI的時序圖,并用verilog將其描述出來,就已經(jīng)成功了一大半。這里我們實操前的準備工作都做完了,接下來就是開始碼verilog代碼并進行仿真,上板測試等等。待我整理出來之后,再與大家一同討論吧。
-
寄存器
+關(guān)注
關(guān)注
31文章
5434瀏覽量
124577 -
狀態(tài)機
+關(guān)注
關(guān)注
2文章
493瀏覽量
28259 -
SPI通信
+關(guān)注
關(guān)注
0文章
36瀏覽量
11670 -
Verilog語言
+關(guān)注
關(guān)注
0文章
113瀏覽量
8560 -
MSB
+關(guān)注
關(guān)注
0文章
13瀏覽量
8405
發(fā)布評論請先 登錄
SPI通信協(xié)議
SPI通信協(xié)議
對串口中斷的通信協(xié)議理解與應用
SPI是什么?SPI通信協(xié)議說明
STM32如何模擬SPI通信協(xié)議
通信協(xié)議:SPI

plc通信協(xié)議 plc通信原理
SPI通信協(xié)議原理是什么

scon寄存器在串口通信中的實際應用

評論