使用HMC5883l的带stm32f4的I2C
我一直在尝试将HMC5883l板连接到stm32f4,但是有些东西工作不正常。我已启动i2c,将配置位发送到REGA、REGB和REGMR(模式寄存器),并通过USB连接将其发送回HAL_i2c_MEM_READ 结果是:使用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
- 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;