I2C总线是用于多机间通信的一种通信方式,下面是他的原理
i2c总线使用两条线传输数据分别为SCL时钟线与SDA数据线
在使用i2c总线时,必须使用两颗4.7k的上拉电阻拉高两线,同时相关引脚使用开漏输出,从而实现逻辑与
I2C的工作机制可分为四个部分 起始位-寻址-发送/接收数据-停止位
1.起始位:SCL拉高时,SDA拉低,证明传输开始
2.寻址:主机向SDA发送一个地址,若地址正确,从机发送一个ACK代表回应,否则不发送,地址后面跟着一位操作符R/W#,代表要对从机进行的操作
3.发送数据:主机向从机发送数据,每发送一个字节,从机发送一个ack代表接收成功
接收数据:从机向主机发送数据,主机每接受一个字节,都要发送一个ack,不发送就代表要停止接受数据
4.停止位:SCL拉高时,SDA拉高,传输结束
下面来看两个I2C函数
HAL_StatusTypeDef HAL_I2C_Master_Transmit(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size, uint32_t Timeout)HAL_StatusTypeDef HAL_I2C_Master_Receive(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size, uint32_t Timeout)这两个函数分别为主机向从机发送数据和主机向从机接收数据,他们的参数是一样的
hi2c:填写i2c句柄的指针
DevAddress:填写从机地址
pData:填写要传输数据的指针
Size:要传输数据的大小
Timeout:超时时间
下面是一个利用i2c总线实现点亮oled屏幕的程序
uint8_t command[] = {0x00, 0x8d, 0x14, 0xaf, 0xa5};//定义指令集 HAL_I2C_Master_Transmit(&hi2c1, 0x78, command, sizeof(command) / sizeof(command[0]), HAL_MAX_DELAY);//发送指令 while (1)//防止程序跑飞 { }