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