
问题如下:使用HAL库读写从设备寄存器 从设备地址由两部分组成:Slave ID (0x8E) 和Offset(0x86),均已是写地址,读地址加1即可; 从设备寄存器地址也是两部分组成:如 Slave ID (0x01) 和Offset(0xFF) 向从设备寄存器写入数据的过程为(分两步): ST > Device address 0x8E/w > ACK > 0x00 > ACK > Slave ID 0x01 > ACK > STOP ST > Device address 0x86/w > ACK > Offset 0xFF > ACK > Data 0x45 > ACK > STOP 使用两次HAL_I2C_Mem_Write函数是否即可? uint8_t RegVal = 0x01; uint8_t Data = 0x45; HAL_I2C_Mem_Write(&hi2c1, 0x8E, 0x00, I2C_MEMADD_SIZE_8BIT, &RegVal, 1, 1000) HAL_I2C_Mem_Write(&hi2c1, 0x86, 0x01, I2C_MEMADD_SIZE_8BIT, &Data, 1, 1000) 向从设备寄存器写读取据的过程为(分两步): ST > Device address 0x8E/w > ACK > 0x00 > ACK > Slave ID 0x01 > ACK > STOP ST > Device address 0x86/w > ACK > Offset 0xFF > ACK > RST > Device address 0x87/r > ACK > 0xAC > NACK > STOP 使用一次HAL_I2C_Mem_Read函数和一次HAL_I2C_Mem_Write是否即可? uint8_t RegVal_1 = 0x01; uint8_t * RegVal_2; HAL_I2C_Mem_Write(&hi2c1, 0x8E, 0x00, I2C_MEMADD_SIZE_8BIT, &RegVal_1, 1, 1000) HAL_I2C_Mem_Read(&hi2c1, 0x87, 0xFF, I2C_MEMADD_SIZE_8BIT, RegVal_2, 1, 1000) |
另外大家说的也有道理,软件模拟I2C可以相对逻辑简单,调试方便,不用详细了解库函数中的细节以及芯片底层驱动原理,只要对照设备的时序就行。缺点就是少了一点兼容性,速度稍慢,占用CPU时间长一点点,而且一般只能做主设备。
硬件I2C的好处是操作速度快,占用CPU时间不多,而且兼容性好,主从都可以。缺点就是用户要了解底层硬件工作原理,库函数的应用方式和范围。