wzh598 发表于 2018-4-17 14:40:02

请问如何使用stm32的硬件I2C读写HMC5883L?

请问如何使用stm32的硬件I2C读写HMC5883L?

feixiang20 发表于 2018-4-17 23:35:32

去参考下基于STM32 的硬件 I2C 读取 MPU6050 数据,关于STM32f103 的硬件IIC I2C 调试心得,关于HMC5883L驱动书写及调试的总结,HMC5883L手册总结与经验分析 详解,调试hmc5883l,为什么i2c发送字节是这么写,等文章,

hungchieh1029 发表于 2018-5-3 11:07:22

附上讀寫EEPROM的代碼,你再試著去改成HMC5883L的讀寫方式

I2C_HandleTypeDef hi2c_eeprom;

void MX_I2C_EEPROM_Init(void)
{
hi2c_eeprom.Instance             = EEPROM_I2Cx;
hi2c_eeprom.Init.ClockSpeed      = I2C_SPEEDCLOCK;
hi2c_eeprom.Init.DutyCycle       = I2C_DUTYCYCLE;
hi2c_eeprom.Init.OwnAddress1   = 0;
hi2c_eeprom.Init.AddressingMode= I2C_ADDRESSINGMODE_7BIT;
hi2c_eeprom.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE;
hi2c_eeprom.Init.OwnAddress2   = 0;
hi2c_eeprom.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE;
hi2c_eeprom.Init.NoStretchMode   = I2C_NOSTRETCH_DISABLE;
HAL_I2C_Init(&hi2c_eeprom);
}

void HAL_I2C_MspInit(I2C_HandleTypeDef* hi2c)
{
GPIO_InitTypeDef GPIO_InitStruct;
if(hi2c->Instance==EEPROM_I2Cx)
{

    EEPROM_I2C_RCC_CLK_ENABLE();      
    EEPROM_I2C_GPIO_CLK_ENABLE();
   
    /**I2C1 GPIO Configuration   
    PB6   ------> I2C1_SCL
    PB7   ------> I2C1_SDA
    */
    GPIO_InitStruct.Pin = EEPROM_I2C_SCL_PIN|EEPROM_I2C_SDA_PIN;
    GPIO_InitStruct.Mode = GPIO_MODE_AF_OD;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
    HAL_GPIO_Init(EEPROM_I2C_GPIO_PORT, &GPIO_InitStruct);
}
}

void I2C_EEPROM_WriteByte(uint16_t Addr, uint8_t Reg, uint8_t Value)
{
HAL_StatusTypeDef status = HAL_OK;

status = HAL_I2C_Mem_Write(&hi2c_eeprom, Addr, (uint16_t)Reg, I2C_MEMADD_SIZE_8BIT, &Value, 1, I2cxTimeout);

if(status != HAL_OK)
{
    I2C_EEPROM_Error();
}
}

uint8_t I2C_EEPROM_Readbyte(uint16_t Addr, uint8_t Reg)
{
HAL_StatusTypeDef status = HAL_OK;
uint8_t value = 0;

status = HAL_I2C_Mem_Read(&hi2c_eeprom, Addr, Reg, I2C_MEMADD_SIZE_8BIT, &value, 1, I2cxTimeout);

if(status != HAL_OK)
{
    I2C_EEPROM_Error();
}
return value;
}
页: [1]
查看完整版本: 请问如何使用stm32的硬件I2C读写HMC5883L?