admin管理员组文章数量:1794759
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语言视角来理解SPI 内容由林淑君副主任自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.xiehuijuan.com/baike/1686892637a115179.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论