适用于 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);
}
}