ST意法半导体
直播中

叹久

9年用户 828经验值
擅长:可编程逻辑 光电显示 接口/总线/驱动
私信 关注
[问答]

如何在STM32F469I-Disoc板的400kHz模式下使用CubeMX设置I2C总线呢?

所以我试图用我的 STM32F469I-Disoc 板设置一个 INA3221 电流/电压/功率传感器。I2C_address 是 0x43(如果左移则为 0x86)。我在 400kHz 模式下使用 CubeMX 设置了我的 I2C,并且已经用于与 BME280 传感器交互。与该传感器的交互没有问题,但它使用 8 位寄存器。
INA3221 传感器有 16 位寄存器。我刚刚开始,想在写入我自己的配置后检查/读取配置寄存器 (0x00) 的值(配置值:0x7FFF)。
我想我做错了写操作,但我现在还不知道要更改什么:
  • extern I2C_HandleTypeDef hi2c1;
  • typedef struct
  • {
  •         uint16_t checkv;
  • }INA_DATA;
  • INA_DATA INA;
  • //Initialization of the INA3221
  • void INA3221_Init(void)
  • {
  •         HAL_StatusTypeDef status=HAL_OK;
  •         uint16_t mycfg=0x7FFF; //All channels enabled, 1024 averaging samples, 8.2ms BV CT, 8.2ms SV CT, and all continuous measuring
  •         //uint16_t mycfg=0x7927; //All channels enabled, 128 averaging samples, 1ms BV CT, 1ms SV CT, and all continuous measuring
  •         //INA_ID=0x86 (SCL solder pad), Config=register address=0x00,
  •         status=HAL_I2C_Mem_Write(&hi2c1,INA_ID,Config,I2C_MEMADD_SIZE_16BIT,(uint8_t*)&mycfg,1,0x10000);
  •         if(status!=HAL_OK)Error_Handler();
  •         status=HAL_I2C_Mem_Read(&hi2c1,INA_ID,Config,I2C_MEMADD_SIZE_16BIT,(uint8_t*)&INA.checkv,1,0x10000);
  •         if(status != HAL_OK) Error_Handler();
  •         if(INA.checkv!=mycfg)
  •                 {
  •                         for(uint8_t k=0;k<3;k++)
  •                         {
  •                         HAL_Delay(500);
  •                         Error_Handler();
  •                         }
  •                 }
  • }
所以我尝试将数据量更改为 2,如果我这样做的话 HAL_I2C_Mem_Write(); 返回 HAL_ERROR 作为状态。如果我从配置地址读取数据量=1,则存储数据(checkv)为0,如果我读取更多数据(数量=2),则存储数据为0xFF00。
如果我在读取和写入函数中将内存大小设置为 8 并将数据量设置为 2,我将得到 0x2771 作为我的寄存器值,这也不是它应该的值。0x2771 可能代表上电复位值 0x7127。
下面是 INA3221 的寄存器映射。

我感谢任何关于我出错的提示。

编辑:
这就是我使用 HAL_I2C_Mem_Read/Write 进行写入/读取的方式:
写入时,只需交换要写入的 MS字节和 LS字节。我想将 0x7D3F 写入寄存器并简单地交换字节。
读取寄存器并使用读取的数据时,您必须再次交换字节。
我用下面评论中的代码做到了这一点。
  • uint16_t mycfg=0x3F7D;
  • //INA_ID=0x86 (SCL solder pad), Config=register address=0x00,
  • status=HAL_I2C_Mem_Write(&hi2c1,INA_ID,Config,I2C_MEMADD_SIZE_8BIT,(uint8_t*)&mycfg,2,0x10000);
  • //check for config value
  • status=HAL_I2C_Mem_Read(&hi2c1,INA_ID,Config,I2C_MEMADD_SIZE_8BIT,(uint8_t*)&INA.checkv,2,0x10000);
如果您想更仔细地查看,我将 INA3221 的数据表放在了附录中。





回帖(1)

文甘翀

2023-1-5 10:27:36
I2C 总线有一个规范,这个规范只定义字节(8 位)传输。
我想这指定了传感器数据表中的传输顺序:
举报

更多回帖

发帖
×
20
完善资料,
赚取积分