SPI的應用領悟
SPI串口協議的工作原理是時鐘信號控制移位寄存器的輸入輸出。主機發送時鐘信號(SCLK),控制主機的寄存器和從機寄存器的移位。

最常用的全雙工模式是這樣工作的:
主機控制片選信號,使能我們要操作的從機。
然后主機寫一個數據,寫數據的時候,會發送相應的SCLK,同時主機按照SCLK,將寄存器位中的數據一一移位發送出來,從機也按照SCLK將從機寄存器的數據一一移位出來。到最后一個時鐘的時候,他們兩個寄存器的數據互換了。
如果主機發送數據的時候,從機也會發送數據,從機發送的數據也許并不是有效數據,但是我們去管他干什么呢。我買你將這次的數據放棄就是了。也就是說發送的時候肯定會有接收。要想接收那就必須要發送一個數據(無論是不是有效數據)。換句話講,從機并不知道自己什么時候要移位發送數據,只是根據SCLK來發送數據。
我們也可以這么理解,因為單片機內部設置的是,發送數據時候才會產生相應的SCLK,這時候從機知道了就會把寄存器中的數據發出來。我們如果自己進行模擬的話,控制單片機或者FPGA發送SCLK就可以將從機的數據讀出來,而不用使用主機的發送數據命令。即:SCLK控制和協調一切。
我們以 ADS1298的讀取寄存器 這樣一個操作為例,主機使用STM32F103。
ADS1298讀取寄存器命令是這樣的:

我們用單片機控制的話,不能控制SCLK的產生,那我們就用寫數據,來產生SCLK,讀取后面的REG DATA。至于OPCODE,我們就是直接發送了,為主機的有效數據,就是說前兩個發送有效數據,接收到的數據丟棄。第三個發送過程,發送數據隨便填寫,無效,而接受的數據為有效數據,我們留起來用。
程序是這樣子寫的:

這是主程序里面的段落。
下面是讀寫子程序。

1、發送讀寄存器的地址
2、發送讀寄存器的個數
3、讀發回來的數據(如果讀寄存器的個數為n,那個就要有n個此條命令)
關于ADS1298,具體的還是要仔細閱讀其說明文檔。像我自己在做實驗的時候,總是無法讀取出來正常的命令。通過示波器看到輸入線上的數據不對,完全為0.。后來仔細的閱讀了其說明文檔,發現ADS1298在連續讀數據模式下,無法有效實現讀寄存器。然后在前面關閉了連續讀模式,就能夠成功的讀取到寄存器的數據了。
留此,以后翻閱。


評論