使用i2c设备时可以查询到设备,但是rt_i2c_transfer出错,错误码为-1.利用逻辑分析仪抓包时,时钟线应该是有问题,这是指引脚和i2c初始化时出错吗?初始化代码是用cube mx直接生成的。具体代码如下:
static void MX_I2C2_Init(void)
{
hi2c2.Instance = I2C2;
hi2c2.Init.ClockSpeed = 100000;
hi2c2.Init.DutyCycle = I2C_DUTYCYCLE_2;
hi2c2.Init.OwnAddress1 = 0;
hi2c2.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT;
hi2c2.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE;
hi2c2.Init.OwnAddress2 = 0;
hi2c2.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE;
hi2c2.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE;
if (HAL_I2C_Init(&hi2c2) != HAL_OK)
{
rt_kprintf("i2c init error");
Error_Handler();
}
/** Configure Analogue filter
*/
if (HAL_I2CEx_ConfigAnalogFilter(&hi2c2, I2C_ANALOGFILTER_ENABLE) != HAL_OK)
{
rt_kprintf("i2c filter error");
Error_Handler();
}
/** Configure Digital filter
*/
if (HAL_I2CEx_ConfigDigitalFilter(&hi2c2, 0) != HAL_OK)
{
rt_kprintf("i2c digit filter error");
Error_Handler();
}
/* USER CODE BEGIN I2C2_Init 2 */
/* USER CODE END I2C2_Init 2 */
}
void HAL_I2C_MspInit(I2C_HandleTypeDef* hi2c)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
if(hi2c->Instance==I2C2)
{
/* USER CODE BEGIN I2C2_MspInit 0 */
/* USER CODE END I2C2_MspInit 0 */
__HAL_RCC_GPIOH_CLK_ENABLE();
/**I2C2 GPIO Configuration
PH5 ------> I2C2_SDA
PH4 ------> I2C2_SCL
*/
GPIO_InitStruct.Pin = GPIO_PIN_4|GPIO_PIN_5;
GPIO_InitStruct.Mode = GPIO_MODE_AF_OD;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
GPIO_InitStruct.Alternate = GPIO_AF4_I2C2;
HAL_GPIO_Init(GPIOH, &GPIO_InitStruct);
/* Peripheral clock enable */
__HAL_RCC_I2C2_CLK_ENABLE();
/* USER CODE BEGIN I2C2_MspInit 1 */
/* USER CODE END I2C2_MspInit 1 */
}
}
写寄存器函数如下
/* 写传感器寄存器 */
static rt_err_t write_reg(struct rt_i2c_bus_device *bus, rt_uint8_t reg, rt_uint32_t data)
{
rt_uint8_t buf[4];
struct rt_i2c_msg msgs;
buf[0] = reg; //cmd
buf[1] = (rt_uint8_t)data>>16;
buf[2] = (rt_uint8_t)data>>8;
buf[3] = (rt_uint8_t)data;
msgs.addr = ADS_ADDR;
msgs.flags = RT_I2C_WR;
msgs.buf = buf;
msgs.len = 4;
/* 调用I2C设备接口传输数据 */
if (rt_i2c_transfer(bus, &msgs, 1) == 1)
{
return RT_EOK;
}
else
{
return -RT_ERROR;
}
}
/* board.h 中如下 */
#define BSP_USING_I2C2
#ifdef BSP_USING_I2C2
#define BSP_I2C2_SCL_PIN GET_PIN(H, 4)
#define BSP_I2C2_SDA_PIN GET_PIN(H, 5)
#endif
另外须注意器件地址,rt驱动的器件地址是8位地址,最低位是读写位
我好愚蠢,这么低级的错误。感谢