文章目录
一、I2C介绍
1、IC2简介
I2C 通讯协议 (Inter - Integrated Circuit) 是由 Phiilps 公司开发的,它具有引脚少,硬件实现简单,可扩展性强,不需要 USART、CAN 等通讯协议的外部收发设备的优点。
I2C在通讯设备上的连接方式如图:
从图中就可看出,它仅需要两根线即可进行连接在总线上的器件之间的数据传输。
2、工作原理
SDA(串行数据线)SCL(串行时钟线)都是双向I/O线,接口电路为开漏输出.需通过上拉电阻接电源VCC.当总线空闲时.两根线都是高电平,连接总线的外同器件都是CMOS器件,输出级也是开漏电路.在总线上消耗的电流很小,因此,总线上扩展的器件数量主要由电容负载来决定,因为每个器件的总线接口都有一定的等效电容.而线路中电容会影响总线传输速度.当电容过大时,有可能造成传输错误.所以,其负载能力为400pF,因此可以估算出总线允许长度和所接器件数量。
主器件用于启动总线传送数据,并产生时钟以开放传送的器件,此时任何被寻址的器件均被认为是从器件.在总线上主和从、发和收的关系不是恒定的,而取决于此时数据传送方向。如果主机要发送数据给从器件,则主机首先寻址从器件,然后主动发送数据至从器件,最后由主机终止数据传送;如果主机要接收从器件的数据,首先由主器件寻址从器件.然后主机接收从器件发送的数据,最后由主机终止接收过程。在这种情况下.主机负责产生定时时钟和终止数据传送。
3、软件I2C与硬件I2C
简单的来说硬件I2C即是对应芯片上的I2C外设,有相应的I2C驱动电路,其管脚也是专用的。程序员只需要调用I2C的控制函数即可,不用直接的去控制SCL与SDA的电平输出。
而软件I2C,是用软件来控制GPIO管脚状态进行模拟I2C通信波形。即程序员用程序来控制SCL与SDA线的高低电平状态,模拟I2C时序的协议。
如何区分它们:
- 可以看底层配置,比如IO口配置,如果配置了IO口的功能(IIC功能)那就是固件IIC,否则就是模拟
- 可以看IIC写函数,看里面有木有调用现成的函数或者给某个寄存器赋值,如果有,则肯定是固件IIC功能,没有的话肯定是数据一个bit一个bit模拟发生送的,肯定用到了循环,则为模拟。
- 根据代码量判断,模拟的代码量肯定比固件的要大。
- 硬件IIC用法比较复杂,模拟IIC的流程更清楚一些。
- 硬件IIC速度比模拟快,并且可以用DMA
- 模拟IIC可以在任何管脚上,而硬件只能在固定管脚上。
二、监测温湿度并返回上位机。
1、过程与准备
1.需要准备:
- 实现该次实验需要一个AHT20温度传感器。
- 一个stm32的最小开发板
- 若干杜邦线
- Keil5软件
2.AHT20芯片使用代码
AHT20使用过程
void read_AHT20_once(void)
{
delay_ms(10);
reset_AHT20();//重置AHT20芯片
delay_ms(10);
init_AHT20();//进行初始化
delay_ms(10);
startMeasure_AHT20();//开始测试AHT20
delay_ms(80);
read_AHT20();//读取AHT20采集到的数据
delay_ms(5);
}
AHT20读取程序
void read_AHT20(void)
{
uint8_t i;
for(i=0; i<6; i++)
{
readByte[i]=0;
}
I2C_Start();//I2C启动
I2C_WriteByte(0x71);//I2C写数据
ack_status = Receive_ACK();//收到的应答信息
readByte[0]= I2C_ReadByte();//I2C读取数据
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();//I2C停止函数
//判断读取到的第一个字节是不是0x08,0x08是该芯片读取流程中规定的,如果读取过程没有问题,就对读到的数据进行相应的处理
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("读取失败!!!");
}
printf("\r\n");
//根据AHT20芯片中,温度和湿度的计算公式,得到最终的结果,通过串口显示
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");
}
AHT20引脚定义
#define SDA_IN() {GPIOB->CRL&=0X0FFFFFFF;GPIOB->CRL|=(u32)8<<28;}
#define SDA_OUT() {GPIOB->CRL&=0X0FFFFFFF;GPIOB->CRL|=(u32)3<<28;}
#define IIC_SCL PBout(6)
#define IIC_SDA PBout(7)
#define READ_SDA PBin(7)
3.AHT20接线方法
VCC——3.3V
GND——GND
SCL——PB6
SDA——PB7
2、结果展示
图片上显示室内温度为22.5,湿度59.1%。当用手抓住传感器时,温度逐渐上升。
三、OLED灯的使用
1、使用PCtoLCD2002提取字模
a.软件可以在网上搜索下载安装即可,很简单。
b.为了始编译之后在OLED显示屏上汉字显示正确,需对软件进行如下设置。
点击软件中的选项后,进行如下设置
c.关于软件的使用
红框处输入自己想要的汉字,左边选择生成字模即可。下方的内容即为生成的字模,直接复制粘贴即可。
2、代码显示姓名
1.完整代码
2.相关修改
将上述的字模放入oledfont.h文件里的指定位置如下:
这里字模就设置好了,然后设置需要显示的文字,在test.c文件里,如下:
这里的文字都需要取字模然后在程序里写好才能用。
到了这里其实编译烧录就能成了。
然后介绍其中的一些参数意思
- GUI_ShowString中,前面0,16分别表示X坐标与Y坐标。引号中类容表示显示的内容(这个函数仅能使用字符),后面的16,1分别表示字符显示格式和显示样式(1:白字黑底,0:黑子白底)
- CUI_ShowChinese中,前面两个还是坐标,第三个为汉字点阵大小,然后是要显示的汉字,最后是显示格式(同上)。
3.OLED连接方法。
3、效果展示
四、总结
看着还是挺有成就感的,虽然自己只是做了很小很小的改动。但怎么来说终于是看到了代码的效果了。不像以前总是仿真,感觉都是虚的。虽然说是学,但是感觉这些协议看是看了,但就是看不懂。工程还是很大的,但我也主要是只看了那几个代码。整个工程还有很大的研究价值,可以继续研究。
完整代码:
链接:https://pan.baidu.com/s/1brOj8G_eJVAxk21IVe3ofg
提取码:4455
参考链接:
https://blog.csdn.net/ssj925319/article/details/111588662
https://blog.csdn.net/qq_43279579/article/details/111597278