STM32F103 使用硬件SPI单线TX发数据来驱动OLED


在驱动OLED时,通常使用CS/SI/SCK三线,时序满足SPI时序,但STM32的SPI有四线NSS/MOSI/SCK/MISO,这里MISO没有用到。因此可以使用SPI的单线发送模式进行驱动OLED。

关键代码如下:

 1    SPI_InitStructure.SPI_Direction = SPI_Direction_1Line_Tx;  //设置SPI单向
 2     SPI_InitStructure.SPI_Mode = SPI_Mode_Master;            //设置SPI工作模式:设置为主SPI
 3     SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;          //设置SPI的数据大小:SPI发送接收8位帧结构
 4     SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;              //串行同步时钟的空闲状态为低电平
 5     SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;            //串行同步时钟的第1个跳变沿(上升或下降)数据被采样
 6     SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;                //NSS信号由硬件(NSS管脚)还是软件(使用SSI位)管理
 7     SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_8;        //定义波特率预分频的值:波特率预分频值为8
 8     SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;        //指定数据传输从MSB位还是LSB位开始:数据传输从MSB位开始
 9     SPI_Init(SPI2, &SPI_InitStructure);

但是,经试验发现单线模式下在发送数据时不能使用SPI_I2S_FLAG_TXE来判断发送完成,只能使用SPI_I2S_FLAG_BSY标志来判断设备是否空闲。

SPI2->DR = byte;
    while((SPI2->SR & SPI_I2S_FLAG_BSY) != RESET);  //等待SPI忙完,这里不能使用SPI_I2S_FLAG_TXE发送完成标志,只能使用SPI_I2S_FLAG_BSY标志 

这里是个坑,踩了一次希望后面不再有第二次。


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM