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 磁力计的地址和寄存器地址设置正确。
希望这些信息能帮到你!
报错发给我看看