根據SSD1306的時序圖,在SCLK信號為地電平的時候,改變MOSI的電平狀態,輸出完數據后將其拉高,延時一段時間后進行拉低SCLK,如此循環8次便可將一字節的數據傳輸出去。
列表6:OLED模擬SPI發送函數
/*** @brief 模擬 SPI 發送數據函數* @param data: 待發送數據* @retval 無*/voidSPI_WriteByte(unsignedchar data){unsignedchar i = 0;unsignedchar temp = 0;for(i=0; i<8; i++){temp = ((data&0x80)==0x80)? 1:0;data = data<<1;SPI_SCK_LOW();if(temp){SPI_MOSI_HIGH();}else{SPI_MOSI_LOW();}R_BSP_SoftwareDelay(1u, BSP_DELAY_UNITS_MICROSECONDS);SPI_SCK_HIGH();R_BSP_SoftwareDelay(1u, BSP_DELAY_UNITS_MICROSECONDS);}SPI_SCK_HIGH();}
同樣的,模擬的OLED發送指令/數據函數與OLED發送指令數據函數類似,如下
列表7:OLED發送命令/數據函數
voidOLED_WrCmd(unsigned charcmd)//寫命令{SPI_DC_LOW();SPI_WriteByte(cmd);}voidOLED_WrDat(unsigned chardat)//寫數據{SPI_DC_HIGH();SPI_WriteByte(dat);}
OLED的初始化,啟明4M2開發板與啟明6M5/2L1類似。
列表8:OLED初始化
voidOLED_Init(void){SPI_CS_HIGH();SPI_SCK_HIGH();R_BSP_SoftwareDelay(100u,BSP_DELAY_UNITS_MICROSECONDS);SPI_CS_LOW();//拉高CS后拉低CS,選中OLEDOLED_WrCmd(0xae);OLED_WrCmd(0xae);//--turnoffoledpanelOLED_WrCmd(0x00);//---setlowcolumnaddressOLED_WrCmd(0x10);//---sethighcolumnaddressOLED_WrCmd(0x40);//--setstartlineaddress SetMappingRAMDisplay?→StartLine(0x00~0x3F)OLED_WrCmd(0x81);//--setcontrastcontrolregisterOLED_WrCmd(0xcf);//SetSEGOutputCurrentBrightness
您可掃描下方二維碼或復制鏈接到瀏覽器查看全部內容。
https://doc.embedfire.com/mcu/renesas/fsp_ra/zh/latest/index.html


hal_entry函數
在hal_entr 函數中,初始化OLED。
列表9:hal_entry.c
voidhal_entry(void){/* TODO: add your own code here */unsignedchar i;externconstunsignedchar BMP1[];OLED_Init();//初始化while(1){OLED_Fill(0xff);//填充屏幕R_BSP_SoftwareDelay(2u, BSP_DELAY_UNITS_SECONDS);OLED_CLS();//清屏for(i=0; i<8; i++)//通過點陣顯示漢字-- i 表示子表中漢字的位置{OLED_16x16CN(i*16,0,i);OLED_16x16CN(i*16,4,i+8);}R_BSP_SoftwareDelay(2u, BSP_DELAY_UNITS_SECONDS);OLED_CLS();//顯示不同字體大小的英文OLED_6x8Str(0,1,(unsignedchar *)"www.embedfire.com");OLED_8x16Str(0,2,(unsignedchar *)"Wildfire Tech");OLED_8x16Str(10,4,(unsignedchar *)"SPI-OLED");R_BSP_SoftwareDelay(4u, BSP_DELAY_UNITS_SECONDS);OLED_CLS();//顯示圖片OLED_BMP(0,0,128,8,(unsignedchar *)BMP1);R_BSP_SoftwareDelay(4u, BSP_DELAY_UNITS_SECONDS);}/* Enter non-secure code */R_BSP_NonSecureEnter();}
在循環中點亮屏幕,2秒后熄滅屏幕,然后使用OLED_16x16CN函數顯示中文,使用OLED_6x8Str函數測試6*8字符,使用OLED_8x16Str函數測試8*16字符,最后只用OLED_BMP函數測試BMP位圖顯示。
把代碼下載后,可以看到OLED屏幕上由清屏->顯示中文->顯示英文->顯示圖片的順序循環顯示。
啟明6M5/2L1開發板SPI_OLED實驗現象:

啟明4M2開發板SPI_OLED實驗現象:

如您在使用瑞薩MCU/MPU產品中有任何問題,可識別下方二維碼或復制網址到瀏覽器中打開,進入瑞薩技術論壇尋找答案或獲取在線技術支持。
https://community-ja.renesas.com/zh/forums-groups/mcu-mpu/
未完待續
推薦閱讀
對于啟明6M5/2L1/4M2開發板的“41_SPI_OLED”工程——瑞薩RA系列FSP庫開發實戰指南(75)
FSP配置——瑞薩RA系列FSP庫開發實戰指南(74)
SPI-OLED完整工程文件結構——瑞薩RA系列FSP庫開發實戰指南(73)

