SPI讀寫總結
阿新 • • 發佈:2018-12-29
SPI協議是主從模式:從機不主動發起訪問,總是被動執行操作。
CSN:片選訊號。
SCK:時鐘訊號。
MOSI:master output slave input,即主機輸出從機輸入。可以理解主機寫從裝置。
MISO:master input slave output,即主機輸入從機輸出。可以理解主機讀從裝置。
SPI全稱:Serial Peripheral interface,即序列外圍裝置介面。SPI協議自然是序列地傳輸資料,每次
按 1 bit讀寫裝置,而不是像並行每次1byte(8bit)傳輸。
nRF24L01支援標準SPI四線介面。以nRF24L01晶片的PDF為例說明SPI的基本讀寫。
如圖示為SPI讀時序和寫時序。按照讀寫時序輸出位元組(MOSI)就會從MSB 迴圈輸出,同將輸入位元組(MISO)從LSB 迴圈移入,每次移動一位。
顯然對於nRF24L01來說上升沿輸入,下降沿輸出。也即是說:MCU在時鐘訊號的上升沿時寫(write),下降沿時讀(read).
單位元組讀時序:
nRF24L01暫存器寫入函式:
注:可以整合讀寫程式如下:
Freedomxura原創,歡迎指正與轉載,請註明出處,http://xurafreedom.cublog.cn
<script>window._bd_share_config={"common":{"bdSnsKey":{},"bdText":"","bdMini":"2","bdMiniList":false,"bdPic":"","bdStyle":"0","bdSize":"16"},"share":{}};with(document)0[(getElementsByTagName('head')[0]||body).appendChild(createElement('script')).src='http://bdimg.share.baidu.com/static/api/js/share.js?v=89860593.js?cdnversion='+~(-new Date()/36e5)];</script> 閱讀(1) | 評論(0) | 轉發(0) | 給主人留下些什麼吧!~~ 評論熱議
CSN:片選訊號。
SCK:時鐘訊號。
MOSI:master output slave input,即主機輸出從機輸入。可以理解主機寫從裝置。
MISO:master input slave output,即主機輸入從機輸出。可以理解主機讀從裝置。
SPI全稱:Serial Peripheral interface,即序列外圍裝置介面。SPI協議自然是序列地傳輸資料,每次
按 1 bit讀寫裝置,而不是像並行每次1byte(8bit)傳輸。
nRF24L01支援標準SPI四線介面。以nRF24L01晶片的PDF為例說明SPI的基本讀寫。
如圖示為SPI讀時序和寫時序。按照讀寫時序輸出位元組(MOSI)就會從MSB 迴圈輸出,同將輸入位元組(MISO)從LSB 迴圈移入,每次移動一位。
顯然對於nRF24L01來說上升沿輸入,下降沿輸出。也即是說:MCU在時鐘訊號的上升沿時寫(write),下降沿時讀(read).
單位元組讀時序:
- /*
-
** 函式名 : SPI_Read_OneByte
-
** 返回值 : temp--SPI讀取的一位元組資料
-
** 參 數 : None
-
** 描 述 : 下降沿讀資料,每次讀取 1 bit
-
*/
-
uint8 SPI_Read_OneByte(void)
-
{
-
uint8 i;
-
uint8 temp = 0;
-
for(i=0;i<8;i++)
-
{
-
temp <<= 1; //讀取MISO 8次輸入的值,存入temp。之所以不放在“SCK = 0”語句之後的位置是因為:
-
/
-
SCK = 1;
-
if(MISO) //讀取最高位,儲存至最末尾,通過左移位完成讀整個位元組
-
temp |= 0x01;
-
else
-
temp &= ~0x01;
- SCK = 0; //下降沿來了(SCK從1-->0),MISO上的資料將發生改變,穩定後讀取存入temp
-
}
-
return temp;
- }
- /*
-
** 函式名 : SPI_Write_OneByte
-
** 返回值 : None
-
** 參 數 :
-
** 描 述 : 上升沿寫資料,每次寫入 1 bit
-
*/
-
void SPI_Write_OneByte(uint8 u8_writedata)
-
{
-
uint8 i;
-
for(i=0;i<8;i++)
-
{
-
if(u8_writedata & 0x80) //判斷最高位,總是傳送最高位
-
MOSI_ON; //MOSI輸出1,資料匯流排準備資料1
-
else
- MOSI_OFF; //MOSI輸出0,資料匯流排準備資料0
- SCK = 1; //上升沿來了(SCK從0-->1),資料匯流排上的資料寫入到器件
-
u8_writedata <<= 1; //左移拋棄已經輸出的最高位
- SCK = 0; //拉低SCK訊號,初始化為0
-
}
- }
nRF24L01暫存器寫入函式:
- /*
-
** 函式名: nRF24L01_WriteReg
-
** 返回值: None
-
** 參 數 : (1)uint8 addr--暫存器地址
-
** (2)uint8 value--寫入值
-
** 說 明 : nRF24L01暫存器寫函式
-
*/
-
void nRF24L01_WriteReg(uint8 addr, uint8 value)
-
{
-
CSN_OFF(); //CS片選拉低
-
SPI_Write_OneByte(addr|WR); //SPI寫地址命令
-
SPI_Write_OneByte(value); //SPI寫資料
-
CSN_ON(); //CS片選拉高
- }
- /*
-
** 函式名: nRF24L01_ReadReg
-
** 返回值: value--讀取暫存器值
-
** 參 數 : addr--暫存器地址
-
** 說 明 : nRF24L01暫存器讀函式
-
*/
-
uint8 nRF24L01_ReadReg(uint8 addr)
-
{
-
uint8 value;
- CSN_OFF(); //CS片選拉低
- SPI_Write_OneByte(addr|RR); //SPI寫地址命令
- value = SPI_Read_OneByte(); //SPI讀資料
- CSN_ON(); //CS片選拉高
-
return value;
- }
注:可以整合讀寫程式如下:
- /*
-
** 函式名 : SPI_WriteAndRead_OneByte
-
** 返回值 : u8_readdata--SPI讀取的一位元組資料
-
** 參 數 : u8_writedata--SPI寫入的一位元組資料
-
** 描 述 : 上升沿寫,下降沿讀
-
*/
-
uint8 SPI_WriteAndRead_OneByte(uint8 u8_writedata)
-
{
-
uint8 i;
-
uint8 u8_readdata = 0x00;
-
for(i=0;i<8;i++)
-
{
-
u8_readdata <<= 1; //讀取MISO 8次輸入的值,存入u8_readdata。
-
if(u8_writedata & 0x80) //判斷最高位,總是寫最高位(輸出最高位)
- MOSI_ON; //MOSI輸出1,資料匯流排準備資料1
-
else
- MOSI_OFF; //MOSI輸出0,資料匯流排準備資料0
-
u8_writedata <<= 1; //左移拋棄已經輸出的最高位
- SCK = 1; //上升沿來了(SCK從0-->1),資料匯流排上的資料寫入器件
-
if(MISO) //讀取最高位,儲存至最末尾,通過左移位完成讀整個位元組
-
u8_readdata |= 0x01;
-
else
-
u8_readdata &= ~0x01;
- SCK = 0; //下降沿來了(SCK從1-->0),MISO上將產生新的資料,讀取存入u8——readdata
-
}
-
return u8_readdata;
- }
Freedomxura原創,歡迎指正與轉載,請註明出處,http://xurafreedom.cublog.cn
<script>window._bd_share_config={"common":{"bdSnsKey":{},"bdText":"","bdMini":"2","bdMiniList":false,"bdPic":"","bdStyle":"0","bdSize":"16"},"share":{}};with(document)0[(getElementsByTagName('head')[0]||body).appendChild(createElement('script')).src='http://bdimg.share.baidu.com/static/api/js/share.js?v=89860593.js?cdnversion='+~(-new Date()/36e5)];</script> 閱讀(1) | 評論(0) | 轉發(0) | 給主人留下些什麼吧!~~ 評論熱議