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