/*
 * MMC5603 STM32 HAL I2C 参考模板
 * 说明：这是寄存器裸读框架，适合客服/工程排查使用。
 * 需要按自己的工程修改 hi2c1、printf、延时和错误处理。
 * 常见 7-bit I2C 地址：0x30；STM32 HAL 传入地址用 (0x30 << 1)。
 */
#include "main.h"
#include <stdint.h>
#include <stdio.h>

extern I2C_HandleTypeDef hi2c1;

#define MMC5603_ADDR_7BIT   0x30
#define MMC5603_ADDR_HAL    (MMC5603_ADDR_7BIT << 1)

// 常见寄存器名请以 MEMSIC MMC5603NJ datasheet 为准。
#define MMC5603_REG_PRODUCT_ID  0x39

static HAL_StatusTypeDef mmc5603_read_reg(uint8_t reg, uint8_t *buf, uint16_t len) {
  return HAL_I2C_Mem_Read(&hi2c1, MMC5603_ADDR_HAL, reg, I2C_MEMADD_SIZE_8BIT, buf, len, 100);
}

static HAL_StatusTypeDef mmc5603_write_reg(uint8_t reg, uint8_t value) {
  return HAL_I2C_Mem_Write(&hi2c1, MMC5603_ADDR_HAL, reg, I2C_MEMADD_SIZE_8BIT, &value, 1, 100);
}

void MMC5603_Test(void) {
  uint8_t id = 0;

  if (HAL_I2C_IsDeviceReady(&hi2c1, MMC5603_ADDR_HAL, 3, 100) != HAL_OK) {
    printf("MMC5603 not ACK at 0x30\r\n");
    return;
  }

  if (mmc5603_read_reg(MMC5603_REG_PRODUCT_ID, &id, 1) == HAL_OK) {
    printf("MMC5603 product id reg 0x39 = 0x%02X\r\n", id);
  } else {
    printf("Read product id failed\r\n");
  }

  /*
   * 后续读取 X/Y/Z：
   * 1. 按 datasheet 写入测量命令。
   * 2. 等待转换完成或读取状态位。
   * 3. 连续读取 X/Y/Z 原始寄存器。
   * 4. 按 datasheet 的比例换算为 uT / Gauss。
   * 建议先用逻辑分析仪确认有 ACK，再移植完整驱动。
   */
}
