使用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 */
};

四、效果

作者:抓住一切的美好,顶峰见

物联沃分享整理
物联沃-IOTWORD物联网 » 使用STM32标准库SPI驱动OLED显示字符、字符串和汉字

发表回复