SPI的應(yīng)用領(lǐng)悟
SPI串口協(xié)議的工作原理是時(shí)鐘信號(hào)控制移位寄存器的輸入輸出。主機(jī)發(fā)送時(shí)鐘信號(hào)(SCLK),控制主機(jī)的寄存器和從機(jī)寄存器的移位。
最常用的全雙工模式是這樣工作的:
主機(jī)控制片選信號(hào),使能我們要操作的從機(jī)。
然后主機(jī)寫一個(gè)數(shù)據(jù),寫數(shù)據(jù)的時(shí)候,會(huì)發(fā)送相應(yīng)的SCLK,同時(shí)主機(jī)按照SCLK,將寄存器位中的數(shù)據(jù)一一移位發(fā)送出來,從機(jī)也按照SCLK將從機(jī)寄存器的數(shù)據(jù)一一移位出來。到最后一個(gè)時(shí)鐘的時(shí)候,他們兩個(gè)寄存器的數(shù)據(jù)互換了。
如果主機(jī)發(fā)送數(shù)據(jù)的時(shí)候,從機(jī)也會(huì)發(fā)送數(shù)據(jù),從機(jī)發(fā)送的數(shù)據(jù)也許并不是有效數(shù)據(jù),但是我們?nèi)ス芩墒裁茨?。我買你將這次的數(shù)據(jù)放棄就是了。也就是說發(fā)送的時(shí)候肯定會(huì)有接收。要想接收那就必須要發(fā)送一個(gè)數(shù)據(jù)(無論是不是有效數(shù)據(jù))。換句話講,從機(jī)并不知道自己什么時(shí)候要移位發(fā)送數(shù)據(jù),只是根據(jù)SCLK來發(fā)送數(shù)據(jù)。
我們也可以這么理解,因?yàn)?strong>單片機(jī)內(nèi)部設(shè)置的是,發(fā)送數(shù)據(jù)時(shí)候才會(huì)產(chǎn)生相應(yīng)的SCLK,這時(shí)候從機(jī)知道了就會(huì)把寄存器中的數(shù)據(jù)發(fā)出來。我們?nèi)绻约哼M(jìn)行模擬的話,控制單片機(jī)或者FPGA發(fā)送SCLK就可以將從機(jī)的數(shù)據(jù)讀出來,而不用使用主機(jī)的發(fā)送數(shù)據(jù)命令。即:SCLK控制和協(xié)調(diào)一切。
我們以 ADS1298的讀取寄存器 這樣一個(gè)操作為例,主機(jī)使用STM32F103。
ADS1298讀取寄存器命令是這樣的:
我們用單片機(jī)控制的話,不能控制SCLK的產(chǎn)生,那我們就用寫數(shù)據(jù),來產(chǎn)生SCLK,讀取后面的REG DATA。至于OPCODE,我們就是直接發(fā)送了,為主機(jī)的有效數(shù)據(jù),就是說前兩個(gè)發(fā)送有效數(shù)據(jù),接收到的數(shù)據(jù)丟棄。第三個(gè)發(fā)送過程,發(fā)送數(shù)據(jù)隨便填寫,無效,而接受的數(shù)據(jù)為有效數(shù)據(jù),我們留起來用。
程序是這樣子寫的:
這是主程序里面的段落。
下面是讀寫子程序。
1、發(fā)送讀寄存器的地址
2、發(fā)送讀寄存器的個(gè)數(shù)
3、讀發(fā)回來的數(shù)據(jù)(如果讀寄存器的個(gè)數(shù)為n,那個(gè)就要有n個(gè)此條命令)
關(guān)于ADS1298,具體的還是要仔細(xì)閱讀其說明文檔。像我自己在做實(shí)驗(yàn)的時(shí)候,總是無法讀取出來正常的命令。通過示波器看到輸入線上的數(shù)據(jù)不對(duì),完全為0.。后來仔細(xì)的閱讀了其說明文檔,發(fā)現(xiàn)ADS1298在連續(xù)讀數(shù)據(jù)模式下,無法有效實(shí)現(xiàn)讀寄存器。然后在前面關(guān)閉了連續(xù)讀模式,就能夠成功的讀取到寄存器的數(shù)據(jù)了。
留此,以后翻閱。
評(píng)論