🎬 秋野酱:《个人主页》
🔥 个人专栏:《Java专栏》《Python专栏》
⛺️心若有所向往,何惧道阻且长
文章目录
SPI协议
SPI(Serial Peripheral Interface)是一种同步串行通信协议,用于在嵌入式系统中连接微控制器(MCU)和外围设备(如传感器、存储器、显示器等)。SPI协议需要4根线进行数据传输,分别是:
● SCLK:时钟信号线,由主设备控制时序,用于同步数据传输。
● MOSI:主设备输出从设备输入线,主设备通过该线向从设备发送数据。
● MISO:主设备输入从设备输出线,从设备通过该线向主设备发送数据。
● SS:从设备片选线,用于选择与主设备通信的从设备。(其他叫法CS)
SPI协议支持全双工通信,意味着主设备和从设备可以同时发送和接收数据。SPI协议传输数据时采用的是先进先出的方式。
标准的SPI总共有4根线,包括:SCLK(时钟线)、MOSI(主机输出从机输入线)、MISO(主机输入从机输出线)和SS(片选线)。但是在实际的应用中,可能会根据需要添加其他的辅助信号线,如数据就绪信号等。因此,SPI的具体实现方式可能会有所不同。
SPI协议中的DC线是指数据/命令线(Data/Command line),有时也称作RS线(Register Select line)。它是用来控制从主设备到从设备传输的数据是命令还是普通数据的信号线。在许多液晶显示屏、OLED屏幕、触摸屏等设备中,SPI总线上的DC线通常用于指示传输的数据是图像数据还是命令数据,以便设备能够正确地解析和处理数据
SPI通讯的时序是由主设备(Master)发起的,在数据传输的过程中,需要进行时序的协调,具体流程如下:
● 主设备(Master)通过片选信号(Slave Select)选择通信的从设备(Slave)。
● 主设备(Master)向从设备(Slave)发送时钟信号(SCLK),并将数据从输出口(MOSI)发送到从设备(Slave)的输入口(MISO)。
● 从设备(Slave)在每个时钟脉冲的下降沿采样输入口(MISO)的数据,并将数据从输出口(MOSI)发送回主设备(Master)的输入口(MISO)。
● 当传输完成后,主设备(Master)取消片选信号(Slave Select),从设备(Slave)被释放。
具体的通讯流程时序可以根据实际应用情况进行调整,例如可以调整时钟信号的极性和相位、选择合适的时钟频率等。
原理图
字库芯片
字库芯片是一种专门用于储存字符或汉字等字形信息的存储器芯片。它通过将不同的字形编码储存在内部存储器中,提供了一种快速、高效的方法来支持文本显示。使用字库芯片,可以避免在应用程序中占用过多的内存空间,并且可以提高文本显示的速度和准确性。 字库芯片通常包含标准的字形、符号和汉字,而且支持多种字体和字号的显示。
字库芯片采用的也是SPI协议进行通讯。
中文显示屏原理
由显示屏和中文字库芯片组成。
- 显示屏接外接电路采用SPI模式显示
- 中文字库采用SPI进行访问
标准的SPI协议包含:
● SCLK: 时钟频率
● MOSI:Master Out Slave In,主设备给从设备传递数据
● MISO:Master In Slave Out, 主设备接收从设备的数据
● SS: Slave Select, 选择从设备,片选。spi是单独通讯,一次只能和一个芯片进行通讯,通过ss进行片选。
SPI SSD1306显示屏,只负责显示,只用到了标准协议的一些规定引脚,也做了一些扩展:
● SPI_CLK: 对应标准协议中的SCLK。
● SPI_MOS: 对应标准协议中的MOSI
● SPI_DC: 为扩展,自定义的数据命令引脚,非标准。
● SPI_CS1: 对应标准协议中的ss。但是多个slave时,每个对应一个片选引脚。
中文字符芯片,采用的也是SPI:
● SPI_CLK: 对应标准协议中的SCLK。
● SPI_MOS: 对应标准协议中的MOSI
● SPI_FSO: 对应标准协议中的MISO
● SPI_CS2: 对应标准协议中的ss。但是多个slave时,每个对应一个片选引脚。
整个系统中,用到了SPI协议,同时有两个从设备,他们共用了一些引脚。
API的使用
csharp
void OLED_Display_128x64(u8 *dp);
void OLED_Display_16x16(u8 x,u8 y,u8 *dp);
void OLED_Display_8x16(u8 x,u8 y,u8 *dp);
void OLED_Display_5x7(u8 x,u8 y,u8 *dp);
void OLED_Display_GB2312_string(u8 x,u8 y,u8 *text);
void OLED_Display_string_5x7(u8 x,u8 y,u8 *text);
void OLED_ShowNum(u8 x,u8 y,float num,u8 len);