OpenHarmony成长计划啃论文俱乐部
里,与华为、软通动力、润和软件、拓维信息、深开鸿
等公司一起,学习和研究操作系统主题:《老子到此一游系列》之 老子找到了一条路
I2C协议提供了无数据丢失的轻松通信。与其他协议相比,它还提供了极好的速度。I2C仅使用两根导线进行通信。信息技术重量轻、经济且无所不在。它还提高了数据传输速率。开发该协议的目的是获得高速通信,控制设备内部的寄存器以及可以保存在寄存器上的数据,通过这一点,我们能够控制各种参数。I2C用于数据监控,以提高准确性和效率。该设计方法采用VHDL语言开发,在MODELSIM或Xilinx上进行仿真,并可在FPGA板上实现
使用串行接口设计有很多原因,许多更重要的应用包括串行通信,如传感器与个人计算机的通信。许多常见的嵌入式系统外围设备,如anolog到数字和数字到anlaog转换器、LCD和温度传感器,都支持串行接口。串行接口允许处理器进行通信,而不需要共享内存,也不需要它们可能造成的问题。串行通信协议有UART、CAN、USB、SPI、INTERIC等。USB、SPI和UART都只是一种类型对点协议。USB使用多路复用器与其他设备通信。只有I2C和CAN协议使用软件寻址。但只有I2C设计简单,易于维护。
UART | CAN | USB | SPI | I2C | |
---|---|---|---|---|---|
性能 | 操作简单 | 安全迅速 | 安全、快速、即插即用 | 快速、低成本、普遍接受的大型设备间组合 | 简单、即插即用、经济高效、普遍接受 |
面向连接的网络服务 | 功能有限,点对点 | 复杂、有限的产品组合、面向汽车 | 需要强大的主控,无需即插即用软件,需要额外的驱动程序 | 没有即插即用硬件,没有固定的标准 | 由于电容效应,组件数量有限 |
随着时间的推移,集成电路的物理尺寸和功耗要求都在降低。其主要原因是,更多的晶体管可以集成到更小的尺寸中,而集成电路之间的互连线数量可能会更少。集成电路的实际电路比集成电路的封装小得多,但由于集成电路之间存在互连线,因此需要更大的覆盖面积
通过使用I2C,即内部集成电路总线,可以降低这些布线要求。这种通信有一个特殊的协议,即I2C协议。I2C总线实际上由两条活动导线和一个接地连接组成。这两条活动导线即串行时钟[SCL]和串行数据[SDA]。这些电线本质上是双向半双工的,在连接到总线的设备之间传输信息。每个设备都通过一个唯一的地址进行确认,无论它是微控制器、LCD驱动器、存储器还是键盘接口,并且可以作为发射器或接收器工作,具体取决于设备的功能。在i2c总线中,可以方便地添加或删除设备,这对于嵌入式系统中的低维护和控制应用非常有用
从物理上讲,I²C总线由两条活动导线SDA和SCL以及一个接地连接组成(参见图4)。活动导线都是双向的。I2C协议规范规定,在总线上发起数据传输的IC被视为总线主机。因此,在当时,所有其他IC都被视为总线从机。
①预刻度寄存器:用于通过整数除法将高频电信号降低到较低的频率。
②数据最初进入状态寄存器,命令寄存器根据它发出命令。
③发送和接收寄存器决定是发送还是接收数据,该数据与数据I\O寄存器并行传输——I²C主字节控制器是字节命令控制器和数据I\O移位寄存器。字节命令控制器是字节级I²C通信流量的核心,是一个基于命令寄存器位生成不同I²C字节操作状态的状态机。
④数据I\O移位寄存器是一个组件,它包含并处理与当前I²C写和读事务相关的数据。
⑤I²C主位控制器包括时钟发生器和位命令控制器。在传输过程中,数据逐位转移到命令位控制器中,并从那里传输到SDA。在接收过程中,数据通过SDA传输到位控制器
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);
}
发送启动条件后,主设备可以将一个字节传输到从设备。启动条件后的第一个字节将识别总线上的从机(地址),并选择操作模式。以下所有字节的含义取决于从属字节。
一旦从机被寻址并且从机确认了这一点,如果地址中的R/W位被设置为读取(设置为“1”),则可以从从从机接收一个字节。
当一个地址或数据字节被传输到总线上时,从机必须对此进行确认。在地址的情况下,如果该地址与其自己的地址匹配,则该从机和只有该从机将用ACK响应该地址。如果一个字节被传输到一个已经寻址的从机,该从机也将用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 );
}
}
理想的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).