This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] RM46L852:与 INA237进行 I2C 通信

Guru**** 2390755 points
Other Parts Discussed in Thread: INA237, RM46L852, SYSCONFIG

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1106768/rm46l852-i2c-communication-with-ina237

器件型号:RM46L852
Thread 中讨论的其他部件:INA237SysConfig

尊敬的香榭丽舍

我的客户通过 I2C 将 INA237连接到 RM46L852、但与 INA237通信失败。

由于在 SysConfig 生成的驱动程序代码下没有实现 I2C 通信、  

https://dev.ti.com/sysconfig/index.html?product=ascstudio&module=/ti/sensors/currentsensor/INA237

他们自己实施了这项计划,但未能与 INA237通信。

您能否查看以下代码或与 INA237共享 I2C 通信示例?

~~~~~~~μ A

uint8_t i2c_send (uint32长度、uint8 *数据、uint8_t slave_Address)

   uint8_t ERR_ret = 0;
//  while (i2cIsTxReady (i2cREG1)=0){}
 uint16_t cnt = 0;
   i2cSetSlaveAdd (i2cREG1、SLAVE_Address);
   i2cSetDirection (i2cREG1、I2C_transmitter);
   i2cSetCount (i2cREG1、长度);
   i2cSetMode (i2cREG1、I2C_MASTER);
   i2cSetStop (i2cREG1);
   i2cSetStart (i2cREG1);
   i2cSend (i2cREG1、长度、数据);
   //i2cSetStop (i2cREG1);
   
   while (i2cIsBusy (i2cREG1)=true){
  CNT++;
  if (cnt > 0x7ff){
   //printf ("i2c_send timeout!!!!\n");
   ERR_RET = 1;
   中断;
  }
 }
 CNT = 0;
   while (i2cIsStopDetected (i2cREG1)= 0){
  CNT++;
  if (cnt > 0x7ff){
   //printf ("i2c_send timeout!!!!\n");
   ERR_RET = 1;
   中断;
  }
 }
   i2cClearSCD (i2cREG1);

 CNT = 0;
   while (i2cIsMasterReady (i2cREG1)==0){
  CNT++;
  if (cnt > 0x7ff){
   //printf ("i2c_send timeout!!!!\n");
   ERR_RET = 1;
   中断;
  }
 }

   如果(ERR_RET = 1){
       //printf ("err_ret %d:do i2cInit\n"、err_ret);
       i2C_reinit();
   }

   返回 ERR_RET;

 

uint8_t i2c_receive (uint8 * data、uint8_t cnt、uint8_t slave_Address)

 uint8_t ERR_ret = 0;
 uint16_t failcnt = 0;
 // uint8_t i;
 // uint8_t tempData[40];

//   while (i2cIsRxReady (i2cREG1)=0){}
   i2cSetSlaveAdd (i2cREG1、SLAVE_Address);
   i2cSetDirection (i2cREG1、I2C_RECEIVER);
   i2cSetCount (i2cREG1、cnt);
   i2cSetMode (i2cREG1、I2C_MASTER);
   i2cSetStop (i2cREG1);
   i2cSetStart (i2cREG1);
#if 0

   i2cReceive (i2cREG1,40、tempData);

其他
   i2cReceive (i2cREG1、cnt、&data[0]);
/*
   if (data[0]<3)
   {
       i2cREG1->MDR |= 0x8000;
       i2cSetStop (i2cREG1);
       i2cReceive(i2cREG1,1,1,&data[1]);
   }
   其他
   {
       i2cReceive (i2cREG1、data[0]-2、&data[1]);
       i2cREG1->MDR |= 0x8000;
       i2cSetStop (i2cREG1);
       i2cReceive (i2cREG1、1、&data[0]-1]);
   }
*
#endif
   //i2cSetStop (i2cREG1);
   while (i2cIsBusy (i2cREG1)=true){
       failcn++;
  if (failcnt > 0x7ff){
   //printf ("i2c_receive timeout!!!!\n");
   ERR_RET = 1;
   中断;
  }
 }
   failcnt = 0;
   while (i2cIsStopDetected (i2cREG1)= 0){
       failcn++;
  if (failcnt > 0x7ff){
   //printf ("i2c_receive timeout!!!!\n");
   ERR_RET = 1;
   中断;
  }
 }
   failcnt = 0;

   i2cClearSCD (i2cREG1);
   while (i2cIsMasterReady (i2cREG1)==0){
       failcn++;
  if (failcnt > 0x7ff){
   //printf ("i2c_receive timeout!!!!\n");
   ERR_RET = 1;
   中断;
  }
 }

   I2C_DELAY (100);
  // memcpy (data、tempData、tempData[0]);
   返回 ERR_RET;

 

int8_t MCU_i2c 传输(uint8_t BusID、uint8_t i2cAddr、
                       uint8_t * dataToWrite、uint8_t writeLength、
                       uint8_t * dataToRead、 uint8_t readLength)

   /*
    * 在此处添加 MCU 特定的 I2C 读取/写入代码。
    *
   INT8_t ERR_RET = 0;
   ERR_ret =(INT8_t) i2c_send (writeLength、dataToWrite、i2cAddr);
   if (err_ret!= 0){
       printf ("发送错误\n");
   }
   否则、如果(readLength > 0){
       ERR_ret = i2c_receive (dataToRead、readLength、i2cAddr);
       if (err_ret!= 0){
           printf ("接收错误\n");
       }
   }
   返回 ERR_RET;
   /*
    * 添加用于错误处理的 MCU 特定返回代码
    *

   返回(0);

~~~~~~~~μ A

谢谢、此致、

SI

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引用 userid="3169" URL"~μ C/support/microriers/arm-based microrims-group/arm -based microrims/f/arm based microrims-forum/1106768/rm46l852-i2c-community-with -ina237"]您能否查看以下代码或共享与 INA237进行 I2C 通信的示例?[/引用]

    您的代码有什么问题? 我们没有用于与 INA237进行通信的示例代码。

    I2C SCL 和 SDA 是否通过电阻器上拉?  SCL 和 SDA 线路都是"开漏"、因此 I2C 模块可以将 SCL 和 SDA 驱动为低电平、但不能将它们驱动为高电平。 为了使这两条线路能够变为高电平、您必须提供上拉电阻器。

    您是否使用了正确的从器件地址? INA237的 I2C 地址由引脚 A0和引脚 A1定义。  

    引脚3和引脚4在 I2C 和 N2HET1以及 MibSPI 之间共用。 请正确配置 pinmmx: