我尝试用HAL_I2C_Master读取LSM6DS0上的加速度计。我用truestudio c编码,我的主板是STM32l476RG。我的slaveaddress是1101011xb所以D7 / D6用于R / W. 我的加速度计日期可以在28h到2Dh的寄存器中读取。Infortunatly它不起作用我不知道如何在我的电脑上显示数据,然后存储。大家可以给我一些指导吗,谢谢
- uint8_t* i;
- int main(void)
- {
- for(i= (0x28); i= (0x2D); i++)
- {
- HAL_I2C_Master_Transmit(&hi2c1, 0xD6, i , 1, 100);
- }
- // receive the 2 x 8bit data into the receive buffer
- HAL_I2C_Master_Receive(&hi2c1, 0xD7,(uint8_t*)0x2f , 6, 100);
- HAL_Delay(100);
复制代码
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
请阅读LSM6DS0数据表的 4.1.1节。密切注意表16到19. LSM6DS0实现了多个寄存器,这些寄存器由子地址标识。为了从子地址读取数据,主机必须写入从机地址,然后写入寄存器子地址,然后执行重复启动和从机地址读取。
HAL_I2C_Master_Transmit()和HAL_I2C_Master_Receive()函数不支持从子地址读取数据所需的I2C传输类型。HAL_I2C_Master_Receive()不写入子地址,也不执行重复启动。
相反,你应该使用HAL_I2C_Mem_Write()和HAL_I2C_Mem_Read()。尝试把代码修改一下:
- #define DEVICE_ADDR 0xD6
- #define REG_OUT_X_XL_SUB_ADDR 0x28
- #define I2C_TIMEOUT 100
- HAL_StatusTypeDef ReadRegister16(uint8_t reg_addr, uint16_t *out_value)
- {
- uint16_t reg_value;
- HAL_StatusTypeDef hal_status = HAL_I2C_Mem_Read(&hi2c1, DEVICE_ADDR, reg_addr, I2C_MEMADD_SIZE_8BIT, ®_value, sizeof(uint16_t), I2C_TIMEOUT);
- if (hal_status == HAL_OK)
- {
- *out_value = reg_val;
- }
- return hal_status;
- }
复制代码一周热门 更多>