Bootstrap

STM32基础学习笔记-SPI通讯协议协议&&面试基础题8

第八章、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;

}
;