天天看點

5個函數搞定IO口模拟SPI通信

5個函數搞定IO口模拟SPI通信

《《《《《正文》》》》》

5個函數搞定IO口模拟SPI通信

添加子產品的第一件事當然是要知道支援什麼通信,上面就是一個支援SPI的子產品,手冊中都會有時序圖,包括一些參數的要求,這裡隻做SPI的程式設計思路,以下代碼主要提供一個程式設計思路;

拿到這個波形時序圖就基本可以開始寫了;确定CPOL=0、及CPHA=1;即CLK極性為低,第二個CLK時鐘沿變化采樣資料;

《初始化IO函數》

void BSP_SPI_Init(void){    Gpio_InitIO(SPI_NSS_GPIO,SPI_CS_PIN, GpioDirOut); //輸出模式    Gpio_InitIO(SPI_CLK_GPIO,SPI_CLK_PIN, GpioDirOut);//輸出模式    Gpio_InitIO(SPI_MOSI_GPIO,SPI_MISO_PIN, GpioDirOut);//輸出模式    Gpio_InitIO(SPI_MISO_GPIO,SPI_MOSI_PIN, GpioDirIn);//輸入模式    SPI_CLK_0(); //時鐘空閑狀态位低,有CPOL決定    SPI_MOSI_1(); //必須拉高,釋放MOSI的使用權,    SPI_CS_1();//拉高,預設不選擇, 拉低為有效}      

《單位元組發送函數》

///******************************************************************************//* 函  數://* 功  能:spi協定發送單位元組資料//* 參  數:p:資料指針//* 傳回值:無//* 備  注:無//*******************************************************************************/static void BSP_SPI_SendByte(uint8_t *p){    uint8_t pdata = *p;    uint8_t i;    SPI_CS_0(); //片選
    for(i=0;i<8;i++)    {      SPI_CLK_1(); //拉高CLK      Delay_1us(); //延時      if(((pdata>>(7-i))&0x01))//準備資料,一位一位傳輸      {          SPI_MOSI_1();      }      else      {          SPI_MOSI_0();      }      Delay_1us();      SPI_CLK_0(); //資料采樣,就是這個時間點通知對方采集線上的資料      Delay_1us();    }    SPI_CS_1();   //片選   }      
///******************************************************************************//* 函  數://* 功  能:spi協定接收單位元組資料//* 參  數:p:資料指針//* 傳回值:無//* 備  注:無//*******************************************************************************/static void BSP_SPI_RecvByte(uint8_t *p) {      uint8_t tmp = 0u;      uint8_t i;      SPI_CS_0();   //片選      for(i=0;i<8;i++)      {            SPI_CLK_1();//拉高CLK            Delay_1us();            if(SPI_MISO_Get()) //讀取MISO上發送方準備的資料            {                tmp  = (tmp<<1)|0x01u;            }            else            {                tmp  = (tmp<<1)|0x00u;            }          Delay_1us();          SPI_CLK_0();//接收資料          Delay_1us();       }       *p = tmp;      SPI_CS_1(); }      

《多位元組接收函數》

///******************************************************************************//* 函  數://* 功  能:spi協定發送多個資料//* 參  數:pData:資料指針 size:資料長度//* 傳回值:無//* 備  注:無//*******************************************************************************/void HAL_SPI_Transmit(uint8_t *pData, uint8_t size){  uint8_t i;  for(i=0;i<size;i++)  {    BSP_SPI_SendByte(pData);    pData++;  }}      
///******************************************************************************//* 函  數://* 功  能:spi協定接收多個資料//* 參  數:pData:資料指針 size:資料長度//* 傳回值:無//* 備  注:無//*******************************************************************************/void HAL_SPI_Recevice(uint8_t *pData, uint8_t size){  uint8_t i;  for(i=0;i<size;i++)  {    BSP_SPI_RecvByte(pData);    pData++;  }}