第八章、SPI : LCD屏
1、LCD是什么 ?发光原理 ?
1.LCD:液晶显示
当有电流的时候,液晶层中的物质会有序排列
没有电流的时候,无序排列,光不可以透过
当像素点只有黑/白色的时候,灰度图(非黑即白)
三原色RGB:红绿蓝
一个像素点内部是由三个灯组成的
16位真彩色 24位真彩色
16位,就是有16个比特位,R占5位,绿色占5位,蓝色占5位;;;24位分别占8位,24位颜色更加丰富
2.lcd的发光原理
上电,液晶层有序
然后16位真彩色
128*128个像素点(横向纵向都是128个像素点)
lcd的本质也是一个外设,要和单片机进行通讯;
在通讯的时候,有
3.两种通讯方式
第一种是和单片机直接相连,没有低于20个引脚(单片机也需要提供20多个引脚与之相连)
引脚分类:控制引脚;数据传输引脚(数据引脚);接着是地址引脚;还有其他的引脚… 这种通讯方式十分浪费引脚。正常使用第二种通讯方式:
间接相连: lcd控制芯片;;;lcd和控制芯片相连接,控制芯片再和单片机相连接(单片机当主机,控制芯片当从机)----lcd厂商生产lcd的时候,将控制芯片一般都是和lcd一块生产打包组装; 迪文屏,喜欢用uart进行通讯;;;;;我们学习SPI通讯;
OLED用I2C进行通讯
2、16位真彩色 ?24位真彩色 ?
**16位真彩色:**每个像素使用16位来表示颜色,通常采用5-6-5格式,即5位用于红色,6位用于绿色,5位用于蓝色。这样可以表示的颜色总数为 (2^{16} = 65,536) 种颜色。
**24位真彩色:**每个像素使用24位来表示颜色,通常采用8-8-8格式,即8位用于红色,8位用于绿色,8位用于蓝色。这样可以表示的颜色总数为 (2^{24} = 16,777,216) 种颜色。
3、SPI是什么 ?电路 ? 什么主从模式 ?
**主设备:**控制通信的设备,生成时钟信号,发起数据传输。
**从设备:**响应主设备的请求,接收或发送数据。
4、三线制和四线制的区别 ?
(CC/SS)上面加个横线,横线代表低电平有效):片选线
SPI是三线制还是四线制?:如果主机从机都有两个通道两重身份,那么就是四线制;;;如果要么是主往从发要么从往主发,就是三线制;;;;
第二种说法就是,四线制有CSS,三线制没有CSS;
四线制(SCLK,MOSI,MISO,CC)
这是全双工,两个引脚起不同的作用,所以是串行(区分串行还是并行,要看多个引脚执行功能的时候,是同步发还是不同步发)
5、通讯原理
6、SPI 的优缺点
优点:
高速传输:SPI支持较高的传输速率,通常比I2C快,适合需要快速数据传输的应用。
全双工通信:SPI可以同时进行数据的发送和接收,提高了通信效率。
简单的硬件连接:SPI只需要少量的引脚(通常是4个),连接简单。
灵活的时钟频率:SPI的时钟频率可以根据需要进行调整,适应不同的应用场景。
多设备支持:可以通过选择不同的片选信号(CS)来连接多个从设备。
缺点:
引脚占用多:每增加一个从设备,需要额外的片选引脚,导致引脚占用增加。
无硬件地址:SPI没有内置的设备地址机制,所有设备都需要通过片选信号来选择,增加了复杂性。
不支持多主机:SPI通常是单主机的协议,多个主机之间的协调需要额外的设计。
无错误检测机制:SPI协议本身不提供错误检测和纠正机制,需在应用层实现。
7、lcd的通讯协议:SPI
**SPI:**看一个通讯协议,主要看:
看硬件的接线 通讯分类(全半同步异步串行并行)
接线主要是一主多从:SCLK线(时钟线);主机往从机发的线,从机往主机发送的线;这三根线是一根线分出去的
还有一根线叫做片选线,一个主机,很多个从机,每根片选线都是独立相连的;
从机往主机发送的线: MOSI(主发从收。。tx) MISO(主收从发。。rx):I是进,M是主,S是从,O是输出 (TX和RX是uart中的定义,这儿不能使用,所以用MOSI这两个名字定义)
通信协议:
8、极性和相位(SPI里独有的协议)
1.极性
时钟线处于空闲时的状态:0是低电平;
空闲的时候,如果处于1的话,就是高电平;
2.相位
写入/读取数据的时机(时钟线 上/下沿的奇偶沿 0是奇,1是偶)
极性为1,代表高电平的时候没有信号;此时相位=1时,就是在偶数沿(2.4.6.8.10)边沿写入数据
而如果相位是0,那就是在奇数边沿写入数据;;;
3.四种通讯协议
根据极性和相位两两组合就可以得到四种通讯协议;
0/0 0/1 1/0 1/1
00 空闲为低,读写在奇
01 空闲在低,读写在偶
10 空闲为高,读写为奇
11 空闲为高,读写为偶
不需要我们去写,直接通过API调用别人的函数就行
cubemx配置一些引脚,见图
lcd函数:
init初始化函数;;;clear清屏函数
DrawFont GBK16 显示ascll码函数 drawfont 1616显示中文
函数就是初始化先,用lcd-init,然后用一种颜色清屏(清屏函数),设置延时,再用另一种颜色,再设置延时;屏幕换颜色实验操作基本完成。
9、实验
移植步骤
1、写项目框架: printf移植框架
2、 移植 lcd 的 .c/.h 到项目中
3、 配置 MX 中gpio 重命名 (时钟频率不能太高 16M)
4、 汉字/ 图片 取模工具使用、数组
Lcd_Init();
Lcd_Clear(RED); // 屏幕初始化
Gui_DrawFont_GBK16(10,10,BLUE,BLACK,(uint8_t *)“HELLO”); // 打印ASCLL
char str[40];
sprintf(str,“%d.%d”,10,98);
Gui_DrawFont_GBK16(50,50,BLUE,BLACK,(uint8_t *)str); // 打印拼接字符
extern const char hqyj16[][32];
Gui_DrawFont_1616(0,0,RED,BLACK,hqyj16); // 打印汉字
extern const unsigned char gImage_rr[32768]; // 打印图片
showimage(gImage_rr);
首先把重定向函数复制进来;
#include “stdio.h”
#include “string.h”
__ASM (".global __use_no_semihosting");
struct FILE {int handle; };
FILE __stdout;
void _sys_exit(int x) { x = x; }
void _ttywrch(int ch){ ch = ch;}
int fputc(int ch, FILE *f)
{
uint8_t temp[1] = {ch};
HAL_UART_Transmit(&huart1, temp, 1, 2);
return ch;
}
utc(int ch, FILE *f)
{
uint8_t temp[1] = {ch};
HAL_UART_Transmit(&huart1, temp, 1, 2);
return ch;
}