在驅動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標志
這里是個坑,踩了一次希望后面不再有第二次。
