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

四、效果

  • 4
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值