)
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)//防止程序跑飞 { }