嵌入式实验(二):基于IIC(软件)的AHT20温湿度传感器的数据采集

1. IIC

IIC(Inter-Integrated Circuit)集成电路总线,它是一种串行通信总线,使用多主从架构,由飞利浦公司在1980年代为了让主板、嵌入式系统或手机用以连接低速周边设备而发展。

  • 什么是IIC
    IIC 总线支持任何 IC 生产过程 (NMOS CMOS 双极性 )两线――串行数据 (SDA) 和串行时钟(SCL) 线在连接到总线的器件间传递信息 每个器件都有一个唯一的地址识别,而且都可以作为一个发送器或接收器,很明显 LCD驱动器只是一个接收器 而存储器则既可以接收又可以发送数据 除了发送器和接收器外 器件在执行数据传输时也可以被看作是主机或从机 , 主机是初始化总线的数据传输并产生允许传输的时钟信号的器件,此时任何被寻址的器件都被认为是从机.
  • IIC 总线的特点
    (1)只要求两条总线线路 一条串行数据线 SDA 一条串行时钟线 SCL
    (2)每个连接到总线的器件都可以通过唯一的地址和一直存在的简单的主机 从机关系软件设定地址主机可以作为主机发送器或主机接收器
    (3)它是一个真正的多主机总线 如果两个或更多主机同时初始化数据传输可以通过冲突检测和仲裁防止数据被破坏
    (4)串行的 8 位双向数据传输位速率在标准模式下可达 100kbit/s 快速模式下可达 400kbit/s 高速模式下可达 3.4Mbit/s
    (5)片上的滤波器可以滤去总线数据线上的毛刺波保证数据完整
    (6)连接到相同总线的 IC 数量只受到总线的最大电容 400pF 限制
  • 硬件IIC
    而硬件 IIC 是指直接利用 STM32 芯片中的硬件 IIC 外设,该硬件 IIC 外设跟 USART串口外设类似,只要配置好对应的寄存器,外设就会产生标准串口协议的时序。使用它的IIC 外设则可以方便地通过外设寄存器产生 IIC 协议方式的通讯,如初始化好 IIC 外设后,只需要把某寄存器位置 1,那么外设就会控制对应的 SCL 及 SDA 线自动产生 IIC 起始信号,而不需要内核直接控制引脚的电平。
  • 软件IIC
    即直接使用 CPU 内核按照 I2C 协议的要求控制 GPIO 输出高低电平。如控制产生 I2C 的起始信号时,见图 24-5,先控制作为 SCL 线的 GPIO 引脚输出高电平,然后控制作为 SDA 线的 GPIO 引脚在此期间完成由高电平至低电平的切换,最后再控制SCL 线切换为低电平,这样就输出了一个标准的 I2C 起始信号。
    -硬件IIC与软件IIC的比较
    硬件 I2C 直接使用外设来控制引脚,可以减轻 CPU 的负担。不过使用硬件I2C 时必须使用某些固定的引脚作为 SCL 和 SDA,软件模拟 I2C 则可以使用任意 GPIO 引脚,相对比较灵活。但stm32的IIC模块,由于版权原因,有一些缺陷。

2. 基于软件IIC的温湿度信息采集

keil程序

main函数代码如下

int main(void)
{
    float P,T,ALT;
    uint32_t CT_data[2];
	int  c1,t1;
    uint8_t LED_Stat = 0;

    RCC_Configuration();					   	//系统时钟
    GPIO_Configuration();					    //IO设置
    I2C_Bus_Init();

    uart_init(115200);

    while(1)
    {
        /* 读取传感器数据*/
        while(ATH20_Read_Cal_Enable() == 0)
        {
            ATH20_Init();
            SoftDelay_ms(30);
        }
        ATH20_Read_CTdata(CT_data);  //读温湿度
        c1 = CT_data[0] * 1000 / 1024 / 1024;  //计算
        t1 = CT_data[1] * 200 *10 / 1024 / 1024 - 500;
    /* 显示输出,有乱码,无影响*/
        printf("AHT20ÎÂʪ¶È¶ÁȡʵÑé:\n");
        printf("ζÈ: %d.%d ¡æ\n",(t1/10),(t1%10));
        printf("ʪ¶È: %d.%d %%\n",(c1/10),(c1%10));
        printf("\n\n");
       

        SoftDelay_ms(1000);//没两秒读一次
        if(LED_Stat == 0)
        {
            LED_Stat = 1;
            GPIO_ResetBits(GPIOC, GPIO_Pin_2);
        }
        else
        {
            LED_Stat = 0;
            GPIO_SetBits(GPIOC, GPIO_Pin_2);
        }
        }
    }
}

这里只贴了main函数的程序,其它usart.c delay.c i2c.c函数相较于例程无修改。

硬件连接

这次硬件是用的stm32核心板,用st-link进行代码的下载,用串口转换器进行串口通信,AHT20来测量温湿度。
在这里插入图片描述

在这里插入图片描述

实验结果

实验过程中,用手靠近了AHT20,可以看见温度和湿度都在上升
在这里插入图片描述

3. 实验总结

这次实验我学会了什么是IIC,以及怎么使用IIC,这次实验比较遗憾的是没能做出硬件的IIC,采用的是网上的软件模拟IIC,以后有时间我会继续完善这个实验。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值