使用HMC5883l的带stm32f4的I2C

使用HMC5883l的带stm32f4的I2C,stm32,magnetometer,Stm32,Magnetometer,我一直在尝试将HMC5883l板连接到stm32f4,但是有些东西工作不正常。我已启动i2c,将配置位发送到REGA、REGB和REGMR(模式寄存器),并通过USB连接将其发送回HAL_i2c_MEM_READ 结果是: xaxis和zaxis具有相同的值 主循环只工作一次,要获得另一个值,我需要插入STM 我一直在尝试用示波器检查值(x轴)是否有变化,但它没有显示任何变化(旋转电路板) 我在这里错过了什么?电路板有可能损坏吗 int main(void) { /* US

我一直在尝试将HMC5883l板连接到stm32f4,但是有些东西工作不正常。我已启动i2c,将配置位发送到REGA、REGB和REGMR(模式寄存器),并通过USB连接将其发送回HAL_i2c_MEM_READ

结果是:

  • xaxis和zaxis具有相同的值
  • 主循环只工作一次,要获得另一个值,我需要插入STM

  • 我一直在尝试用示波器检查值(x轴)是否有变化,但它没有显示任何变化(旋转电路板)

我在这里错过了什么?电路板有可能损坏吗

 int main(void)
{
    /* USER CODE BEGIN 1 */
    /* USER CODE END 1 */

    /* MCU Configuration----------------------------------------------------------*/

    /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
    HAL_Init();

    /* USER CODE BEGIN Init */
    /* USER CODE END Init */

    /* Configure the system clock */
    SystemClock_Config();

    /* USER CODE BEGIN SysInit */

    /* USER CODE END SysInit */

    /* Initialize all configured peripherals */
    MX_GPIO_Init();
    MX_USB_DEVICE_Init();
    MX_I2C3_Init();
    /* USER CODE BEGIN 2 */
//  HAL_StatusTypeDef HAL_I2C_Mem_Write(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint8_t *pData, uint16_t Size, uint32_t Timeout)

    HAL_I2C_Mem_Write(&hi2c3, HMC5883l_ADDRESS, 0b00000000 , 1, HMC5883l_Enable_A   , 1, 100);
    HAL_I2C_Mem_Write(&hi2c3, HMC5883l_ADDRESS, 0b00000001 , 1, HMC5883l_Enable_B   , 1, 100);
    HAL_I2C_Mem_Write(&hi2c3, HMC5883l_ADDRESS, 0b00000010 , 1, HMC5883l_MR         , 1, 100);

    /* USER CODE END 2 */

    /* Infinite loop */
    /* USER CODE BEGIN WHILE */
    while (1)
    {
        HAL_I2C_Mem_Read(&hi2c3, HMC5883l_ADDRESS, HMC5883l_ADD_DATAX_MSB_LSB, 1, DataX, 2, 100);
        Xaxis = ((DataX[1] << 8) | DataX[0]);
        magn_x_gs = ((float)Zaxis*MAX_RESOLUTION)/(float)INT16_MAX; // conversion

        HAL_I2C_Mem_Read(&hi2c3, HMC5883l_ADDRESS, HMC5883l_ADD_DATAY_MSB_LSB , 1, DataY, 2, 100);
        Yaxis = ((DataY[1] << 8) | DataY[0]);
        magn_y_gs = ((float)Yaxis*MAX_RESOLUTION)/(float)INT16_MAX;

        HAL_I2C_Mem_Read(&hi2c3, HMC5883l_ADDRESS, HMC5883l_ADD_DATAZ_MSB_LSB , 1, DataZ, 2, 100);
        Zaxis = ((DataZ[1] << 8) | DataZ[0]);
        magn_z_gs = ((float)Zaxis*MAX_RESOLUTION)/(float)INT16_MAX;
    }
int main(无效)
{
/*用户代码开始1*/
/*用户代码结束1*/
/*微控制器配置----------------------------------------------------------*/
/*重置所有外围设备,初始化闪存接口和Systick*/
HAL_Init();
/*用户代码开始初始化*/
/*用户代码结束初始化*/
/*配置系统时钟*/
SystemClock_Config();
/*用户代码BEGIN SysInit*/
/*用户代码结束SysInit*/
/*初始化所有配置的外围设备*/
MX_GPIO_Init();
MX_USB_设备_Init();
MX_I2C3_Init();
/*用户代码开始2*/
//HAL_StatusTypeDef HAL_I2C_Mem_Write(I2C_HandletTypeDef*hi2c、uint16_t DevAddress、uint16_t MemAddress、uint16_t MemAddSize、uint8_t*pData、uint16_t Size、uint32_t Timeout)
HAL_I2C_内存写入(&hi2c3,HMC5883l_地址,0b00000000,1,HMC5883l_启用A,1100);
HAL_I2C_内存写入(&hi2c3,HMC5883l_地址,0b00000001,1,HMC5883l_启用,1100);
HAL_I2C_内存写入(&hi2c3,HMC5883l_地址,0b00000010,1,HMC5883l_MR,1100);
/*用户代码结束2*/
/*无限循环*/
/*用户代码在*/
而(1)
{
HAL_I2C_Mem_Read(&hi2c3,HMC5883l_ADDRESS,HMC5883l_ADD_DATAX_MSB_LSB,1,DATAX,2100);

Xaxis=((DataX[1]Ok,我已经创建了连接的正确版本:)

和明确的变量:

Xaxis = 0;
Yaxis = 0;
Zaxis = 0;
初始化连接:

HAL_I2C_Mem_Write(&hi2c3, HMC5883l_ADDRESS, 0x00 , 1, &RegSettingA , 1, 100);
HAL_I2C_Mem_Write(&hi2c3, HMC5883l_ADDRESS, 0x01 , 1, &RegSettingB , 1, 100);
HAL_I2C_Mem_Write(&hi2c3, HMC5883l_ADDRESS, 0x02 , 1, &RegSettingMR , 1, 100);
和while(1)循环的内部:

//接收X_轴
HAL_I2C_Mem_Read(&hi2c3,HMC5883l_地址,HMC5883l_ADD_DATAX_MSB_MULTI,1,DATAX,2100);

Xaxis=((DataX[1]我尝试了相同的代码,但当我在逻辑分析器中看到数据时,它表明NAK正在工作。另外,如果我将地址发送为0X3D,分析器上显示的输出是0x3cGreat job:)感谢更新和共享此正确版本。我只想说,在正确的版本中,您定义了CRB(0xA0).从数据表上看,我们实际上应该将解除以390。
Xaxis = 0;
Yaxis = 0;
Zaxis = 0;
HAL_I2C_Mem_Write(&hi2c3, HMC5883l_ADDRESS, 0x00 , 1, &RegSettingA , 1, 100);
HAL_I2C_Mem_Write(&hi2c3, HMC5883l_ADDRESS, 0x01 , 1, &RegSettingB , 1, 100);
HAL_I2C_Mem_Write(&hi2c3, HMC5883l_ADDRESS, 0x02 , 1, &RegSettingMR , 1, 100);
// RECEIVE X_axis
HAL_I2C_Mem_Read(&hi2c3,HMC5883l_ADDRESS,HMC5883l_ADD_DATAX_MSB_MULTI,1,DataX,2,100);
Xaxis = ((DataX[1]<<8) | DataX[0])/660.f;
// RECEIVE Y_axis
HAL_I2C_Mem_Read(&hi2c3,HMC5883l_ADDRESS,HMC5883l_ADD_DATAY_MSB_MULTI,1,DataY,2,100);
Yaxis = ((DataY[1]<<8) | DataY[0])/660.f;
// RECEIVE Z_axis
HAL_I2C_Mem_Read(&hi2c3,HMC5883l_ADDRESS,HMC5883l_ADD_DATAZ_MSB_MULTI,1,DataZ,2,100);
Zaxis = ((DataZ[1]<<8) | DataZ[0])/660.f;