在使用0.96寸的OLED時,發現之前的代碼不能正常通過單片機的IIC使用DMA進行刷新,刷新時總是錯一位,后來查閱資料發現是現在的OLED使用了SSD1315替換了SSD1306控制芯片,貼一下各個初始化過程,方便記錄:
SSD1306初始化:
1 /** 2 * @brief OLED初始化 3 * @param None 4 * @retval None. 5 */ 6 void OLED_Init(void) 7 { 8 #if SENDDTA_DMA 9 I2C_DMA_WriteReg( (uint8_t*)OLED_Init_CMD, OLED_ADDRESS,OLED_WriteCom_Addr,sizeof(OLED_Init_CMD)); //sizeof(OLED_Init_CMD) 10 #else 11 // DelayMs(100); //這里的延時很重要 12 delay_ms(10); 13 WriteCmd(0xAE); //display off 14 WriteCmd(0x20); //Set Memory Addressing Mode 15 WriteCmd(0x10); //00,Horizontal Addressing Mode;01,Vertical Addressing Mode;10,Page Addressing Mode (RESET);11,Invalid 16 WriteCmd(0xb0); //Set Page Start Address for Page Addressing Mode,0-7 17 WriteCmd(0xc8); //Set COM Output Scan Direction 18 WriteCmd(0x00); //---set low column address 19 WriteCmd(0x10); //---set high column address 20 WriteCmd(0x40); //--set start line address 21 WriteCmd(0x81); //--set contrast control register 22 WriteCmd(0xff); //亮度調節 0x00~0xff 23 WriteCmd(0xa1); //--set segment re-map 0 to 127 24 WriteCmd(0xa6); //--set normal display 25 WriteCmd(0xa8); //--set multiplex ratio(1 to 64) 26 WriteCmd(0x3F); // 27 WriteCmd(0xa4); //0xa4,Output follows RAM content;0xa5,Output ignores RAM content 28 WriteCmd(0xd3); //-set display offset 29 WriteCmd(0x00); //-not offset 30 WriteCmd(0xd5); //--set display clock divide ratio/oscillator frequency 31 WriteCmd(0xf0); //--set divide ratio 32 WriteCmd(0xd9); //--set pre-charge period 33 WriteCmd(0x22); // 34 WriteCmd(0xda); //--set com pins hardware configuration 35 WriteCmd(0x12); 36 WriteCmd(0xdb); //--set vcomh 37 WriteCmd(0x20); //0x20,0.77xVcc 38 WriteCmd(0x8d); //--set DC-DC enable 39 WriteCmd(0x14); // 40 WriteCmd(0xaf); //--turn on oled panel 41 #endif 42 }
這里使用默認是刷新方式,按照頁寫數據沒有問題,使用DMA時需要把照尋址方式修改為了水平尋址時就出現了刷新數據不對的問題
為此,我直接使用了網絡上默認的方式對DMA發送指令進行初始化
const uint8_t OLED_Init_CMD[] = { 0xAE,0x00,0x10,0x40,0xB0,0x81,0xFF,0xA1,0xA6,0xA8, 0x3F,0xC8,0xD3,0x00,0xD5,0x80,0xD8,0x05,0xD9,0xF1, 0xDA,0x12,0xDB,0x30,0x8D,0x14,0xAF,0x20,0x00 };
發現使用改方式刷新SSD1315類型的OLED時會出問題,對其進行修改:
const uint8_t OLED_Init_CMD[] = { 0xae,0x00,0x10,0x40,0x81,0xcf,0xa1,0xc8,0xa6,0xa8, 0x3f,0xd3,0x00,0xd5,0x80,0xd9,0xf1,0xda,0x12,0xdb, 0x40,0x20,0x00,0x8d,0x14,0xa4,0xa6,0xaf };
立刻正常,看來兩個片子的工作模式還是有些區別的