用 NUCLEO-STM32F407 开发板与 LIS3DH 加速度计进行通信,硬件连接方式如下:
VCC → 3.3V
GND → GND
SCL/D15 → SCL(I2C 时钟线)
SDA/D14 → SDA(I2C 数据线)
我想要读取 WHO_AM_I 地址 0x0F寄存器的值:由于使用的是 SparkFun 的 LIS3DH 模块,经测量 SDO 引脚为 3.3V,设备地址dev_addr设为 0x19。
程序执行到 HAL_I2C_Mem_Read(&hi2c1, dev_addr, reg_adr, I2C_MEMADD_SIZE_8BIT, &who_am_i, 1, HAL_MAX_DELAY); 这一行时发生卡死,说明通信环节存在问题,
代码如下:
uint8_t dev_addr = 0x19<<1;
static void MX_I2C1_Init(void)
{
/* USER CODE BEGIN I2C1_Init 0 */
/* USER CODE END I2C1_Init 0 */
/* USER CODE BEGIN I2C1_Init 1 */
/* USER CODE END I2C1_Init 1 */
hi2c1.Instance = I2C1;
hi2c1.Init.Timing = 0x2000090E; //0x0x00707CBB
hi2c1.Init.OwnAddress1 = 0;
hi2c1.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT;
hi2c1.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE;
hi2c1.Init.OwnAddress2 = 0;
hi2c1.Init.OwnAddress2Masks = I2C_OA2_NOMASK;
hi2c1.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE;
hi2c1.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE;
if (HAL_I2C_Init(&hi2c1) != HAL_OK)
{
Error_Handler();
}
if (HAL_I2CEx_ConfigAnalogFilter(&hi2c1, I2C_ANALOGFILTER_ENABLE) != HAL_OK)
{
Error_Handler();
}
if (HAL_I2CEx_ConfigDigitalFilter(&hi2c1, 0) != HAL_OK)
{
Error_Handler();
}
}
uint8_t status=0;
uint8_t reg_adr=0x0F;
uint8_t who_am_i=0;
status = HAL_I2C_Mem_Read(&hi2c1, dev_addr, reg_adr, I2C_MEMADD_SIZE_8BIT, &who_am_i, 1, HAL_MAX_DELAY);
if(status!=HAL_OK)
{
sprintf(disp_buff,"MEM_READ_FAILED");
print_scrn(disp_buff);
}
sprintf(disp_buff,"who_IM_I: %x",who_am_i);
print_scrn(disp_buff);
|
|