分享

一文了解I2C总线

 新用户25123383 2023-07-05 发布于江苏

I2C(Inter-Integrated Circuit)是一种常用的串行通信协议,被广泛应用于各种电子设备和集成电路之间的通信。本文将带您了解I2C的工作原理、信号传输方式以及其在电子领域中的应用。

1. I2C的工作原理

I2C协议由两根线组成:时钟线(SCL)和数据线(SDA)。I2C是一种主从结构的通信协议,其中一个设备充当主设备(Master),负责发起通信和控制通信的时序,其他设备则充当从设备(Slave),负责响应主设备的指令。

通信开始时,主设备发出启动信号(Start),表示通信即将开始。接下来,主设备发送一个地址字节,用于选择要通信的从设备。地址字节的最高位是0表示写操作,最高位是1表示读操作。

I2C接口网络结构类似如下:

文章图片1

I2C协议总线

2. 信号传输方式

I2C使用双向的串行数据传输方式。数据传输以字节为单位,每个字节包括8个位(bit)。每个位的传输都会在时钟的边沿进行,时钟线(SCL)用于同步数据传输。

在每个位传输期间,数据线(SDA)上的数据可能会发生变化。发送数据时,主设备将位数据放置在数据线上,而从设备会在相应的时钟边沿读取该位的数据。接收数据时,从设备将位数据放置在数据线上,主设备会在相应的时钟边沿读取该位的数据。

文章图片2

start stop

文章图片3

ack

文章图片4

设备地址

文章图片5

写一字节

文章图片6

读一字节

3. I2C在电子领域的应用

I2C协议在电子领域中被广泛应用,下面是一些常见的应用场景:

- 传感器接口:I2C协议常用于连接各种传感器,如温度传感器、光线传感器和加速度传感器等。传感器将数据发送到主设备,主设备可以通过I2C协议读取传感器的数据。

- 存储器扩展:I2C可以用于连接存储器设备,如EEPROM和RAM等。通过I2C协议,主设备可以读取和写入存储器设备中的数据,实现存储和扩展功能。

- 显示器控制:I2C协议可用于控制各种显示设备,如LCD显示屏和OLED显示屏等。主设备可以发送指令和数据到显示设备,实现图像和文本的显示。

- 模数转换器:I2C协议可用于连接模数转换器(ADC)和数模转换器(DAC)。主设备可以通过I2C协议

读取ADC的模拟输入数据或发送数字数据到DAC以产生模拟输出。

通过I2C协议,各种设备可以实现相互之间的通信和数据交换,提供了一种简单且可靠的通信方式。I2C的灵活性和广泛的应用使得它成为了电子领域中的重要通信协议之一。

无论是传感器接口、存储器扩展、显示器控制还是模数转换器,I2C协议的使用都提供了便捷的解决方案,使得各种设备能够无缝地进行通信和数据交换。随着技术的不断发展,I2C协议在电子设备中的应用将会更加广泛。

4.I2C设备的编程

MB85RC16是I2C接口的铁电存储体,我们设定stm32f103IIC接口与其相连接。下面的代码展示如何使用STM32 HAL库来实现I2C总线的读写操作,并通过I2C与MB85RC16铁电存储器进行数据的读写。

#include 'stm32f1xx_hal.h'#define I2C_ADDRESS 0xA0 // MB85RC16的I2C地址I2C_HandleTypeDef hi2c1;void I2C_Init(void){ hi2c1.Instance = I2C1; hi2c1.Init.ClockSpeed = 100000; // I2C总线速率为100kHz hi2c1.Init.DutyCycle = I2C_DUTYCYCLE_2; hi2c1.Init.OwnAddress1 = 0; hi2c1.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT; hi2c1.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE; hi2c1.Init.OwnAddress2 = 0; hi2c1.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE; hi2c1.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE; HAL_I2C_Init(&hi2c1);}void I2C_WriteData(uint16_t addr, uint8_t* data, uint16_t len){ HAL_I2C_Mem_Write(&hi2c1, I2C_ADDRESS, addr, I2C_MEMADD_SIZE_16BIT, data, len, HAL_MAX_DELAY);}void I2C_ReadData(uint16_t addr, uint8_t* data, uint16_t len){ HAL_I2C_Mem_Read(&hi2c1, I2C_ADDRESS, addr, I2C_MEMADD_SIZE_16BIT, data, len, HAL_MAX_DELAY);}int main(void){ HAL_Init(); SystemClock_Config(); I2C_Init(); // 示例:写入数据到MB85RC16 uint16_t writeAddr = 0x0000; // 写入数据的起始地址 uint8_t writeData[] = {0x12, 0x34, 0x56}; // 要写入的数据 uint16_t writeDataLen = sizeof(writeData); I2C_WriteData(writeAddr, writeData, writeDataLen); // 示例:从MB85RC16读取数据 uint16_t readAddr = 0x0000; // 读取数据的起始地址 uint8_t readData[10]; // 读取数据的缓冲区 uint16_t readDataLen = sizeof(readData); I2C_ReadData(readAddr, readData, readDataLen); while (1) { // 主程序逻辑 }}

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多