“UART”
,即通用串行异步通讯协议
SPI通信协议
同步的数据总线
,也就是说它是用单独的数据线和一个单独的时钟信号来保证发送端和接收端的完美同步;时钟
是一个振荡信号,它告诉接收端在确切的时机对数据线上的信号进行采样只有一个主机
(一般来说可以是微控制器/MCU),但是可以有多个从机
(后面详细介绍)采集时机
可能是时钟信号的上升沿(从低到高)或下降沿(从高到低)整体的传输大概可以分为以下几个过程:
1)、主机先将NSS信号
拉低,这样保证开始接收数据;
2)、当接收端
检测到时钟的边沿信号时,它将立即读取数据线上的信号,这样就得到了一位数据(1bit);
3)、由于时钟是随数据一起发送的,因此指定数据的传输速度并不重要
,尽管设备将具有可以运行的最高速度(稍后我们将讨论选择合适的时钟边沿和速度)
4)、主机发送到从机
时:主机产生相应的时钟信号,然后数据一位一位地将从MOSI信号线上进行发送到从机;
5)、主机接收从机数据
:如果从机需要将数据发送回主机,则主机将继续生成预定数量的时钟信号,并且从机会将数据通过MISO信号线发送
注意,SPI是“全双工”
(具有单独的发送和接收线路),因此可以在同一时间发送和接收数据;另外SPI的接收硬件可以是一个简单的移位寄存器
,这比异步串行通信所需的完整UART要简单
得多,并且更加便宜
SPI总线包括4条逻辑线
,定义如下:
MISO
:Master input slave output 主机输入,从机输出(数据来自从机);
MOSI
:Master output slave input 主机输出,从机输入(数据来自主机);
SCLK
:Serial Clock 串行时钟信号,由主机产生发送给从机;
NSS
:Slave Select 片选信号,由主机发送,以控制与哪个从机通信,通常是低电平有效信号
其他制造商可能会遵循其他命名规则,但是最终他们指的相同的含义;以下是一些常用术语:
MISO也可以是SIMO
,DOUT,DO,SDO或SO(在主机端);
MOSI也可以是SOMI
,DIN,DI,SDI或SI(在主机端);
NSS也可以是CE,CS或SSEL
;
SCLK也可以是SCK
;
1、时钟频率
2、时钟极性 CKP/Clock Polarity
3、时钟相位 CKE /Clock Phase (Edge)
4、时钟配置总结
1、优点:
2、缺点/不足:
从器件结构上进行分类:
1、 单层器件
单层器件也就是在器件的正、负极之间接入一层可以发光的有机层,其结构为衬底/ITO/发光层/阴极。在这种结构中由于电子、空穴注入、传输不平衡,导致器件效率、亮度都较低,器件稳定性差
2、双层器件
双层器件是在单层器件的基础上,在发光层两侧加入空穴传输层(HTL)或电子传输层(ETL),克服了单层器件载流子注入不平衡的问题,改善了器件的电压-电流特性,提高了器件的发光效率
4、三层器件
三层器件结构是应用最广泛的一种结构,其结构为衬底/ITO/HTL/发光层/ETL/阴极。这种结构的优点是使激子被局限在发光层中,进而提高器件的效率
4、多层结构
多层结构的性能是比较好的一种结构,其能够很好的发挥各个层面的作用。发光层也可以由多层结构组成,由于各发机层之间相互独立,可以分别优化。因此,这种结构能充分发挥各有机层的作用,极大地提高了器件设计的灵活性
从驱动方式上进行分类:
1、一种是主动式,一种是被动式
2、主动式的一般为有源驱动,被动式的为无源驱动。在实际的应用过程中,有源驱动主要是用于高分辨率的产品,而无源驱动主要应用在显示器尺寸比较小的显示器中
从材料上进行分类:
1、可根据有机物的种类划分,一种为小分子,另一种是高分子
2、这两种器件的主要差别在制作工艺上,小分子器件主要采用的是真空热蒸发工艺,高分子器件采用的是旋转涂覆或者是喷涂印刷工艺
线路连接规则
usb to ttl —> stm32f103c8t6:
3V3 —> 3V3
GND —> GND
RXD —> A9
TXD —> A10
ctrl+enter
,得到显示图:void read_AHT20(void)
{
uint8_t i;
for(i=0; i<6; i++)
{
readByte[i]=0;
}
//-------------
I2C_Start();
I2C_WriteByte(0x71);
ack_status = Receive_ACK();
readByte[0]= I2C_ReadByte();
Send_ACK();
readByte[1]= I2C_ReadByte();
Send_ACK();
readByte[2]= I2C_ReadByte();
Send_ACK();
readByte[3]= I2C_ReadByte();
Send_ACK();
readByte[4]= I2C_ReadByte();
Send_ACK();
readByte[5]= I2C_ReadByte();
SendNot_Ack();
//Send_ACK();
I2C_Stop();
//--------------
if( (readByte[0] & 0x68) == 0x08 )
{
H1 = readByte[1];
H1 = (H1<<8) | readByte[2];
H1 = (H1<<8) | readByte[3];
H1 = H1>>4;
H1 = (H1*1000)/1024/1024;
T1 = readByte[3];
T1 = T1 & 0x0000000F;
T1 = (T1<<8) | readByte[4];
T1 = (T1<<8) | readByte[5];
T1 = (T1*2000)/1024/1024 - 500;
AHT20_OutData[0] = (H1>>8) & 0x000000FF;
AHT20_OutData[1] = H1 & 0x000000FF;
AHT20_OutData[2] = (T1>>8) & 0x000000FF;
AHT20_OutData[3] = T1 & 0x000000FF;
}
else
{
AHT20_OutData[0] = 0xFF;
AHT20_OutData[1] = 0xFF;
AHT20_OutData[2] = 0xFF;
AHT20_OutData[3] = 0xFF;
printf("lyy");
}
/*通过串口显示采集得到的温湿度
printf("\r\n");
printf("温度:%d%d.%d",T1/100,(T1/10)%10,T1%10);
printf("湿度:%d%d.%d",H1/100,(H1/10)%10,H1%10);
printf("\r\n");*/
t=T1/10;
t1=T1%10;
a=(float)(t+t1*0.1);
h=H1/10;
h1=H1%10;
b=(float)(h+h1*0.1);
sprintf(strTemp,"%.1f",a); //调用Sprintf函数把DHT11的温度数据格式化到字符串数组变量strTemp中
sprintf(strHumi,"%.1f",b); //调用Sprintf函数把DHT11的湿度数据格式化到字符串数组变量strHumi中
GUI_ShowCHinese(16,00,16,"温湿度显示",1);
GUI_ShowCHinese(16,20,16,"温度",1);
GUI_ShowString(53,20,strTemp,16,1);
GUI_ShowCHinese(16,38,16,"湿度",1);
GUI_ShowString(53,38,strHumi,16,1);
delay_ms(1500);
delay_ms(1500);
}
OLED显示温湿度采集信息
void TEST_MainPage(void)
{
GUI_ShowCHinese(28,10,16,"要什么避风港钞票才是梦想",1);
delay_ms(1500);
}
#include "delay.h"
#include "sys.h"
#include "oled.h"
#include "gui.h"
#include "test.h"
int main(void)
{
delay_init(); //延时函数初始化
NVIC_Configuration(); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
OLED_Init(); //初始化OLED
OLED_Clear(0); //清屏(全黑)
OLED_WR_Byte(0x2E,OLED_CMD); //关闭滚动
OLED_WR_Byte(0x27,OLED_CMD); //水平向左或者右滚动 26/27
OLED_WR_Byte(0x00,OLED_CMD); //虚拟字节
OLED_WR_Byte(0x00,OLED_CMD); //起始页 0
OLED_WR_Byte(0x07,OLED_CMD); //滚动时间间隔
OLED_WR_Byte(0x07,OLED_CMD); //终止页 7
OLED_WR_Byte(0x00,OLED_CMD); //虚拟字节
OLED_WR_Byte(0xFF,OLED_CMD); //虚拟字节
TEST_MainPage();
OLED_WR_Byte(0x2F,OLED_CMD); //开启滚动
}
OLED显示长字符
通过本次实验,掌握了对于SPI通信协议原理的理解,以及STM32f103c8t6与OLED屏显的联动应用演训;
在实验过程中,实验一与实验三都非常的顺利,只有实验二出现了无法采集温湿度的情况,这跟笔者上一篇博客分享的实验中出现的问题雷同,最开始以为是代码的问题,就用自己的板子烧录其他同学的代码,发现依旧解决不了;后来觉得是板子接触不良的问题,就用同学的板子烧录了自己的代码,发现问题得以解决!过程很费时间,但OLED屏显示的时候,还是觉得成就感满满呢!
同时也期待大家能够积极留言,指出我存在的问题,谢谢!
参考博客:
https://blog.csdn.net/qq_52362275/article/details/127573490
https://blog.csdn.net/qq_46467126/article/details/121439142?spm=1001.2014.3001.5502