linux spi驅動開發學習(三)-----spi_bitbang.c詳解
阿新 • • 發佈:2019-01-24
SPI介面在模式0下輸出第一位資料的時刻
SPI介面有四種不同的資料傳輸時序,取決於CPOL和CPHL這兩位的組合。圖1中表現了這四種時序,
時序與CPOL、CPHL的關係也可以從圖中看出。
只關注模式0的時序。
我們來關注SCK的第一個時鐘週期,在時鐘的前沿取樣資料(上升沿,第一個時鐘沿),
在時鐘的後沿輸出資料(下降沿,第二個時鐘沿)。首先來看主器件,主器件的輸出口(MOSI)輸出的資料bit1,
在時鐘的前沿被從器件取樣,那主器件是在何時刻輸出bit1的呢?bit1的輸出時刻實際上在SCK訊號有效以前,
比 SCK的上升沿還要早半個時鐘週期。bit1的輸出時刻與SSEL訊號沒有關係。再來看從器件,
主器件的輸入口MISO同樣是在時鐘的前沿取樣從器件輸出的bit1的,那從器件又是在何時刻輸出bit1的呢。
從器件是在SSEL訊號有效後,立即輸出bit1,儘管此時SCK訊號還沒有起效。關於上面的主器件
和從器件輸出bit1位的時刻,可以從圖3、4中得到驗證。
注意圖3中,CS訊號有效後(低電平有效,注意CS下降沿後發生的情況),故意用延時程式
延時了一段時間,之後再向資料暫存器寫入了要傳送的資料,來觀察主器件輸出bit1的情況(MOSI)。
可以看出,bit1(值為1)是在SCK訊號有效之前的半個時鐘週期的時刻開始輸出的(與CS訊號無關),
到了SCK的第一個時鐘週期的上升沿正好被從器件取樣。
第一個位元組的最後一位在SCK的上升沿被取樣,隨後的SCK下降沿,從器件就輸出了第二個位元組的第一位。
SPI介面有四種不同的資料傳輸時序,取決於CPOL和CPHL這兩位的組合。圖1中表現了這四種時序,
時序與CPOL、CPHL的關係也可以從圖中看出。
圖1
CPOL是用來決定SCK時鐘訊號空閒時的電平,CPOL=0,空閒電平為低電平,CPOL=1時,
空閒電平為高電平。CPHA是用來決定取樣時刻的,CPHA=0,在每個週期的第一個時鐘沿取樣,
CPHA=1,在每個週期的第二個時鐘沿取樣。
由於我使用的器件工作在模式0這種時序(CPOL=0,CPHA=0),所以將圖1簡化為圖2,只關注模式0的時序。
圖2
我們來關注SCK的第一個時鐘週期,在時鐘的前沿取樣資料(上升沿,第一個時鐘沿),
在時鐘的後沿輸出資料(下降沿,第二個時鐘沿)。首先來看主器件,主器件的輸出口(MOSI)輸出的資料bit1,
在時鐘的前沿被從器件取樣,那主器件是在何時刻輸出bit1的呢?bit1的輸出時刻實際上在SCK訊號有效以前,
比 SCK的上升沿還要早半個時鐘週期。bit1的輸出時刻與SSEL訊號沒有關係。再來看從器件,
主器件的輸入口MISO同樣是在時鐘的前沿取樣從器件輸出的bit1的,那從器件又是在何時刻輸出bit1的呢。
從器件是在SSEL訊號有效後,立即輸出bit1,儘管此時SCK訊號還沒有起效。關於上面的主器件
和從器件輸出bit1位的時刻,可以從圖3、4中得到驗證。
圖3
注意圖3中,CS訊號有效後(低電平有效,注意CS下降沿後發生的情況),故意用延時程式
延時了一段時間,之後再向資料暫存器寫入了要傳送的資料,來觀察主器件輸出bit1的情況(MOSI)。
可以看出,bit1(值為1)是在SCK訊號有效之前的半個時鐘週期的時刻開始輸出的(與CS訊號無關),
到了SCK的第一個時鐘週期的上升沿正好被從器件取樣。
圖4
圖4中,注意看CS和MISO訊號。我們可以看出,CS訊號有效後,從器件立刻輸出了bit1(值為1)。
通常我們進行的spi操作都是16位的。圖5記錄了第一個位元組和第二個位元組間的相互銜接的過程。第一個位元組的最後一位在SCK的上升沿被取樣,隨後的SCK下降沿,從器件就輸出了第二個位元組的第一位。
圖5
熟悉了spi 的工作時序,接著往下說