使用HAL_I2C_Master读取LSM6DS0加速度计

2019-07-14 17:33发布

我尝试用HAL_I2C_Master读取LSM6DS0上的加速度计。我用truestudio c编码,我的主板是STM32l476RG。我的slaveaddress是1101011xb所以D7 / D6用于R / W. 我的加速度计日期可以在28h到2Dh的寄存器中读取。Infortunatly它不起作用我不知道如何在我的电脑上显示数据,然后存储。大家可以给我一些指导吗,谢谢
  1. uint8_t*  i;
  2. int main(void)
  3. {
  4. for(i= (0x28); i= (0x2D); i++)
  5. {
  6. HAL_I2C_Master_Transmit(&hi2c1, 0xD6, i , 1, 100);

  7. }

  8. // receive the 2 x 8bit data into the receive buffer
  9. HAL_I2C_Master_Receive(&hi2c1, 0xD7,(uint8_t*)0x2f , 6, 100);
  10. HAL_Delay(100);
复制代码

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
1条回答
天地直方
1楼-- · 2019-07-14 23:11
你对LSM6DS0 I2C接口的工作方式有错误的理解,并且你正在使用HAL库中错误的I2C函数。
请阅读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()。尝试把代码修改一下:
  1. #define DEVICE_ADDR 0xD6
  2. #define REG_OUT_X_XL_SUB_ADDR 0x28
  3. #define I2C_TIMEOUT 100

  4. HAL_StatusTypeDef ReadRegister16(uint8_t reg_addr, uint16_t *out_value)
  5. {
  6.     uint16_t reg_value;

  7.     HAL_StatusTypeDef hal_status = HAL_I2C_Mem_Read(&hi2c1, DEVICE_ADDR, reg_addr, I2C_MEMADD_SIZE_8BIT, &reg_value, sizeof(uint16_t), I2C_TIMEOUT);

  8.     if (hal_status == HAL_OK)
  9.     {
  10.         *out_value = reg_val;
  11.     }

  12.     return hal_status;
  13. }
复制代码

一周热门 更多>