软件 SPI 驱动
软件 SPI 驱动

软件 SPI 驱动

适用于 GD32 系列,可以很方便的移植到其它平台

使用软件实现的 SPI 驱动,在这里记录避免每次都重新编写一遍。

延时函数可以为空,也可以用延时函数。对于高速 MCU,如果速度过快,可以使用延时函数控制传输速度。

用户需要自行配置、控制片选信号。

//宏定义
#define CLK_SET()   gpio_bit_set(GPIOB, GPIO_PIN_13)
#define CLK_CLR()   gpio_bit_reset(GPIOB, GPIO_PIN_13)
#define MOSI_SET()  gpio_bit_set(GPIOB, GPIO_PIN_15)
#define MOSI_CLR()  gpio_bit_reset(GPIOB, GPIO_PIN_15)
#define GET_MISO()  gpio_input_bit_get(GPIOB, GPIO_PIN_14)
//#define SPI_DELAY() DelayNus(1)
#define SPI_DELAY()

//初始化
void InitSPI(void)
{
  rcu_periph_clock_enable(RCU_GPIOB);
  gpio_init(GPIOB, GPIO_MODE_OUT_PP, GPIO_OSPEED_MAX, GPIO_PIN_13 | GPIO_PIN_15);
  gpio_init(GPIOB, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_MAX, GPIO_PIN_14);
  gpio_bit_set(GPIOB, GPIO_PIN_13 | GPIO_PIN_15);
}

//读写函数
unsigned char SPIReadWriteByte(unsigned char data)
{
  unsigned char i, output;

  //返回值清零
  output = 0;
  
  //循环发送
  for(i = 0; i < 8; i++)
  {
    //设置 MOSI 输出
    if(data & 0x80)
    {
      MOSI_SET();
    }
    else
    {
      MOSI_CLR();
    }
    
    //拉低时钟线
    CLK_CLR();
    SPI_DELAY();
    
    //拉高时钟线
    CLK_SET();
    SPI_DELAY();

    //获取 MOSI 输入
    output = (output << 1) | GET_MISO();

    //发送下一位
    data = data << 1;
  }
  
  //让数据线也回归到高电平
  MOSI_SET();

  //返回
  return output;
}

//批量发函数
void SPIWriteMultiple(unsigned char* buf, unsigned int len)
{
  unsigned int i;
  for(i  = 0; i < len; i++)
  {
    SPIReadWriteByte(buf[i]);
  }
}

//批量读函数
void SPIReadMultiple(unsigned char* buf, unsigned int len)
{
  unsigned int i;
  for(i  = 0; i < len; i++)
  {
    buf[i] = SPIReadWriteByte(0xFF);
  }
}