使用STM32标准库SPI驱动OLED显示字符、字符串和汉字
目录
一、什么SPI?
1、通信原理
2、连接方式
3、SPI接口特性
4、SPI时序图
5、SPI特征
6、配置主从模式
7、主或从模式下(BIDIMODE=0并且RXONLY=0)全双工发送和接收过程模式
二、1.5寸SSD1327OLED屏
1、控制接口
2、硬件连接
3、产品参数
4、工作原理
三、显示字符、字符串、汉字
1、显示字符
2、显示字符串
3、显示汉字
4、取模软件
四、效果
一、什么SPI?
串行外设接口(Serial Peripheral Interface ,SPI)是由美国摩托罗拉公司提出的一种高速全双工串行同步通信接口,首先出现在M68HC系列处理器中,由于其简单方便,成本低廉,传输速度快,因此被其他半导体厂商广泛使用,从而成为事实上的标准。
1、通信原理
作为全双工同步串行通信接口,SPI采用主/从模式(master/slave),支持一个或多个从设备,能够实现主设备和从设备之间的快速数据通信。SPI存在无法检查纠错、不具备寻址能力和接收方没有应答信号等缺点,不适合复杂或者可靠性要求较高的场合。
2、连接方式
SPI在物理层体现为4条信号线:SCK、MOSI(SDI)、MISO(SDO)、SS
支持一主一从和一主多从互连方式
一主一从:将主设备的SS置高电平,从设备的SS接地,主从设备的两条数据线直连
一主多从:其他从设备的时钟和数据线都应该保持高阻态,避免影响数据的传输。
3、SPI接口特性
4、SPI时序图
5、SPI特征
●
3线全双工同步
传输
● 带或不带第三根双向数据线的双线单工同步传输
●
8或16位
传输帧格式选择
●
主或从
操作
● 支持
多主
模式
●
8
个主模式波特率预分频系数
(
最大为
f
PCLK
/2)
● 从模式频率
(
最大为
f
PCLK
/2)
● 主模式和从模式的快速通信
● 主模式和从模式下均可以由软件或硬件进行
NSS
管理:主
/
从操作模式的动态改变
●
可编程
的时钟
极性和相位
● 可编程的数据顺序,
MSB
在
前
或
LSB
在
前
● 可触发中断的专用发送和接收标志
●
SPI
总线忙状态标志
● 支持可靠通信的硬件
CRC
─
在发送模式下,
CRC
值可以被作为最后一个字节发送
─
在全双工模式中对接收到的最后一个字节自动进行
CRC
校验
● 可触发中断的主模式故障、过载以及
CRC
错误标志
●
支持DMA功能
的
1
字节发送和接收缓冲器:产生发送和接受请求
6、配置主从模式
配置从模式:
1.
设置
DFF
位以定义数据帧格式为
8
位或
16
位。
2.
选择
CPOL
和
CPHA
位来定义数据传输和串行时钟之间的相位关系
(
见图
212)
。为保证正确
的数据传输,从设备和主设备的
CPOL
和
CPHA
位必须配置成相同的方式。
3.
帧格式
(SPI_CR1
寄存器中的
LSBFIRST
位定义的
”MSB
在前
”
还是
”LSB
在前
”)
必须与主设备
相同。
4.
硬件模式下
(
参考从选择
(NSS)
脚管理部分
)
,在完整的数据帧
(8
位或
16
位
)
传输过程中,
NSS
引脚必须为低电平。在
NSS
软件模式下,设置
SPI_CR1
寄存器中的
SSM
位并清除
SSI
位。
5.
清除
MSTR
位、设置
SPE
位
(SPI_CR1
寄存器
)
,使相应引脚工作于
SPI
模式下。
在这个配置中,
MOSI
引脚是数据输入,
MISO
引脚是数据输出。
配置主模式:
1.
通过
SPI_CR1
寄存器的
BR[2:0]
位定义串行时钟波特率。
2.
选择
CPOL
和
CPHA
位,定义数据传输和串行时钟间的相位关系
(
见图
212)
。
3.
设置
DFF
位来定义
8
位或
16
位数据帧格式。
4.
配置
SPI_CR1
寄存器的
LSBFIRST
位定义帧格式。
5.
如果需要
NSS
引脚工作在输入模式,硬件模式下,在整个数据帧传输期间应把
NSS
脚连接
到高电平;在软件模式下,需设置
SPI_CR1
寄存器的
SSM
位和
SSI
位。如果
NSS
引脚工作
在输出模式,则只需设置
SSOE
位。
6.
必须设置
MSTR
位和
SPE
位
(
只当
NSS
脚被连到高电平,这些位才能保持置位
)
。
在这个配置中,
MOSI
引脚是数据输出,而
MISO
引脚是数据输入。
7、主或从模式下(BIDIMODE=0并且RXONLY=0)全双工发送和接收过程模式
软件必须遵循下述过程,发送和接收数据
1.
设置
SPE
位为
’1’
,使能
SPI
模块;
2.
在
SPI_DR
寄存器中写入第一个要发送的数据,这个操作会清除
TXE
标志;
3.
等待
TXE=1
,然后写入第二个要发送的数据。等待
RXNE=1
,然后读出
SPI_DR
寄存器并
获得第一个接收到的数据,读
SPI_DR
的同时清除了
RXNE
位。重复这些操作,发送后续
的数据同时接收
n-1
个数据;
4.
等待
RXNE=1
,然后接收最后一个数据;
5.
等待
TXE=1
,在
BSY=0
之后关闭
SPI
模块。
也可以在响应
RXNE
或
TXE
标志的上升沿产生的中断的处理程序中实现这个过程。
图
213
主模式、全双工模式下
(BIDIMODE=0
并且
RXONLY=0)
连续传输时,
TXE/RXNE/BSY
的变化示意图
从模式、全双工模式下
(BIDIMODE=0
并且
RXONLY=0)
连续传输时,
TXE/RXNE/BSY
的变化示意图
二、1.5寸SSD1327OLED屏
1、控制接口
VCC(电源正)、GND(电源地)、DIN(数据输入)、CLK(始终信号输入)、CS(片选)、DC(数据/命令,低电平表示命令,高电平表示数据)、RST(复位,低电平有效)
2、硬件连接
SCK引脚(SCL) B13
MOSI引脚(SDA) B15
CS(NSS) B12
DC A9
RST A8
外加 3.3V 和 GND
3、产品参数
支持接口4线SPI/IIC,分辨率128*128,显示尺寸1.5寸,显示颜色16位灰度,工作电压3.3V/5v
4、工作原理
支持8bit 8080并行、8bit 6080并行、三线SPI、四线SPI以及I2C控制,由于并行控制会浪费IO口,三线SPI不常用,因此模块可选择四线SPI以及I2C控制
5、OLED写命令
static void OLED_WriteReg(u8 Reg) { OLED_DC_0; OLED_CS_0; SPIWriteByte(Reg); OLED_CS_1; }
6、OLED写数据
static void OLED_WriteData(u8 Data) { OLED_DC_1; OLED_CS_0; SPIWriteByte(Data); OLED_CS_1; }
7、引脚初始化
void OLED_Pin_Init(){ GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOA , ENABLE); GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Pin=GPIO_Pin_12 ; GPIO_Init(GPIOB,&GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin=GPIO_Pin_8 | GPIO_Pin_9; GPIO_Init(GPIOA,&GPIO_InitStructure); }
8、OLED初始化
/*初始化1.5寸128 128带灰阶spi串口,驱动芯片SSD1327*/ void OLED_Init(){ //让时钟线输出高电平 OLED_RST_1; delay_ms(100); OLED_RST_0; delay_ms(100); OLED_RST_1; delay_ms(200); OLED_WriteReg(0xae);//--turn off oled panel OLED_WriteReg(0x15); // set column address OLED_WriteReg(0x00); // start column 0 OLED_WriteReg(0x7f); // end column 127 OLED_WriteReg(0x75); // set row address OLED_WriteReg(0x00); // start row 0 OLED_WriteReg(0x7f); // end row 127 OLED_WriteReg(0x81); // set contrast control OLED_WriteReg(0x80); OLED_WriteReg(0xa0); // gment remap OLED_WriteReg(0x51); //51 OLED_WriteReg(0xa1); // start line OLED_WriteReg(0x00); OLED_WriteReg(0xa2); // display offset OLED_WriteReg(0x00); OLED_WriteReg(0xa4); // rmal display OLED_WriteReg(0xa8); // set multiplex ratio OLED_WriteReg(0x7f); OLED_WriteReg(0xb1); // set phase leghth OLED_WriteReg(0xf1); OLED_WriteReg(0xb3); // set dclk OLED_WriteReg(0x00); //80Hz:0xc1 90Hz:0xe1 100Hz:0x00 110Hz:0x30 120Hz:0x50 130Hz:0x70 01 OLED_WriteReg(0xab); // OLED_WriteReg(0x01); // OLED_WriteReg(0xb6); // set phase leghth OLED_WriteReg(0x0f); OLED_WriteReg(0xbe); OLED_WriteReg(0x0f); OLED_WriteReg(0xbc); OLED_WriteReg(0x08); OLED_WriteReg(0xd5); OLED_WriteReg(0x62); OLED_WriteReg(0xfd); OLED_WriteReg(0x12); }
9、更新显示
三、显示字符、字符串、汉字
1、显示字符
2、显示字符串
3、显示汉字
4、取模软件
const CH_CN Font12CN_Table[] = { {"团", 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x7F,0xFE,0x40,0x02, 0x40,0x42,0x40,0x42,0x5F,0xFA,0x40,0xC2, 0x41,0x42,0x46,0x42,0x4C,0x42,0x70,0x42, 0x43,0xC2,0x40,0x02,0x7F,0xFE,0x40,0x02, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, }, {"源", 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x40,0x00,0x27,0xFF,0x14,0x10, 0x04,0x20,0x44,0xFE,0x24,0x82,0x14,0xFE, 0x04,0x82,0x24,0xFE,0x24,0x10,0x24,0x54, 0x28,0x92,0x49,0x13,0x5A,0x11,0x50,0x70, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, }, }; cFONT Font12CN = { Font12CN_Table, sizeof(Font12CN_Table)/sizeof(CH_CN), /*size of table*/ 11, /* ASCII Width */ 16, /* Width */ 21, /* Height */ };
四、效果
作者:抓住一切的美好,顶峰见