OpenHarmony啃论文俱乐部——几种常见串行通信(I2C部分)

OpenHarmony啃论文俱乐部——几种常见串行通信(I2C部分)

我们在OpenHarmony成长计划啃论文俱乐部里,与华为、软通动力、润和软件、拓维信息、深开鸿等公司一起,学习和研究操作系统

【本期看点】

主题:《老子到此一游系列》之 老子找到了一条路

一、概述

​ I2C协议提供了无数据丢失的轻松通信。与其他协议相比,它还提供了极好的速度。I2C仅使用两根导线进行通信。信息技术重量轻、经济且无所不在。它还提高了数据传输速率。开发该协议的目的是获得高速通信,控制设备内部的寄存器以及可以保存在寄存器上的数据,通过这一点,我们能够控制各种参数。I2C用于数据监控,以提高准确性和效率。该设计方法采用VHDL语言开发,在MODELSIM或Xilinx上进行仿真,并可在FPGA板上实现

关键词:I2C协议、数据监控、VHDL、ModelSim、SDA、SCL

​ 使用串行接口设计有很多原因,许多更重要的应用包括串行通信,如传感器与个人计算机的通信。许多常见的嵌入式系统外围设备,如anolog到数字和数字到anlaog转换器、LCD和温度传感器,都支持串行接口。串行接口允许处理器进行通信,而不需要共享内存,也不需要它们可能造成的问题。串行通信协议有UART、CAN、USB、SPI、INTERIC等。USB、SPI和UART都只是一种类型对点协议。USB使用多路复用器与其他设备通信。只有I2C和CAN协议使用软件寻址。但只有I2C设计简单,易于维护。

UART CAN USB SPI I2C
性能 操作简单 安全迅速 安全、快速、即插即用 快速、低成本、普遍接受的大型设备间组合 简单、即插即用、经济高效、普遍接受
面向连接的网络服务 功能有限,点对点 复杂、有限的产品组合、面向汽车 需要强大的主控,无需即插即用软件,需要额外的驱动程序 没有即插即用硬件,没有固定的标准 由于电容效应,组件数量有限

二、介绍

​ 随着时间的推移,集成电路的物理尺寸和功耗要求都在降低。其主要原因是,更多的晶体管可以集成到更小的尺寸中,而集成电路之间的互连线数量可能会更少。集成电路的实际电路比集成电路的封装小得多,但由于集成电路之间存在互连线,因此需要更大的覆盖面积

I2C系统基本框图

OpenHarmony啃论文俱乐部——几种常见串行通信(I2C部分)_第1张图片

​ 通过使用I2C,即内部集成电路总线,可以降低这些布线要求。这种通信有一个特殊的协议,即I2C协议。I2C总线实际上由两条活动导线和一个接地连接组成。这两条活动导线即串行时钟[SCL]和串行数据[SDA]。这些电线本质上是双向半双工的,在连接到总线的设备之间传输信息。每个设备都通过一个唯一的地址进行确认,无论它是微控制器、LCD驱动器、存储器还是键盘接口,并且可以作为发射器或接收器工作,具体取决于设备的功能。在i2c总线中,可以方便地添加或删除设备,这对于嵌入式系统中的低维护和控制应用非常有用

OpenHarmony啃论文俱乐部——几种常见串行通信(I2C部分)_第2张图片

基本术语

​ 从物理上讲,I²C总线由两条活动导线SDA和SCL以及一个接地连接组成(参见图4)。活动导线都是双向的。I2C协议规范规定,在总线上发起数据传输的IC被视为总线主机。因此,在当时,所有其他IC都被视为总线从机。

OpenHarmony啃论文俱乐部——几种常见串行通信(I2C部分)_第3张图片

三、I2C协议规则

I2C的组件:I2C主顶部由预刻度寄存器、命令寄存器、状态寄存器、发送寄存器和接收寄存器组成。

①预刻度寄存器:用于通过整数除法将高频电信号降低到较低的频率。

②数据最初进入状态寄存器,命令寄存器根据它发出命令。

③发送和接收寄存器决定是发送还是接收数据,该数据与数据I\O寄存器并行传输——I²C主字节控制器是字节命令控制器和数据I\O移位寄存器。字节命令控制器是字节级I²C通信流量的核心,是一个基于命令寄存器位生成不同I²C字节操作状态的状态机。

④数据I\O移位寄存器是一个组件,它包含并处理与当前I²C写和读事务相关的数据。

⑤I²C主位控制器包括时钟发生器和位命令控制器。在传输过程中,数据逐位转移到命令位控制器中,并从那里传输到SDA。在接收过程中,数据通过SDA传输到位控制器

I²C通信中的组件

OpenHarmony啃论文俱乐部——几种常见串行通信(I2C部分)_第4张图片

四、工作原理

I2C通信的不同阶段如下所述

4.1启动和停止条件

OpenHarmony啃论文俱乐部——几种常见串行通信(I2C部分)_第5张图片

对应的代码片段
void Start_BH1750(void)
{
    WifiIotI2cData bh1750_i2c_data = { 0 };
    uint8_t send_data[1] = { 0x10 };
    bh1750_i2c_data.sendBuf = send_data;
    bh1750_i2c_data.sendLen = 1;
	I2cWrite(WIFI_IOT_I2C_IDX_1,(BH1750_Addr<<1)|0x00,&bh1750_i2c_data); 
}
4.2. 将字节传输到从设备

​ 发送启动条件后,主设备可以将一个字节传输到从设备。启动条件后的第一个字节将识别总线上的从机(地址),并选择操作模式。以下所有字节的含义取决于从属字节。

OpenHarmony啃论文俱乐部——几种常见串行通信(I2C部分)_第6张图片

4.3. 从从设备接收字节

​ 一旦从机被寻址并且从机确认了这一点,如果地址中的R/W位被设置为读取(设置为“1”),则可以从从从机接收一个字节。
OpenHarmony啃论文俱乐部——几种常见串行通信(I2C部分)_第7张图片

4.4 .从从属设备获取确认(ACK)

​ 当一个地址或数据字节被传输到总线上时,从机必须对此进行确认。在地址的情况下,如果该地址与其自己的地址匹配,则该从机和只有该从机将用ACK响应该地址。如果一个字节被传输到一个已经寻址的从机,该从机也将用ACK进行响应。

4.5. 从从设备发出确认(ACK)

​ 从设备接收字节后,主设备必须向从设备确认。如果没有数据可供接收,主机将发送一个不确认(NACK)信号并停止数据事务。

代码片段
void E53_IA1_Read_Data(void)
{
    Start_BH1750(); // 启动传感器采集数据
	usleep(180000);
    WifiIotI2cData bh1750_i2c_data = { 0 };
    uint8_t recv_data[2] = { 0 };
    bh1750_i2c_data.receiveBuf = recv_data;
    bh1750_i2c_data.receiveLen = 2;
	I2cRead(WIFI_IOT_I2C_IDX_1, (BH1750_Addr<<1)|0x01,&bh1750_i2c_data);   // 读取传感器数据
	E53_IA1_Data.Lux = (float)(((recv_data[0]<<8) + recv_data[1])/1.2);   

    uint8_t  data[3];    //data array for checksum verification
    uint16_t dat,tmp;
    uint8_t SHT3X_Data_Buffer[6]; 																		//byte 0,1 is temperature byte 4,5 is humidity
    
    WifiIotI2cData sht30_i2c_data = { 0 };
    uint8_t send_data[2] = { 0xE0,0x00};
    sht30_i2c_data.sendBuf = send_data;
    sht30_i2c_data.sendLen = 2;
    sht30_i2c_data.receiveBuf = SHT3X_Data_Buffer;
    sht30_i2c_data.receiveLen = 6;
	I2cWriteread(WIFI_IOT_I2C_IDX_1,(SHT30_Addr<<1)|0x00,&sht30_i2c_data); 																							//Read bh1750 sensor data 
    
    //    /* check tem */
    data[0] = SHT3X_Data_Buffer[0];
    data[1] = SHT3X_Data_Buffer[1];
    data[2] = SHT3X_Data_Buffer[2];

    tmp=SHT3x_CheckCrc(data, 2, data[2]);
    if( !tmp ) /* value is ture */
    {
        dat = ((uint16_t)data[0] << 8) | data[1];
        E53_IA1_Data.Temperature = SHT3x_CalcTemperatureC( dat );    
    }
    
    //    /* check humidity */
    data[0] = SHT3X_Data_Buffer[3];
    data[1] = SHT3X_Data_Buffer[4];
    data[2] = SHT3X_Data_Buffer[5];

    tmp=SHT3x_CheckCrc(data, 2, data[2]);
    if( !tmp ) /* value is ture */
    {
        dat = ((uint16_t)data[0] << 8) | data[1];
        E53_IA1_Data.Humidity = SHT3x_CalcRH( dat );    
    }
    	    
}
4.6. 过程算法

OpenHarmony啃论文俱乐部——几种常见串行通信(I2C部分)_第8张图片

五、I2C的特点

  1. 它是多主机串行端计算机总线
  2. I2C具有双线双向串行总线
  3. 它是一种简单有效的数据交换方法
  4. I2C协议具有较低的带宽
  5. 它是一种短距离协议

六、I2C的优势

  1. 用于传感器连接、RFID、生物识别设备等安全敏感应用
  2. 微控制器和传感器之间的通用通信标准
  3. 每个设备都可以通过其唯一地址识别,并且可以作为发射器或接收器工作,具体取决于设备的功能
  4. 它提供增强的安全系统
  5. 与FPGA兼容

七、结论

​ 理想的I2C监控体系结构将具有以下特点:高性能、灵活性、易于升级、低开发成本,以及随着应用程序的成熟和容量的增加,向低成本的迁移路径。FPGA与功能丰富的数据和图像处理套件、IP数据参考设计以及合作伙伴的压缩解决方案相结合,为数据系统设计师提供了生产此类系统所需的所有关键构建块。

参考文献

[1]Mankar J, Darode C, Trivedi K, et al. Review of I2C protocol[J]. International Journal of Research in Advent Technology, 2014, 2(1).

你可能感兴趣的:(啃论文,harmonyos,单片机)