22.3
OLED相關
OLED,即有機發(fā)光二極管(OrganicLight-EmittingDiode),又稱為有機電激光顯示(OrganicElectroluminesence Display,OELD)。OLED由于同時具備自發(fā)光,不需背光源、對比度高、厚度薄、視角廣、反應速度快、可用于撓曲性面板、使用溫度范圍廣、構造及制程較簡單等優(yōu)異之特性,被認為是下一代的平面顯示器新興應用技術。OLED顯示技術具有自發(fā)光的特性,采用非常薄的有機材料涂層和玻璃基板,當有電流通過時,這些有機材料就會發(fā)光,而且OLED顯示屏幕可視角度大,并且能夠節(jié)省電能。
本文使用是0.96寸的OLED顯示模塊(藍色)作為實驗模塊,詳細資料可以在野火電子官網找到。實物如下所示:

? 分辨率為128*64
? 驅動IC芯片為SSD1306
? 4線SPI總線通信方式
原理圖如下:

22.3.1
接口協(xié)議
對于4線制SPI接口協(xié)議,其通信過程對于片選信號和數據/命令切換信號的要求如下圖所示:

通過設置CS引腳為低電平,我們可以確定器件為選中狀態(tài),設置其DC引腳不同的電平狀態(tài),來控制輸出的指令為地址指令還是數據指令。
SSD1306的4線制SPI通信的時序如下圖所示:

我們可以看到,CS信號線由高變低,是SPI通訊的起始信號,MOSI信號線負責傳輸數據,MOSI的數據在SCLK的下升沿或低電平期間變化輸出,在SCLK上降沿的時候,SDIN(MOSI)的數據有效,SDIN(MOSI) 將數據鎖存,高電平時表示數據“1”,為低電平時表示數據“0”。在其它時刻,數據無效。SSD1306芯片則根據DC信號線的電平狀態(tài),來區(qū)分接受到的指令是地址指令還是數據指令,最后,當數據/命令傳輸完畢后,CS信號線由低變高,解除對當前設備的選中狀態(tài),至此,一次數據傳輸完成。
22.3.2
顯存寫入方式
SSD1306的顯存寫入方式有三種,分別是頁地址模式,橫向地址模式和縱向地址模式。不同的地址模式下,把數據寫入顯存后,顯存的地址變化方式是不一樣的。我們這里選擇的是頁地址模式,在頁地址模式下,在發(fā)送完顯示數據后,列地址指針將增加。如果列地址指針到達列結束地址,則列地址指針為重置為列開始地址,而頁地址指針不更改,需要用戶設置新頁面,并且列地址為訪問下一頁顯存。
頁地址與列地址的移動順序如下圖所示:

22.3.3
命令字
關于SSD1306的基本命令字及說明如下表:
表1:SSD1306的基本命令字

22.4
SPI-OLED顯示實驗
野火啟明6M5開發(fā)板的擴展SPI接口電路圖如圖所示:

因為野火啟明4M2開發(fā)板的擴展SPI接口被下載調試引腳占用,故采用GPIO-軟件SPI的方式來測試實驗。
野火啟明4M2開發(fā)板的擴展OLED6線接口電路圖如圖所示:

野火啟明2L1開發(fā)板的擴展SPI接口電路圖如圖所示:

因為對于OLED模塊,主機只需要發(fā)送顯示數據,它也只需要接受顯示數據,所以我們只需要連接MOSI這條線即可。
表2:OLED模塊連接引腳分配

使用瑞薩官方提供的FPS庫進行編程,瑞薩官方提供的FPS庫具有方便、快捷、簡潔的特性。
22.4.1
新建工程
對于e2studio開發(fā)環(huán)境:拷貝一份我們之前的e2s 工程“05_Template”,然后將工程文件夾重命名為“SPI_OLED”,最后再將它導入到我們的e2studio工作空間中。
對于Keil開發(fā)環(huán)境:拷貝一份我們之前的Keil工程模板“05_Template”,然后將工程文件夾重命名為“SPI_OLED”,并進入該文件夾里面雙擊Keil工程文件,打開該工程。
工程新建好之后,在工程根目錄的“src”文件夾下面新建“spi_oled”文件夾,再進入“spi_oled”文件夾里面新建源文件和頭文件:“bsp_spi_oled.c”和“bsp_spi_oled.h”,并添加好字庫文件“codetab.h”,具體代碼見下。
整個工程文件結構如下:
列表1:文件結構
左右滑動查看完整內容
SPI_OLED ├─...... └─src ├─ spi_oled │ ├─ bsp_spi_oled.c │ ├─ bsp_spi_oled.h | └─ codetab.h └─ hal_entry.c
列表2:codetab.h
左右滑動查看完整內容
/************************************************************************************
* Description:
* 1. 128*64點整OLED模塊功能演示程序的字表;
* 2. 字表由打包資料中的“取字軟件”計算得出;
* 3. 取字方式 -- 共陰、列行式、逆向輸出
*
*
*************************************************************************************/
/***************************16*16的點陣字體取模方式:共陰——列行式——逆向輸出*********/
#ifndef __CODETAB_H__
#define __CODRTAB_H__
const unsigned char F16x16[] =
{
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*" ",0*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*" ",0*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*" ",0*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*" ",0*/
0x00,0xFE,0x92,0x92,0xFE,0x92,0x92,0xFE,0x00,0x42,0x4A,0xD2,0x6A,0x46,0xC0,0x00,
0x40,0xC4,0x44,0x44,0x3F,0x24,0x24,0x24,0x00,0x40,0x80,0x7F,0x00,0x01,0x00,0x00,/*"野",0*/
0x00,0x00,0xC0,0x38,0x00,0x00,0x00,0xFF,0x00,0x00,0x40,0x20,0x18,0x00,0x00,0x00,
0x80,0x81,0x40,0x20,0x10,0x0C,0x03,0x00,0x03,0x0C,0x10,0x20,0x40,0x80,0x80,0x00,/*"火",1*/
0x24,0x24,0xA4,0xFE,0xA3,0x22,0x00,0x22,0xCC,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,
0x08,0x06,0x01,0xFF,0x00,0x01,0x04,0x04,0x04,0x04,0x04,0xFF,0x02,0x02,0x02,0x00,/*"科",2*/
0x10,0x10,0x10,0xFF,0x10,0x90,0x08,0x88,0x88,0x88,0xFF,0x88,0x88,0x88,0x08,0x00,
0x04,0x44,0x82,0x7F,0x01,0x80,0x80,0x40,0x43,0x2C,0x10,0x28,0x46,0x81,0x80,0x00,/*"技",3*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*" ",6*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*" ",6*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*" ",7*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*" ",7*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*" ",0*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*" ",0*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*" ",0*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*" ",0*/
0x84,0x84,0xFC,0x84,0x84,0x40,0x5E,0x50,0x50,0x50,0xDF,0x50,0x50,0x50,0x5E,0x00,
0x10,0x30,0x1F,0x08,0x08,0x00,0xFE,0x02,0x02,0x7F,0x02,0x7E,0x02,0x82,0xFE,0x00,/*"瑞",0*/
0x04,0xE4,0x24,0x24,0xA4,0x6F,0x04,0x24,0x64,0xAF,0x34,0xA4,0x64,0x24,0x04,0x00,
0x00,0xFF,0x00,0x11,0x22,0x9C,0x40,0x3F,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x00,/*"薩",1*/
0x00,0x00,0xF8,0x88,0x88,0x88,0x88,0xFF,0x88,0x88,0x88,0x88,0xF8,0x00,0x00,0x00,
0x00,0x00,0x1F,0x08,0x08,0x08,0x08,0x7F,0x88,0x88,0x88,0x88,0x9F,0x80,0xF0,0x00,/*"電",2*/
0x80,0x82,0x82,0x82,0x82,0x82,0x82,0xE2,0xA2,0x92,0x8A,0x86,0x82,0x80,0x80,0x00,
0x00,0x00,0x00,0x00,0x00,0x40,0x80,0x7F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*"子",3*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*" ",6*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*" ",6*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*" ",7*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*" ",7*/
};
/************************************6*8的點陣************************************/
const unsigned char F6x8[][6] =
{
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,// sp
0x00, 0x00, 0x00, 0x2f, 0x00, 0x00,// !
0x00, 0x00, 0x07, 0x00, 0x07, 0x00,// "
0x00, 0x14, 0x7f, 0x14, 0x7f, 0x14,// #
0x00, 0x24, 0x2a, 0x7f, 0x2a, 0x12,// $
0x00, 0x62, 0x64, 0x08, 0x13, 0x23,// %
0x00, 0x36, 0x49, 0x55, 0x22, 0x50,// &
0x00, 0x00, 0x05, 0x03, 0x00, 0x00,// '
0x00, 0x00, 0x1c, 0x22, 0x41, 0x00,// (
0x00, 0x00, 0x41, 0x22, 0x1c, 0x00,// )
0x00, 0x14, 0x08, 0x3E, 0x08, 0x14,// *
0x00, 0x08, 0x08, 0x3E, 0x08, 0x08,// +
0x00, 0x00, 0x00, 0xA0, 0x60, 0x00,// ,
0x00, 0x08, 0x08, 0x08, 0x08, 0x08,// -
0x00, 0x00, 0x60, 0x60, 0x00, 0x00,// .
0x00, 0x20, 0x10, 0x08, 0x04, 0x02,// /
0x00, 0x3E, 0x51, 0x49, 0x45, 0x3E,// 0
0x00, 0x00, 0x42, 0x7F, 0x40, 0x00,// 1
0x00, 0x42, 0x61, 0x51, 0x49, 0x46,// 2
0x00, 0x21, 0x41, 0x45, 0x4B, 0x31,// 3
0x00, 0x18, 0x14, 0x12, 0x7F, 0x10,// 4
0x00, 0x27, 0x45, 0x45, 0x45, 0x39,// 5
0x00, 0x3C, 0x4A, 0x49, 0x49, 0x30,// 6
0x00, 0x01, 0x71, 0x09, 0x05, 0x03,// 7
0x00, 0x36, 0x49, 0x49, 0x49, 0x36,// 8
0x00, 0x06, 0x49, 0x49, 0x29, 0x1E,// 9
0x00, 0x00, 0x36, 0x36, 0x00, 0x00,// :
0x00, 0x00, 0x56, 0x36, 0x00, 0x00,// ;
0x00, 0x08, 0x14, 0x22, 0x41, 0x00,// <
0x00, 0x14, 0x14, 0x14, 0x14, 0x14,// =
0x00, 0x00, 0x41, 0x22, 0x14, 0x08,// >
0x00, 0x02, 0x01, 0x51, 0x09, 0x06,// ?
0x00, 0x32, 0x49, 0x59, 0x51, 0x3E,// @
0x00, 0x7C, 0x12, 0x11, 0x12, 0x7C,// A
0x00, 0x7F, 0x49, 0x49, 0x49, 0x36,// B
0x00, 0x3E, 0x41, 0x41, 0x41, 0x22,// C
0x00, 0x7F, 0x41, 0x41, 0x22, 0x1C,// D
0x00, 0x7F, 0x49, 0x49, 0x49, 0x41,// E
0x00, 0x7F, 0x09, 0x09, 0x09, 0x01,// F
0x00, 0x3E, 0x41, 0x49, 0x49, 0x7A,// G
0x00, 0x7F, 0x08, 0x08, 0x08, 0x7F,// H
0x00, 0x00, 0x41, 0x7F, 0x41, 0x00,// I
0x00, 0x20, 0x40, 0x41, 0x3F, 0x01,// J
0x00, 0x7F, 0x08, 0x14, 0x22, 0x41,// K
0x00, 0x7F, 0x40, 0x40, 0x40, 0x40,// L
0x00, 0x7F, 0x02, 0x0C, 0x02, 0x7F,// M
0x00, 0x7F, 0x04, 0x08, 0x10, 0x7F,// N
0x00, 0x3E, 0x41, 0x41, 0x41, 0x3E,// O
0x00, 0x7F, 0x09, 0x09, 0x09, 0x06,// P
0x00, 0x3E, 0x41, 0x51, 0x21, 0x5E,// Q
0x00, 0x7F, 0x09, 0x19, 0x29, 0x46,// R
0x00, 0x46, 0x49, 0x49, 0x49, 0x31,// S
0x00, 0x01, 0x01, 0x7F, 0x01, 0x01,// T
0x00, 0x3F, 0x40, 0x40, 0x40, 0x3F,// U
0x00, 0x1F, 0x20, 0x40, 0x20, 0x1F,// V
0x00, 0x3F, 0x40, 0x38, 0x40, 0x3F,// W
0x00, 0x63, 0x14, 0x08, 0x14, 0x63,// X
0x00, 0x07, 0x08, 0x70, 0x08, 0x07,// Y
0x00, 0x61, 0x51, 0x49, 0x45, 0x43,// Z
0x00, 0x00, 0x7F, 0x41, 0x41, 0x00,// [
0x00, 0x55, 0x2A, 0x55, 0x2A, 0x55,// 55
0x00, 0x00, 0x41, 0x41, 0x7F, 0x00,// ]
0x00, 0x04, 0x02, 0x01, 0x02, 0x04,// ^
0x00, 0x40, 0x40, 0x40, 0x40, 0x40,// _
0x00, 0x00, 0x01, 0x02, 0x04, 0x00,// '
0x00, 0x20, 0x54, 0x54, 0x54, 0x78,// a
0x00, 0x7F, 0x48, 0x44, 0x44, 0x38,// b
0x00, 0x38, 0x44, 0x44, 0x44, 0x20,// c
0x00, 0x38, 0x44, 0x44, 0x48, 0x7F,// d
0x00, 0x38, 0x54, 0x54, 0x54, 0x18,// e
0x00, 0x08, 0x7E, 0x09, 0x01, 0x02,// f
0x00, 0x18, 0xA4, 0xA4, 0xA4, 0x7C,// g
0x00, 0x7F, 0x08, 0x04, 0x04, 0x78,// h
0x00, 0x00, 0x44, 0x7D, 0x40, 0x00,// i
0x00, 0x40, 0x80, 0x84, 0x7D, 0x00,// j
0x00, 0x7F, 0x10, 0x28, 0x44, 0x00,// k
0x00, 0x00, 0x41, 0x7F, 0x40, 0x00,// l
0x00, 0x7C, 0x04, 0x18, 0x04, 0x78,// m
0x00, 0x7C, 0x08, 0x04, 0x04, 0x78,// n
0x00, 0x38, 0x44, 0x44, 0x44, 0x38,// o
0x00, 0xFC, 0x24, 0x24, 0x24, 0x18,// p
0x00, 0x18, 0x24, 0x24, 0x18, 0xFC,// q
0x00, 0x7C, 0x08, 0x04, 0x04, 0x08,// r
0x00, 0x48, 0x54, 0x54, 0x54, 0x20,// s
0x00, 0x04, 0x3F, 0x44, 0x40, 0x20,// t
0x00, 0x3C, 0x40, 0x40, 0x20, 0x7C,// u
0x00, 0x1C, 0x20, 0x40, 0x20, 0x1C,// v
0x00, 0x3C, 0x40, 0x30, 0x40, 0x3C,// w
0x00, 0x44, 0x28, 0x10, 0x28, 0x44,// x
0x00, 0x1C, 0xA0, 0xA0, 0xA0, 0x7C,// y
0x00, 0x44, 0x64, 0x54, 0x4C, 0x44,// z
0x14, 0x14, 0x14, 0x14, 0x14, 0x14,// horiz lines
};
/****************************************8*16的點陣************************************/
const unsigned char F8X16[] = {
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,// 0
0x00,0x00,0x00,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x33,0x30,0x00,0x00,0x00,//! 1
0x00,0x10,0x0C,0x06,0x10,0x0C,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//" 2
0x40,0xC0,0x78,0x40,0xC0,0x78,0x40,0x00,0x04,0x3F,0x04,0x04,0x3F,0x04,0x04,0x00,//# 3
0x00,0x70,0x88,0xFC,0x08,0x30,0x00,0x00,0x00,0x18,0x20,0xFF,0x21,0x1E,0x00,0x00,//$ 4
0xF0,0x08,0xF0,0x00,0xE0,0x18,0x00,0x00,0x00,0x21,0x1C,0x03,0x1E,0x21,0x1E,0x00,//% 5
0x00,0xF0,0x08,0x88,0x70,0x00,0x00,0x00,0x1E,0x21,0x23,0x24,0x19,0x27,0x21,0x10,//& 6
0x10,0x16,0x0E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//' 7
0x00,0x00,0x00,0xE0,0x18,0x04,0x02,0x00,0x00,0x00,0x00,0x07,0x18,0x20,0x40,0x00,//( 8
0x00,0x02,0x04,0x18,0xE0,0x00,0x00,0x00,0x00,0x40,0x20,0x18,0x07,0x00,0x00,0x00,//) 9
0x40,0x40,0x80,0xF0,0x80,0x40,0x40,0x00,0x02,0x02,0x01,0x0F,0x01,0x02,0x02,0x00,//* 10
0x00,0x00,0x00,0xF0,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x1F,0x01,0x01,0x01,0x00,//+ 11
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xB0,0x70,0x00,0x00,0x00,0x00,0x00,//, 12
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x01,0x01,0x01,0x01,//- 13
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00,0x00,0x00,//. 14
0x00,0x00,0x00,0x00,0x80,0x60,0x18,0x04,0x00,0x60,0x18,0x06,0x01,0x00,0x00,0x00,/// 15
0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x0F,0x10,0x20,0x20,0x10,0x0F,0x00,//0 16
0x00,0x10,0x10,0xF8,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,//1 17
0x00,0x70,0x08,0x08,0x08,0x88,0x70,0x00,0x00,0x30,0x28,0x24,0x22,0x21,0x30,0x00,//2 18
0x00,0x30,0x08,0x88,0x88,0x48,0x30,0x00,0x00,0x18,0x20,0x20,0x20,0x11,0x0E,0x00,//3 19
0x00,0x00,0xC0,0x20,0x10,0xF8,0x00,0x00,0x00,0x07,0x04,0x24,0x24,0x3F,0x24,0x00,//4 20
0x00,0xF8,0x08,0x88,0x88,0x08,0x08,0x00,0x00,0x19,0x21,0x20,0x20,0x11,0x0E,0x00,//5 21
0x00,0xE0,0x10,0x88,0x88,0x18,0x00,0x00,0x00,0x0F,0x11,0x20,0x20,0x11,0x0E,0x00,//6 22
0x00,0x38,0x08,0x08,0xC8,0x38,0x08,0x00,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x00,//7 23
0x00,0x70,0x88,0x08,0x08,0x88,0x70,0x00,0x00,0x1C,0x22,0x21,0x21,0x22,0x1C,0x00,//8 24
0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x00,0x31,0x22,0x22,0x11,0x0F,0x00,//9 25
0x00,0x00,0x00,0xC0,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00,//: 26
0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x60,0x00,0x00,0x00,0x00,//; 27
0x00,0x00,0x80,0x40,0x20,0x10,0x08,0x00,0x00,0x01,0x02,0x04,0x08,0x10,0x20,0x00,//< 28
0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x00,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x00,//= 29
0x00,0x08,0x10,0x20,0x40,0x80,0x00,0x00,0x00,0x20,0x10,0x08,0x04,0x02,0x01,0x00,//> 30
0x00,0x70,0x48,0x08,0x08,0x08,0xF0,0x00,0x00,0x00,0x00,0x30,0x36,0x01,0x00,0x00,//? 31
0xC0,0x30,0xC8,0x28,0xE8,0x10,0xE0,0x00,0x07,0x18,0x27,0x24,0x23,0x14,0x0B,0x00,//@ 32
0x00,0x00,0xC0,0x38,0xE0,0x00,0x00,0x00,0x20,0x3C,0x23,0x02,0x02,0x27,0x38,0x20,//A 33
0x08,0xF8,0x88,0x88,0x88,0x70,0x00,0x00,0x20,0x3F,0x20,0x20,0x20,0x11,0x0E,0x00,//B 34
0xC0,0x30,0x08,0x08,0x08,0x08,0x38,0x00,0x07,0x18,0x20,0x20,0x20,0x10,0x08,0x00,//C 35
0x08,0xF8,0x08,0x08,0x08,0x10,0xE0,0x00,0x20,0x3F,0x20,0x20,0x20,0x10,0x0F,0x00,//D 36
0x08,0xF8,0x88,0x88,0xE8,0x08,0x10,0x00,0x20,0x3F,0x20,0x20,0x23,0x20,0x18,0x00,//E 37
0x08,0xF8,0x88,0x88,0xE8,0x08,0x10,0x00,0x20,0x3F,0x20,0x00,0x03,0x00,0x00,0x00,//F 38
0xC0,0x30,0x08,0x08,0x08,0x38,0x00,0x00,0x07,0x18,0x20,0x20,0x22,0x1E,0x02,0x00,//G 39
0x08,0xF8,0x08,0x00,0x00,0x08,0xF8,0x08,0x20,0x3F,0x21,0x01,0x01,0x21,0x3F,0x20,//H 40
0x00,0x08,0x08,0xF8,0x08,0x08,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,//I 41
0x00,0x00,0x08,0x08,0xF8,0x08,0x08,0x00,0xC0,0x80,0x80,0x80,0x7F,0x00,0x00,0x00,//J 42
0x08,0xF8,0x88,0xC0,0x28,0x18,0x08,0x00,0x20,0x3F,0x20,0x01,0x26,0x38,0x20,0x00,//K 43
0x08,0xF8,0x08,0x00,0x00,0x00,0x00,0x00,0x20,0x3F,0x20,0x20,0x20,0x20,0x30,0x00,//L 44
0x08,0xF8,0xF8,0x00,0xF8,0xF8,0x08,0x00,0x20,0x3F,0x00,0x3F,0x00,0x3F,0x20,0x00,//M 45
0x08,0xF8,0x30,0xC0,0x00,0x08,0xF8,0x08,0x20,0x3F,0x20,0x00,0x07,0x18,0x3F,0x00,//N 46
0xE0,0x10,0x08,0x08,0x08,0x10,0xE0,0x00,0x0F,0x10,0x20,0x20,0x20,0x10,0x0F,0x00,//O 47
0x08,0xF8,0x08,0x08,0x08,0x08,0xF0,0x00,0x20,0x3F,0x21,0x01,0x01,0x01,0x00,0x00,//P 48
0xE0,0x10,0x08,0x08,0x08,0x10,0xE0,0x00,0x0F,0x18,0x24,0x24,0x38,0x50,0x4F,0x00,//Q 49
0x08,0xF8,0x88,0x88,0x88,0x88,0x70,0x00,0x20,0x3F,0x20,0x00,0x03,0x0C,0x30,0x20,//R 50
0x00,0x70,0x88,0x08,0x08,0x08,0x38,0x00,0x00,0x38,0x20,0x21,0x21,0x22,0x1C,0x00,//S 51
0x18,0x08,0x08,0xF8,0x08,0x08,0x18,0x00,0x00,0x00,0x20,0x3F,0x20,0x00,0x00,0x00,//T 52
0x08,0xF8,0x08,0x00,0x00,0x08,0xF8,0x08,0x00,0x1F,0x20,0x20,0x20,0x20,0x1F,0x00,//U 53
0x08,0x78,0x88,0x00,0x00,0xC8,0x38,0x08,0x00,0x00,0x07,0x38,0x0E,0x01,0x00,0x00,//V 54
0xF8,0x08,0x00,0xF8,0x00,0x08,0xF8,0x00,0x03,0x3C,0x07,0x00,0x07,0x3C,0x03,0x00,//W 55
0x08,0x18,0x68,0x80,0x80,0x68,0x18,0x08,0x20,0x30,0x2C,0x03,0x03,0x2C,0x30,0x20,//X 56
0x08,0x38,0xC8,0x00,0xC8,0x38,0x08,0x00,0x00,0x00,0x20,0x3F,0x20,0x00,0x00,0x00,//Y 57
0x10,0x08,0x08,0x08,0xC8,0x38,0x08,0x00,0x20,0x38,0x26,0x21,0x20,0x20,0x18,0x00,//Z 58
0x00,0x00,0x00,0xFE,0x02,0x02,0x02,0x00,0x00,0x00,0x00,0x7F,0x40,0x40,0x40,0x00,//[ 59
0x00,0x0C,0x30,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x06,0x38,0xC0,0x00,//\ 60
0x00,0x02,0x02,0x02,0xFE,0x00,0x00,0x00,0x00,0x40,0x40,0x40,0x7F,0x00,0x00,0x00,//] 61
0x00,0x00,0x04,0x02,0x02,0x02,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//^ 62
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,//_ 63
0x00,0x02,0x02,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//` 64
0x00,0x00,0x80,0x80,0x80,0x80,0x00,0x00,0x00,0x19,0x24,0x22,0x22,0x22,0x3F,0x20,//a 65
0x08,0xF8,0x00,0x80,0x80,0x00,0x00,0x00,0x00,0x3F,0x11,0x20,0x20,0x11,0x0E,0x00,//b 66
0x00,0x00,0x00,0x80,0x80,0x80,0x00,0x00,0x00,0x0E,0x11,0x20,0x20,0x20,0x11,0x00,//c 67
0x00,0x00,0x00,0x80,0x80,0x88,0xF8,0x00,0x00,0x0E,0x11,0x20,0x20,0x10,0x3F,0x20,//d 68
0x00,0x00,0x80,0x80,0x80,0x80,0x00,0x00,0x00,0x1F,0x22,0x22,0x22,0x22,0x13,0x00,//e 69
0x00,0x80,0x80,0xF0,0x88,0x88,0x88,0x18,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,//f 70
0x00,0x00,0x80,0x80,0x80,0x80,0x80,0x00,0x00,0x6B,0x94,0x94,0x94,0x93,0x60,0x00,//g 71
0x08,0xF8,0x00,0x80,0x80,0x80,0x00,0x00,0x20,0x3F,0x21,0x00,0x00,0x20,0x3F,0x20,//h 72
0x00,0x80,0x98,0x98,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,//i 73
0x00,0x00,0x00,0x80,0x98,0x98,0x00,0x00,0x00,0xC0,0x80,0x80,0x80,0x7F,0x00,0x00,//j 74
0x08,0xF8,0x00,0x00,0x80,0x80,0x80,0x00,0x20,0x3F,0x24,0x02,0x2D,0x30,0x20,0x00,//k 75
0x00,0x08,0x08,0xF8,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,//l 76
0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x00,0x20,0x3F,0x20,0x00,0x3F,0x20,0x00,0x3F,//m 77
0x80,0x80,0x00,0x80,0x80,0x80,0x00,0x00,0x20,0x3F,0x21,0x00,0x00,0x20,0x3F,0x20,//n 78
0x00,0x00,0x80,0x80,0x80,0x80,0x00,0x00,0x00,0x1F,0x20,0x20,0x20,0x20,0x1F,0x00,//o 79
0x80,0x80,0x00,0x80,0x80,0x00,0x00,0x00,0x80,0xFF,0xA1,0x20,0x20,0x11,0x0E,0x00,//p 80
0x00,0x00,0x00,0x80,0x80,0x80,0x80,0x00,0x00,0x0E,0x11,0x20,0x20,0xA0,0xFF,0x80,//q 81
0x80,0x80,0x80,0x00,0x80,0x80,0x80,0x00,0x20,0x20,0x3F,0x21,0x20,0x00,0x01,0x00,//r 82
0x00,0x00,0x80,0x80,0x80,0x80,0x80,0x00,0x00,0x33,0x24,0x24,0x24,0x24,0x19,0x00,//s 83
0x00,0x80,0x80,0xE0,0x80,0x80,0x00,0x00,0x00,0x00,0x00,0x1F,0x20,0x20,0x00,0x00,//t 84
0x80,0x80,0x00,0x00,0x00,0x80,0x80,0x00,0x00,0x1F,0x20,0x20,0x20,0x10,0x3F,0x20,//u 85
0x80,0x80,0x80,0x00,0x00,0x80,0x80,0x80,0x00,0x01,0x0E,0x30,0x08,0x06,0x01,0x00,//v 86
0x80,0x80,0x00,0x80,0x00,0x80,0x80,0x80,0x0F,0x30,0x0C,0x03,0x0C,0x30,0x0F,0x00,//w 87
0x00,0x80,0x80,0x00,0x80,0x80,0x80,0x00,0x00,0x20,0x31,0x2E,0x0E,0x31,0x20,0x00,//x 88
0x80,0x80,0x80,0x00,0x00,0x80,0x80,0x80,0x80,0x81,0x8E,0x70,0x18,0x06,0x01,0x00,//y 89
0x00,0x80,0x80,0x80,0x80,0x80,0x80,0x00,0x00,0x21,0x30,0x2C,0x22,0x21,0x30,0x00,//z 90
0x00,0x00,0x00,0x00,0x80,0x7C,0x02,0x02,0x00,0x00,0x00,0x00,0x00,0x3F,0x40,0x40,//{ 91
0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,//| 92
0x00,0x02,0x02,0x7C,0x80,0x00,0x00,0x00,0x00,0x40,0x40,0x3F,0x00,0x00,0x00,0x00,//} 93
0x00,0x06,0x01,0x01,0x02,0x02,0x04,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//~ 94
};
const unsigned char BMP1[] = {
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,
0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0xC0,0xE0,0xE0,0x70,0x70,0x70,0xE0,0xC0,0x80,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0xFF,0xFF,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF8,0xF8,0xF8,0x78,0x78,0x78,0xF8,
0xF8,0xF8,0xF8,0x78,0x78,0x78,0xF8,0xF8,0xF8,0xF8,0x00,0xF8,0xF8,0x78,0x78,0x78,
0x78,0x78,0x78,0x78,0x78,0xF8,0xF8,0xF8,0xF8,0xF8,0xF8,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,
0xFE,0xFE,0xFE,0xFE,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x70,0xE0,0x80,
0x00,0x00,0x00,0x00,0x3E,0xFF,0xC1,0xFF,0x7F,0x1F,0x7F,0xE6,0xE3,0xFF,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xE0,0xFE,
0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xF0,0xE0,0xE0,0xFF,
0xFF,0xFF,0xFF,0xE0,0xE0,0xE0,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x60,0xF8,0xF8,0xF8,
0xF8,0xE0,0xF8,0xFE,0xFF,0x7F,0x1F,0x07,0x03,0x01,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0xFC,0xFC,0xFC,0xFC,0xFC,0x18,0x00,0x00,0x00,0x00,0xFF,
0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xC0,0xE0,0xFC,0xFF,0xFF,
0x00,0x00,0x00,0x80,0x00,0x00,0x01,0x03,0x03,0x03,0x03,0x03,0x01,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xC0,0xE0,0xF0,0xF8,0xFE,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0x7F,0x0F,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0xC0,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xC1,0xC1,0xFF,
0xFF,0xFF,0xFF,0xC1,0xC1,0xC1,0xFF,0xFF,0xFF,0xFF,0xF8,0xF8,0xF8,0xF8,0xF9,0xF1,
0xF3,0xFF,0xFF,0xFF,0xFF,0xFF,0xF6,0xF0,0xF0,0xF0,0xF8,0xF8,0x38,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0xF0,0xFF,0xFF,0xFF,0xFF,0x07,0x00,0x00,0x00,0x00,0x00,0xFF,
0xFF,0xFF,0xFF,0xFF,0xF0,0x00,0x00,0x00,0xFC,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xE0,0xC0,0xE0,0xFF,0xFF,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x80,0xF0,0xFC,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x3F,0x8F,
0xE7,0xF3,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF0,0xFF,0xFF,0xFE,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC7,0xC7,0xC7,0xC7,0x87,0x83,0x87,
0xFF,0xFF,0xFF,0x83,0x83,0x87,0x87,0xC7,0xC7,0xC7,0x05,0x01,0x01,0x01,0x00,0x00,
0x00,0xFF,0xFF,0xFF,0xFF,0x00,0x78,0x7F,0x7F,0x7F,0x3F,0x01,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x0E,0x0F,0x0F,0x1F,0x1F,0x00,0x00,0x00,0x00,0x00,0xC0,0xFC,0xFF,
0xFF,0xFF,0x3F,0xFF,0xFF,0xFE,0xE0,0x80,0x00,0x00,0x01,0x07,0x07,0x0F,0x0F,0x1F,
0x1F,0x1F,0x0F,0x0F,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0xF8,0xFF,0x7F,0x7F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xC1,0x7C,0xFF,
0xFF,0xFF,0xF8,0xF0,0xE0,0xF0,0xF0,0xFC,0xFE,0xFF,0xFF,0xFF,0x7F,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x07,0x07,0x07,0x07,0x07,0x07,
0xFF,0xFF,0xFF,0x07,0x07,0x87,0x87,0x87,0xC7,0xC7,0xC0,0x00,0x00,0x00,0x00,0x00,
0x00,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xC0,0xE0,0xF8,0xFE,0xFF,0xFF,0x3F,
0x0F,0x01,0x00,0x03,0x1F,0x7F,0xFF,0xFF,0xFC,0xF8,0xE0,0xC0,0x80,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x07,0x0F,0x1F,0x3F,0x7F,0xFF,0xFF,0xFE,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x7F,0x7F,0x3F,0x0F,0x03,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0E,0x7E,0x7E,0x7E,0x3E,0x3E,0x3E,0x3E,0x1E,
0x1F,0x1F,0x1F,0x1F,0x1F,0x0F,0x0F,0x0F,0x0F,0x0F,0x03,0x30,0xF0,0xF0,0xE0,0xE0,
0xF0,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,
0xC0,0xE0,0xF0,0xF0,0xF8,0xFC,0xFE,0xFE,0xFF,0x7F,0x1F,0x0F,0x07,0x03,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x03,0x07,0x1F,0x3F,0x7F,0x7F,0xFF,0xFE,0xFC,
0xFC,0xF8,0xF8,0xF0,0x70,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,
0x01,0x01,0x01,0x01,0x01,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x07,0x07,
0x03,0x03,0x03,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x01,0x03,0x07,0x07,0x07,0x03,0x01,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x03,
0x03,0x07,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
};
#endif
22.4.2
FSP配置
因為啟明6M5/2L1開發(fā)板采用硬件SPI的方式,而啟明4M2開發(fā)板采用GPIO模擬SPI的方式進行實驗,所以FPS的配置也是不同的。
注解:關于硬件SPI與軟件SPI的區(qū)別:
軟件SPI:軟件SPI需要用IO口模擬時序,這個模擬過程全部由CPU完成,為了能穩(wěn)定的存入數據,可能插入軟件延時,這個時間在讀取數據量小的情況下不明顯,但是基本上你在讀取過程中其他非中斷、非異常程序是無法得到執(zhí)行的。
2.硬件SPI:硬件SPI數據存儲過程是不需要CPU參與的,程序中配置好SPI的訪問時序,開啟中斷,CPU就可以在中斷函數中搬移數據,省下了軟件模擬IO的存取時間。
下面以啟明6M5開發(fā)板為例,進行FSP配置。
首先打開 “41_SPI_OLED” 項目的 FSP 配置界面進行配置。
先配置CS,D/C引腳,在 FSP 配置界面里面點開 “Pins”-> “Poets”-> “P3”-> “P301” ,然后配置CS對應的IO引腳的 “Mode” 屬性配置為 “Output mode (Initial High)”, 表示該引腳默認輸出高電平,其他的屬性默認即可。 D/C引腳也是按照這樣進行配置。 啟明2L1開發(fā)板與其類似,只是需要配置的引腳號不一樣。 配置步驟如下圖所示:

配置SPI,在 FSP 配置界面里面點開 “Pins”-> “Peripherals”-> “Connectivity:SPI”-> “SPI0”,選擇A組并使能, 啟明2L1開發(fā)板與其類似,只是選擇的SPI模塊為SPI1,A組。 配置步驟如下圖所示:

接著在 FSP 配置界面里面依次點擊 “Stacks” -> “New Stack” -> “Connectivity” -> “SPI” 來添加SPI模塊, 配置步驟如下圖所示:

按照如下圖所示對 SPI 模塊屬性進行配置

SPI 模塊的屬性介紹如下:
SPI 屬性介紹| SPI屬性 | 描述 |
|---|---|
| Name | 模塊實例名。設置為g_spi0_flash |
| Channel | 通道。這里選擇spi0 |
| Receive Interrupt Priority | 接收中斷優(yōu)先級 |
| Transmit Buffer Empty Interrupt Priority | 發(fā)送緩存區(qū)空中斷優(yōu)先級 |
| Transfer Complete Interrupt Priority | 發(fā)送完成中斷優(yōu)先級 |
| Error Interrupt Priority | 錯誤中斷優(yōu)先級 |
| Operating Mode | 操作模式??蛇xSPI主機或從機 |
| Clock Phase | SPI時鐘相位(設置CPHA) |
| Clock Polarity | SPI時鐘極性(設置CPOL) |
| Mode Fault Error | 模式錯誤檢測。檢測主從模式沖突 |
| Bit Order | 位時序。MSB或LSB |
| Callback | 中斷回調函數。設置為spi_flash_callback |
| SPI Mode | SPI 模式。設置為SPI Operation |
| Full or Transmit Only Mode | 全雙工或僅發(fā)送模式選擇 |
| Slave Select Polarity | 從機選擇引腳極性。一般是低電平有效 |
| Select SSL(Slave Select) | 從機選擇信號 |
| MOSI Idle State | 總線空閑時 MOSI 電平 |
| Parity Mode | 極性模式 |
| Byte Swapping | 字節(jié)交換模式 |
| Bitrate | 比特率 |
| Clock Delay | 時鐘延遲 |
| SSL Negation Delay | SSL失效延遲 |
| Next Access Delay | 下一次訪問延遲 |
在 FSP 配置界面里面點開 “Pins”-> “Poets”-> “P0”-> “P007” ,然后配置IO引腳的 “Mode” 屬性配置為 “Output mode (Initial High)”, 表示該引腳默認輸出高電平,其他的屬性默認即可。其他三個引腳也是按照這樣進行配置。 配置步驟如下圖所示:

配置完成之后可以按下快捷鍵“Ctrl + S”保存, 最后點右上角的“Generate Project Content”按鈕,讓軟件自動生成配置代碼即可。
22.4.3.對于啟明6M5/2L1開發(fā)板的 “41_SPI_OLED” 工程:
當使用SPI接口時,我們通過 R_SPI_Write 這個函數,可以直接給我們的OLED模塊發(fā)送指令,進行相應的操作。 R_SPI_Write 的函數原型如下:
fsp_err_t R_SPI_Write (spi_ctrl_t * const p_api_ctrl,
void const * p_src,
uint32_t const length,
spi_bit_width_t const bit_width)
發(fā)送一個數組的數據,p_src 是指需要發(fā)送的數據,length 是指發(fā)送數據的個數,bit_width 是指每個要發(fā)送的數據的位寬。
中斷回調函數的原型已經在hal_data.h中進行了聲明,我們只需要對其進行定義即可。
/** Callback used by SPI Instance. */ #ifndef spi0_callback void spi0_callback(spi_callback_args_t * p_args); #endif
在本次實驗中,在中斷回調函數中,我們可以通過檢測發(fā)送完成事件來判斷SPI傳輸是否完成,并且還封裝了一個發(fā)送超時等待函數。
中斷回調函數
/** * @brief 中斷回調函數 * @param SPI中斷回調參數指針 * @retval 無 */ void spi0_callback(spi_callback_args_t *p_args) { if(p_args->event == SPI_EVENT_TRANSFER_COMPLETE) { g_transfer_complete = true; } } /** * @brief 發(fā)送超時等待函數 * @param 無 * @retval 無 */ static bool SPIWaitgtc(void) { unsigned short wTimeout = 100; while(!g_transfer_complete && wTimeout) { R_BSP_SoftwareDelay(1u, BSP_DELAY_UNITS_MICROSECONDS); wTimeout--; } g_transfer_complete = false; if(g_transfer_complete==false && wTimeout==0) return false; return true; }
當我們需要對OLED發(fā)送命令/數據時,通過將D/C引腳配置成低電平來確定發(fā)送的為命令指令,而需要發(fā)送數據時,將D/C引腳配置成高電平。
OLED發(fā)送命令/數據函數
void OLED_WrCmd(unsigned char cmd)
{
OLED_DC_Clr();
R_SPI_Write(&g_spi0_ctrl,&cmd,1,SPI_BIT_WIDTH_8_BITS);
SPIWaitgtc();
}
void OLED_WrDat(unsigned char dat)
{
OLED_DC_Set();
R_SPI_Write(&g_spi0_ctrl,&dat,1,SPI_BIT_WIDTH_8_BITS);
SPIWaitgtc();
}
對于CS與D/C引腳的操作我們也是封裝了宏
#define OLED_CS_Pin BSP_IO_PORT_03_PIN_01 #define OLED_CS_Clr() R_IOPORT_PinWrite(&g_ioport_ctrl, OLED_CS_Pin, BSP_IO_LEVEL_LOW) #define OLED_CS_Set() R_IOPORT_PinWrite(&g_ioport_ctrl, OLED_CS_Pin, BSP_IO_LEVEL_HIGH) #define OLED_DC_Pin BSP_IO_PORT_03_PIN_02 #define OLED_DC_Clr() R_IOPORT_PinWrite(&g_ioport_ctrl, OLED_DC_Pin, BSP_IO_LEVEL_LOW) #define OLED_DC_Set() R_IOPORT_PinWrite(&g_ioport_ctrl, OLED_DC_Pin, BSP_IO_LEVEL_HIGH)
最后我們來看一下OLED的初始化,開頭是通過 R_SPI_Open 函數來啟動SPI0,接著是對OLED的寄存器進行操作,這些參數不需要去了解,默認也不需要修改。
OLED初始化
void OLED_Init(void)
{
fsp_err_t err = FSP_SUCCESS;
err = R_SPI_Open(&g_spi0_ctrl,&g_spi0_cfg);//打開SPI模塊
assert(FSP_SUCCESS == err);
R_BSP_SoftwareDelay(500u, BSP_DELAY_UNITS_MILLISECONDS);//延時500ms
OLED_CS_Clr();
OLED_WrCmd(0xae);
OLED_WrCmd(0xae);//--turn off oled panel
OLED_WrCmd(0x00);//---set low column address
OLED_WrCmd(0x10);//---set high column address
OLED_WrCmd(0x40);//--set start line address Set Mapping RAM Display Start Line (0x00~0x3F)
OLED_WrCmd(0x81);//--set contrast control register
OLED_WrCmd(0xcf); // Set SEG Output Current Brightness
OLED_WrCmd(0xa1);//--Set SEG/Column Mapping 0xa0,0xa1
OLED_WrCmd(0xc8);//Set COM/Row Scan Direction 0xc0,0xc8
OLED_WrCmd(0xa6);//--set normal display
OLED_WrCmd(0xa8);//--set multiplex ratio(1 to 64)
OLED_WrCmd(0x3f);//--1/64 duty
OLED_WrCmd(0xd3);//-set display offset Shift Mapping RAM Counter (0x00~0x3F)
OLED_WrCmd(0x00);//-not offset
OLED_WrCmd(0xd5);//--set display clock divide ratio/oscillator frequency
OLED_WrCmd(0x80);//--set divide ratio, Set Clock as 100 Frames/Sec
OLED_WrCmd(0xd9);//--set pre-charge period
OLED_WrCmd(0xf1);//Set Pre-Charge as 15 Clocks & Discharge as 1 Clock
OLED_WrCmd(0xda);//--set com pins hardware configuration
OLED_WrCmd(0x12);
OLED_WrCmd(0xdb);//--set vcomh
OLED_WrCmd(0x40);//Set VCOM Deselect Level
OLED_WrCmd(0x20);//-Set Page Addressing Mode (0x00/0x01/0x02)
OLED_WrCmd(0x02);//
OLED_WrCmd(0x8d);//--set Charge Pump enable/disable
OLED_WrCmd(0x14);//--set(0x10) disable
OLED_WrCmd(0xa4);// Disable Entire Display On (0xa4/0xa5)
OLED_WrCmd(0xa6);// Disable Inverse Display On (0xa6/a7)
OLED_WrCmd(0xaf);//--turn on oled panel
OLED_Fill(0x00);//清屏
OLED_SetPos(0,0);
}
22.4.4.對于啟明4M2開發(fā)板的 “41_SPI_OLED” 工程:
對于四個要用來模擬SPI的引腳,我們也是封裝了宏
#define SPI_SCK_Pin BSP_IO_PORT_06_PIN_01 #define SPI_SCK_LOW() R_IOPORT_PinWrite(&g_ioport_ctrl, SPI_SCK_Pin, BSP_IO_LEVEL_LOW) #define SPI_SCK_HIGH() R_IOPORT_PinWrite(&g_ioport_ctrl, SPI_SCK_Pin, BSP_IO_LEVEL_HIGH) #define SPI_MOSI_Pin BSP_IO_PORT_06_PIN_02 #define SPI_MOSI_LOW() R_IOPORT_PinWrite(&g_ioport_ctrl, SPI_MOSI_Pin, BSP_IO_LEVEL_LOW) #define SPI_MOSI_HIGH() R_IOPORT_PinWrite(&g_ioport_ctrl, SPI_MOSI_Pin, BSP_IO_LEVEL_HIGH) #define SPI_CS_Pin BSP_IO_PORT_00_PIN_07 #define SPI_CS_LOW() R_IOPORT_PinWrite(&g_ioport_ctrl, SPI_CS_Pin, BSP_IO_LEVEL_LOW) #define SPI_CS_HIGH() R_IOPORT_PinWrite(&g_ioport_ctrl, SPI_CS_Pin, BSP_IO_LEVEL_HIGH) #define SPI_DC_Pin BSP_IO_PORT_00_PIN_08 #define SPI_DC_LOW() R_IOPORT_PinWrite(&g_ioport_ctrl, SPI_DC_Pin, BSP_IO_LEVEL_LOW) #define SPI_DC_HIGH() R_IOPORT_PinWrite(&g_ioport_ctrl, SPI_DC_Pin, BSP_IO_LEVEL_HIGH)
根據SSD1306的時序圖,在SCLK信號為地電平的時候,改變MOSI的電平狀態(tài),輸出完數據后將其拉高,延時一段時間后進行拉低SCLK,如此循環(huán)8次便可將一字節(jié)的數據傳輸出去。
OLED模擬SPI發(fā)送函數
/**
* @brief 模擬SPI發(fā)送數據函數
* @param data:待發(fā)送數據
* @retval 無
*/
void SPI_WriteByte(unsigned char data)
{
unsigned char i = 0;
unsigned char 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發(fā)送指令/數據函數與OLED發(fā)送指令數據函數類似,如下
OLED發(fā)送命令/數據函數
void OLED_WrCmd(unsigned char cmd)//寫命令
{
SPI_DC_LOW();
SPI_WriteByte(cmd);
}
void OLED_WrDat(unsigned char dat)//寫數據
{
SPI_DC_HIGH();
SPI_WriteByte(dat);
}
OLED的初始化,啟明4M2開發(fā)板與啟明6M5/2L1類似。
OLED初始化
void OLED_Init(void)
{
SPI_CS_HIGH();
SPI_SCK_HIGH();
R_BSP_SoftwareDelay(100u, BSP_DELAY_UNITS_MICROSECONDS);
SPI_CS_LOW();//拉高CS后拉低CS,選中OLED
OLED_WrCmd(0xae);
OLED_WrCmd(0xae);//--turn off oled panel
OLED_WrCmd(0x00);//---set low column address
OLED_WrCmd(0x10);//---set high column address
OLED_WrCmd(0x40);//--set start line address Set Mapping RAM Display Start Line (0x00~0x3F)
OLED_WrCmd(0x81);//--set contrast control register
OLED_WrCmd(0xcf); // Set SEG Output Current Brightness
OLED_WrCmd(0xa1);//--Set SEG/Column Mapping 0xa0,0xa1
OLED_WrCmd(0xc8);//Set COM/Row Scan Direction 0xc0,0xc8
OLED_WrCmd(0xa6);//--set normal display
OLED_WrCmd(0xa8);//--set multiplex ratio(1 to 64)
OLED_WrCmd(0x3f);//--1/64 duty
OLED_WrCmd(0xd3);//-set display offset Shift Mapping RAM Counter (0x00~0x3F)
OLED_WrCmd(0x00);//-not offset
OLED_WrCmd(0xd5);//--set display clock divide ratio/oscillator frequency
OLED_WrCmd(0x80);//--set divide ratio, Set Clock as 100 Frames/Sec
OLED_WrCmd(0xd9);//--set pre-charge period
OLED_WrCmd(0xf1);//Set Pre-Charge as 15 Clocks & Discharge as 1 Clock
OLED_WrCmd(0xda);//--set com pins hardware configuration
OLED_WrCmd(0x12);
OLED_WrCmd(0xdb);//--set vcomh
OLED_WrCmd(0x40);//Set VCOM Deselect Level
OLED_WrCmd(0x20);//-Set Page Addressing Mode (0x00/0x01/0x02)
OLED_WrCmd(0x02);//
OLED_WrCmd(0x8d);//--set Charge Pump enable/disable
OLED_WrCmd(0x14);//--set(0x10) disable
OLED_WrCmd(0xa4);// Disable Entire Display On (0xa4/0xa5)
OLED_WrCmd(0xa6);// Disable Inverse Display On (0xa6/a7)
OLED_WrCmd(0xaf);//--turn on oled panel
OLED_Fill(0x00);
OLED_SetPos(0,0);
}
22.4.5.hal_entry函數
在hal_entry函數中,初始化OLED。
hal_entry.c
void hal_entry(void)
{
/* TODO: add your own code here */
unsigned char i;
extern const unsigned char 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,(unsigned char *)"www.embedfire.com");
OLED_8x16Str(0,2,(unsigned char *)"Wildfire Tech");
OLED_8x16Str(10,4,(unsigned char *)"SPI-OLED");
R_BSP_SoftwareDelay(4u, BSP_DELAY_UNITS_SECONDS);
OLED_CLS();
//顯示圖片
OLED_BMP(0,0,128,8,(unsigned char *)BMP1);
R_BSP_SoftwareDelay(4u, BSP_DELAY_UNITS_SECONDS);
}
#if BSP_TZ_SECURE_BUILD
/* Enter non-secure code */
R_BSP_NonSecureEnter();
#endif
}
在循環(huán)中點亮屏幕,2秒后熄滅屏幕,然后使用 OLED_16x16CN 函數顯示中文,使用 OLED_6x8Str 函數測試6*8字符,使用 OLED_8x16Str函數測試8*16字符,最后只用 OLED_BMP 函數測試BMP位圖顯示。
把代碼下載后,可以看到OLED屏幕上由 清屏-> 顯示中文 -> 顯示英文 -> 顯示圖片 的順序循環(huán)顯示。
啟明6M5/2L1開發(fā)板 SPI_OLED 實驗現(xiàn)象:

啟明4M2開發(fā)板 SPI_OLED 實驗現(xiàn)象:

-
OLED
+關注
關注
121文章
6357瀏覽量
233603 -
發(fā)光二極管
+關注
關注
14文章
1243瀏覽量
69108 -
瑞薩
+關注
關注
37文章
22481瀏覽量
90821 -
SPI
+關注
關注
17文章
1885瀏覽量
101179 -
顯示模塊
+關注
關注
1文章
56瀏覽量
23971
原文標題:OLED及SPI-OLED顯示實驗——瑞薩RA系列FSP庫開發(fā)實戰(zhàn)指南(72)
文章出處:【微信號:瑞薩嵌入式小百科,微信公眾號:瑞薩嵌入式小百科】歡迎添加關注!文章轉載請注明出處。
發(fā)布評論請先 登錄
瑞薩RA系列FSP庫開發(fā)實戰(zhàn)指南之SPI通訊協(xié)議的物理層和協(xié)議層簡介
瑞薩RA系列FSP庫開發(fā)實戰(zhàn)指南之SPI的OLED屏幕顯示實驗
評論