C语言视角来理解SPI

C语言视角来入门看SPI
SPI—串行外设接口—Serial Peripheral Interface。
四个关键词:全双工,同步,四根线,主从。
简单通俗解释SPI是什么,其实就是就是MCU引脚的众多功能中的一种通信功能。这种通信功能是一种即时的通信方式,就是主机呼叫从机,从机会立马给予回应。
从C语言角度区分通常的使用情况的话,在从机支持spi通信方式前提下,可以简单的区分为MCU使用的引脚支持spi功能和MCU使用的引脚不支持spi功能。
1.MCU使用的引脚支持spi功能,这是最常见的情况。
这是一个简单的SPI读写函数,这是一个oled的读写,因为此时的使用的MCU的引脚支持spi功能,那么很简单只要从库函数里面找几个函数简单写一下就ok。
uint8_t SPI2_RD_WR(uint8_t senddat)
{
//发送功能
while(SPI_I2S_GetFlagStatus(SPI2,SPI_I2S_FLAG_TXE)==RESET);
SPI_I2S_SendData(SPI2,senddat);
//接收功能
while(SPI_I2S_GetFlagStatus(SPI2,SPI_I2S_FLAG_RXNE)==RESET);
return SPI_I2S_ReceiveData(SPI2);
}
OLED的接发函数完成之后便可以使用它去按照时序要求去接发数据,按照时序写出真正的接发程序。
void OLED_SendDat(uint8_t dat)
{
OLED_CS_Low;
OLED_DC_High;
SPI2_RD_WR(dat);
OLED_CS_High;
}

void OLED_SendCmd(uint8_t dat)
{
OLED_CS_Low;
OLED_DC_Low;
SPI2_RD_WR(dat);
OLED_CS_High;
}

另外一种情况,这是个SD的读写,我们使用的是hal库,这也是一个常见的用spi的读写函数,区别就是这是用cube配置完成的,所以用的现成函数是hal库里的。
uint8_t SD_SPI_ReadWriteByte(uint8_t data)
{
uint8_t revDat=0;
HAL_SPI_TransmitReceive(&hspi2,&data,&revDat,1,100);
return revDat;
}

同理SD的接发函数完成之后便可以使用它去按照时序要求去接发数据,按照时序写出真正的接发程序。

2.MCU的引脚不支持spi功能
这种情况下无法使用现成的MCU各种库里的函数,只能自己去软件模仿spi的功能去编辑一个程序。这个程序的主要体现的就是,实时通信。下面例子是一个简单的对触摸屏的,单字节发收,发收。
uint8_t SPI_SendRev(uint8_t sendDat)
{
uint8_t revDat=0;
uint8_t i=0;
T_SCK(0);
for(i=0;i<8;i++)
{
if(sendDat&(0x01<<(7-i)))
T_MOSI(1);
else
T_MOSI(0);
Delay_us(1);
T_SCK(1);
revDat<<=1;
if(T_MISO)
revDat|=0x01;
Delay_us(1);
T_SCK(0);
}
return revDat;
}

这种情况区别别于上述两种情况的最大的区别就是,没有库里现成的接发函数能用的函数,必须用软件进行实现,实现完成之后再将其应用于其他子程序中。例如下面的TOUCH屏例子。
uint16_t TouchXY_Read(uint8_t cmd)
{
uint16_t Val;
T_CS(0);
SPI_SendRev(cmd);//0xD0–X 0x90–Y
Delay_us(5);
Val = SPI_SendRev(0x00)<<8;
Val |= SPI_SendRev(0x00);
T_CS(1);
return Val>>4;
}
作为一个新手初识spi只知它的传送功能,但是从内部感觉却一无所知,故停下来作此文,自觉从此角度去理解还较清晰,但学无止境,己见终偏颇,欢迎指教。

你可能感兴趣的:(C)