stm32读取HMC58663L数据失败

stm32f103RCT6读取hmc56883l失败。在事件6中会一直无限循环


```c
#include "hmc5883l.h"
#include "stdio.h"
#include "delay.h"



/**
 * 连线接口
*/
#define Reg GPIOB
#define SCL GPIO_Pin_6
#define SDA GPIO_Pin_7

#define I2C_Speed_200 200000


/**
 * HMC58663l
*/
#define Slave_Address 0x3d
#define Read_Reg_Address 0x03






void Hmc_I2c_Init(void) {
  GPIO_InitTypeDef I2c_Gpio_Instance = { 0 };
  I2C_InitTypeDef I2C_Instance = { 0 };

  /*启动时钟*/
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1, ENABLE);


  I2c_Gpio_Instance.GPIO_Pin = SCL | SDA;
  I2c_Gpio_Instance.GPIO_Mode = GPIO_Mode_AF_OD;
  I2c_Gpio_Instance.GPIO_Speed = GPIO_Speed_50MHz;

  GPIO_Init(Reg, &I2c_Gpio_Instance);

  I2C_Instance.I2C_Ack = I2C_Ack_Enable;
  I2C_Instance.I2C_Mode = I2C_Mode_SMBusHost;
  I2C_Instance.I2C_DutyCycle = I2C_DutyCycle_2;
  I2C_Instance.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;
  I2C_Instance.I2C_ClockSpeed = I2C_Speed_200;
  I2C_Instance.I2C_OwnAddress1 = 0xf1;

  I2C_Init(I2C1, &I2C_Instance);
  I2C_Cmd(I2C1, ENABLE);
  I2C_AcknowledgeConfig(I2C1, ENABLE);

}


uint8_t* Hmc_I2c_Recv_Magnetometer(void)
{
  int i = 0;
  static uint8_t axis[9];


  while (I2C_GetFlagStatus(I2C1, I2C_FLAG_BUSY));


  I2C_GenerateSTART(I2C1, ENABLE);




  while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT));


  I2C_Send7bitAddress(I2C1, Slave_Address + 1, I2C_Direction_Receiver);


  //这里一直无限循环 ,通过I2C_GetLastEvent获取到最后一次事件得到一个16进制**0x4400**
  while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED));


  I2C_SendData(I2C1, 0x00);
  I2C_SendData(I2C1, 0x78);

  I2C_GenerateSTART(I2C1, ENABLE);

  I2C_SendData(I2C1, 0x3C);
  I2C_SendData(I2C1, 0x02);
  I2C_SendData(I2C1, 0x00);


  for (i = 0; i < 8; i++)
  {
    printf("I2C_EVENT_MASTER_BYTE_RECEIVED-{%d}--->start\r\n", i);
    if (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_RECEIVED));
    printf("I2C_EVENT_MASTER_BYTE_RECEIVED-{%d}--->end\r\n", i);

    if (i == 7)
    {
      I2C_AcknowledgeConfig(I2C1, DISABLE);
    }

    axis[i] = I2C_ReceiveData(I2C1);
  }
  printf("I2C_GetFlagStatus--->end\r\n");

  axis[8] = (uint8_t)'\0';

  printf("Revc the Data axis:%s\r\n", axis);

  I2C_GenerateSTOP(I2C1, ENABLE);
  I2C_SoftwareResetCmd(I2C1, ENABLE);
  I2C_AcknowledgeConfig(I2C1, ENABLE);
  I2C_ClearFlag(I2C1, I2C_FLAG_STOPF);

  return axis;
}






```

这是一段 STM32 程序,使用了 I2C 接口来读取 HMC5883L 磁力计的数据。

在这段代码中,出现了一个错误:在调用 I2C_CheckEvent 函数时,返回了 I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED 事件。这意味着在 I2C 总线上,主机处于接收模式,并且已经选择了从机的地址。

这个错误的原因可能是:

在调用 I2C_CheckEvent 函数之前,没有发送 START 信号或者发送的地址不正确。
在调用 I2C_CheckEvent 函数之前,没有正确配置 I2C 总线的速率和模式。
在调用 I2C_CheckEvent 函数之前,没有正确使能 I2C 总线。
HMC5883L 磁力计的地址或者寄存器地址设置不正确。
为了解决这个问题,你可以检查上述四个原因,确保 I2C 总线的配置和使用正确,并确保 HMC5883L 磁力计的地址和寄存器地址设置正确。

希望这些信息能帮到你!

报错发给我看看