主题中讨论的其他器件: MSP430FR4133
我在读取 INA226寄存器时遇到问题。
void INA2226_ReadReg (uint32_t SLAVE_ADR、uint8_t REG_addr、uint16_t *值) { uint8_t val[2]; /*------ 第一步-设置寄存器地址以便从---读取 * //对于写入操作,R/WN 位应该为低电平 uint8_t SLAVE_ADDRESS = SLAVE_ADR 和0xFE; I2C0_Start(); /*使用 W/R 位发送从地址*/ I2C0_WRITE_BYTE (SLAVE_ADDRESS); I2C0_WAIT (); /*设置寄存器地址*/ I2C0_WRITE_BYTE (REG_addr); I2C0_WAIT (); /*------ 第二步-从写入的寄存器地址读取--- * //读取的从器件地址 SLAVE_ADDRESS = SLAVE_ADR | 0x01; //I2C0_Start(); I2C0_RepeatedStart(); I2C0_WRITE_BYTE (SLAVE_ADDRESS); I2C0_WAIT (); //进入 Rx 模式 I2C0_C1 &=~I2C_C1_TX_MASK; //确保 TXAK 位为0 I2C0_C1 &=~I2C_C1_TXAK_MASK; //关闭 ACK,因为这是被读取的最后一个字节的第二个字节 //I2C0_C1 |= I2C_C1_TXAK_MASK; //虚拟读取-为什么???? Val[0]= I2C0_D; I2C0_WAIT (); Val[0]= I2C0_D; I2C0_WAIT (); //禁用 akn I2C0_C1 |= I2C_C1_TXAK_MASK; Val[1]= I2C0_D; I2C0_WAIT (); I2C0_Stop(); *值=(val[0]<< 8)| val[1]; }
这样、我从 INA226_MANUFACK_ID (0x5449)和 INA226_DIE_ID (0x2260)寄存器中读取正确的值。
正如您看到的、我需要一个虚拟读取来使其正确。
但是、当我触发测量、然后读取电压、分流、电流寄存器时、我会得到一些错误的值。
我的寄存器读取算法有什么问题?
