亚洲一区爱区精品无码_无码熟妇人妻AV_日本免费一区二区三区最新_国产AV寂寞骚妇

_SPI通信協(xié)議SPI總線學(xué)習(xí)11篇

時間:2022-12-14 18:07:05 綜合范文

  下面是范文網(wǎng)小編收集的_SPI通信協(xié)議SPI總線學(xué)習(xí)11篇,供大家品鑒。

_SPI通信協(xié)議SPI總線學(xué)習(xí)11篇

_SPI通信協(xié)議SPI總線學(xué)習(xí)1

*********************************************/

  unsigned char SPI_Receiver_Dat(void)

{

  unsigned char n ,dat,bit_t;

  for(n=0;n<8;n++)

{

SCK_D(1);

dat<<=1;

if(MISO_I())dat|=0x01;

else dat&=0xfe;

SCK_D(0);

}

SCK_D(0);

return dat;

}

#endif

/**********************************************

_SPI通信協(xié)議SPI總線學(xué)習(xí)2

  1):高速、同步、全雙工、非差分、總線式

  2):主從機(jī)通信模式

_SPI通信協(xié)議SPI總線學(xué)習(xí)3

  1):SPI的通信原理很簡單,它以主從方式工作,這種模式通常有一個主設(shè)備和一個或多

  個從設(shè)備,需要至少4根線,事實上3根也可以(單向傳輸時)。也是所有基于SPI的設(shè)備共

  有的,它們是SDI(數(shù)據(jù)輸入)、SDO(數(shù)據(jù)輸出)、SCLK(時鐘)、CS(片選)。

(1)SDO/MOSI – 主設(shè)備數(shù)據(jù)輸出,從設(shè)備數(shù)據(jù)輸入;

(2)SDI/MISO – 主設(shè)備數(shù)據(jù)輸入,從設(shè)備數(shù)據(jù)輸出;

(3)SCLK – 時鐘信號,由主設(shè)備產(chǎn)生;

(4)CS/SS – 從設(shè)備使能信號,由主設(shè)備控制。當(dāng)有多個從設(shè)備的時候,因為每個從設(shè)

  備上都有一個片選引腳接入到主設(shè)備機(jī)中,當(dāng)我們的主設(shè)備和某個從設(shè)備通信時將需

  要將從設(shè)備對應(yīng)的片選引腳電平拉低或者是拉高。

  2):需要說明的是,我們SPI通信有4種不同的模式,不同的從設(shè)備可能在出廠是就是配

  置為某種模式,這是不能改變的;但我們的通信雙方必須是工作在同一模式下,所以我們

  可以對我們的主設(shè)備的SPI模式進(jìn)行配置,通過CPOL(時鐘極性)和CPHA(時鐘相位)來

  控制我們主設(shè)備的通信模式,具體如下:

  Mode0:CPOL=0,CPHA=0

  Mode1:CPOL=0,CPHA=1

  Mode2:CPOL=1,CPHA=0

  Mode3:CPOL=1,CPHA=1

  時鐘極性CPOL是用來配置SCLK的電平出于哪種狀態(tài)時是空閑態(tài)或者有效態(tài),時鐘相位CPHA

  是用來配置數(shù)據(jù)采樣是在第幾個邊沿:

  CPOL=0,表示當(dāng)SCLK=0時處于空閑態(tài),所以有效狀態(tài)就是SCLK處于高電平時

  CPOL=1,表示當(dāng)SCLK=1時處于空閑態(tài),所以有效狀態(tài)就是SCLK處于低電平時

  CPHA=0,表示數(shù)據(jù)采樣是在第1個邊沿,數(shù)據(jù)發(fā)送在第2個邊沿

  CPHA=1,表示數(shù)據(jù)采樣是在第2個邊沿,數(shù)據(jù)發(fā)送在第1個邊沿

  例如:

  CPOL=0,CPHA=0:此時空閑態(tài)時,SCLK處于低電平,數(shù)據(jù)采樣是在第1個邊沿,也就是

  SCLK由低電平到高電平的跳變,所以數(shù)據(jù)采樣是在上升沿,數(shù)據(jù)發(fā)送是在下降沿。

  CPOL=0,CPHA=1:此時空閑態(tài)時,SCLK處于低電平,數(shù)據(jù)發(fā)送是在第1個邊沿,也就是

  SCLK由低電平到高電平的跳變,所以數(shù)據(jù)采樣是在下降沿,數(shù)據(jù)發(fā)送是在上升沿。

  CPOL=1,CPHA=0:此時空閑態(tài)時,SCLK處于高電平,數(shù)據(jù)采集是在第1個邊沿,也就是

  SCLK由高電平到低電平的跳變,所以數(shù)據(jù)采集是在下降沿,數(shù)據(jù)發(fā)送是在上升沿。

  CPOL=1,CPHA=1:此時空閑態(tài)時,SCLK處于高電平,數(shù)據(jù)發(fā)送是在第1個邊沿,也就是

  SCLK由高電平到低電平的跳變,所以數(shù)據(jù)采集是在上升沿,數(shù)據(jù)發(fā)送是在下降沿。

  需要注意的是:我們的主設(shè)備能夠控制時鐘,因為我們的SPI通信并不像UART或者IIC通信

  那樣有專門的通信周期,有專門的通信起始信號,有專門的通信結(jié)束信號;所以我們的

  SPI協(xié)議能夠通過控制時鐘信號線,當(dāng)沒有數(shù)據(jù)交流的時候我們的時鐘線要么是

  保持高電平要么是保持低電平。

_SPI通信協(xié)議SPI總線學(xué)習(xí)4

***********************************************/

#if _CPOL==1&&_CPHA==0 //MODE 1 0

  void SPI_Send_Dat(unsigned char dat)

{

  unsigned char n;

  for(n=0;n<8;n++)

{

SCK_D(1);

if(dat&0x80)MOSI_D(1);

else MOSI_D(0);

dat<<=1;

SCK_D(0);

}

SCK_D(1);

}

/*********************************************

_SPI通信協(xié)議SPI總線學(xué)習(xí)5

***********************************************/

#if _CPOL==1&&_CPHA==1 //MODE 1 1

  void SPI_Send_Dat(unsigned char dat)

{

  unsigned char n;

  SCK_D(1);

  for(n=0;n<8;n++)

{

SCK_D(0);

if(dat&0x80)MOSI_D(1);

else MOSI_D(0);

dat<<=1;

SCK_D(1);

}

}

/************************************

_SPI通信協(xié)議SPI總線學(xué)習(xí)6

*********************************************/

#if _CPOL==0&&_CPHA==1 //MODE 0 1

  void SPI_Send_Dat(unsigned char dat)

{

  unsigned char n;

  SCK_D(0);

  for(n=0;n<8;n++)

{

SCK_D(1);

if(dat&0x80)MOSI_D(1);

else MOSI_D(0);

dat<<=1;

SCK_D(0);

}

}

/*********************************************

_SPI通信協(xié)議SPI總線學(xué)習(xí)7

  沒有指定的流控制,沒有應(yīng)答機(jī)制確認(rèn)是否接收到數(shù)據(jù),所以跟IIC總線協(xié)議比較在數(shù)據(jù)

  可靠性上有一定的缺陷。

_SPI通信協(xié)議SPI總線學(xué)習(xí)8

*********************************************/

  unsigned char SPI_Receiver_Dat(void)

{

  unsigned char n ,dat,bit_t;

  for(n=0;n<8;n++)

{

SCK_D(0);

dat<<=1;

if(MISO_I())dat|=0x01;

else dat&=0xfe;

SCK_D(1);

}

SCK_D(0);

return dat;

}

#endif

/*********************************************

_SPI通信協(xié)議SPI總線學(xué)習(xí)9

  支持全雙工通信

  通信簡單

  數(shù)據(jù)傳輸速率塊

_SPI通信協(xié)議SPI總線學(xué)習(xí)10

***********************************************/

#if _CPOL==0&&_CPHA==0 //MODE 0 0

  void SPI_Send_Dat(unsigned char dat)

{

  unsigned char n;

  for(n=0;n<8;n++)

{

SCK_D(0);

if(dat&0x80)MOSI_D(1);

else MOSI_D(0);

dat<<=1;

SCK_D(1);

}

SCK_D(0);

}

/*********************************************

_SPI通信協(xié)議SPI總線學(xué)習(xí)11

*********************************************/

  unsigned char SPI_Receiver_Dat(void)

{

  unsigned char n ,dat,bit_t;

  for(n=0;n<8;n++)

{

SCK_D(1);

dat<<=1;

if(MISO_I())dat|=0x01;

else dat&=0xfe;

SCK_D(0);

}

SCK_D(1);

return dat;

}

#endif

/**********************************************

_SPI通信協(xié)議SPI總線學(xué)習(xí)11篇相關(guān)文章: