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.

[参考译文] TMS320F28377D:使用 f28377D 的 INA237和 I2CA 总线进行电流检测

Guru**** 2379200 points
Other Parts Discussed in Thread: INA237, C2000WARE
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1457447/tms320f28377d-current-sensing-using-ina237-and-i2ca-bus-of-f28377d

器件型号:TMS320F28377D
主题中讨论的其他器件:INA237C2000WARE

工具与软件:

尊敬的社区:
我正在开发一个固件、以使用 I2CA 总线从 INA237获取电流消耗数据、其中 GPIO91和92分别用作 SDLA 和 SCLA 引脚。
我已经使用 system.config 完成了所有初始化。 我通过 I2C 修改了 EEPROM 的读取和写入代码。 我也使用了 INA237系统配置(https://dev.ti.com/sysconfig/index.html#/config/?args=--product%20%2Fmnt%2Ftirex-content%2Fascstudio_1_0_15%2F.metadata%2Fproduct.json%20--device%20Other&module=%2Fti%2Fsensors%2Fcurrentsensor%2FINA237)

在 mcu.c 中、我已添加以下代码。

/*
*在此包含通用头文件
*/
#include "driverlib.h"
#include "device.h"
#include "board.h"
#include "c2000ware_libraries.h"
#include "mcu.h"
#define I2C_SUCCESS 0
#define ERROR_STOP_NOT_READY -1
#define ERROR_BUS_BUS_BUSY -2
/***** MCU 特定的 I2C 代码从此处开始**** /
空 MCU_i2cInit (uint8_t BusID)

device_init();
device_initGPIO();
Interrupt_initModule();
interrupt_initVectorTable();
board_init();
C2000Ware_libraries_init ();
EINT;
ERTM;
}
int8_t MCU_i2cTransfer (uint8_t BusID、uint8_t i2cAddr、
uint8_t * dataToWrite、uint8_t writeLength、
uint8_t * dataToRead、uint8_t readLength)

uint16_t i;
//等待直到 STP 位从任何之前的主通信中清除
如果(I2C_getStopConditionStatus (I2CA_BASE))

return -1;// ERROR_STOP_NOT_READY
}

//设置从地址
I2C_setSlaveAddress (I2CA_BASE、i2cAddr);
//检查总线是否繁忙
如果(I2C_isBusBusBusy (I2CA_BASE)

return -2;// ERROR_BUS_BUS_BUSY
}
//如果需要写入数据、请写入数据
如果(写入长度> 0)

//设置要发送的字节数
I2C_setDataCount (I2CA_BASE、writeLength);

//设置要发送的数据
对于(i = 0;i < writeLength;i++)

I2C_putData (I2CA_BASE、dataToWrite[i]);
}
//作为主发送器发送启动
I2C_setConfig (I2CA_BASE、I2C_MASTER_SEND_MODE);
I2C_sendStartCondition (I2CA_BASE);
I2C_sendStopCondition (I2CA_BASE);
//等待写入完成
while (I2C_isBusBusBusy (I2CA_BASE));
}

//读取数据(如果需要读取)
if (readLength > 0)

//等待直到 STP 位从任何之前的主通信中清除
如果(I2C_getStopConditionStatus (I2CA_BASE))

返回 ERROR_STOP_NOT_READY;
}
//设置从地址
I2C_setSlaveAddress (I2CA_BASE、i2cAddr);
//检查总线是否繁忙
如果(I2C_isBusBusBusy (I2CA_BASE)

返回 ERROR_BUS_BUS_BUSY;
}
//设置要读取的字节数
I2C_setDataCount (I2CA_BASE、readLength);
//作为主接收器发送启动命令
I2C_setConfig (I2CA_BASE、I2C_MASTER_RECEIVE_MODE);
I2C_sendStartCondition (I2CA_BASE);
//读取数据
对于(I = 0;I < readLength;I++)

// while (! I2C_isDataReady (I2CA_BASE);//等待数据就绪
dataToRead [i]= I2C_getData (I2CA_BASE);
}
I2C_sendStopCondition (I2CA_BASE);
//等待读取完成
while (I2C_isBusBusBusy (I2CA_BASE));
}
//检查错误
如果(I2C_getStatus (I2CA_BASE)!= I2C_SUCCESS)

return -3;//发生错误
}

Return I2C_Success;//成功
}

/***** MCU 特定的延迟代码从此处开始**** /
void mcu_msWait (uint16_t msWait)

/*
*为 msWait 添加 MCU 特定的等待循环。 单位为毫秒
*/
}

void mcu_usWait (uint16_t usWait)

/*
*为 usWait 添加 MCU 特定的等待循环。 单位为微秒
*/
}
/***** MCU 特定的延迟代码在此处结束***** /

上述初始化是否正确? 下面是 board_init()函数

空 Board_init()

EALLOW;

PinMux_init();
I2C_INIT();

EDIS;
}

//
//
// PINMUX 配置
//
//
void PinMux_init()

//
//分配给 CPU1的模块的 PinMux
//

//
// I2CA -> i2c_A 引脚多路复用
//
GPIO_setPinConfig (i2c_a_I2CSDA_PIN_CONFIG);
GPIO_setPadConfig (i2c_a_I2CSDA_GPIO、GPIO_PIN_TYPE_STD | GPIO_PIN_TYPE_PULLUP);
GPIO_setQualificationMode (i2c_a_I2CSDA_GPIO、GPIO_QUAL_ASYNC);

GPIO_setPinConfig (i2c_a_I2CSCL_PIN_CONFIG);
GPIO_setPadConfig (i2c_a_I2CSCL_GPIO、GPIO_PIN_TYPE_STD | GPIO_PIN_TYPE_PULLUP);
GPIO_setQualificationMode (i2c_a_I2CSCL_GPIO、GPIO_QUAL_ASYNC);


}

//
//
// I2C 配置
//
//
void I2C_init(){
I2C_A_init ();
}

void i2c_a_init (){
I2C_disableModule (i2c_a_base);
I2C_initController (i2c_a_base、device_SYSCLK_FREQ、i2c_a_bitrate、I2C_DUTYCYCLE_33);
I2C_setConfig (i2c_a_base、I2C_CONTROLLER_SEND_MODE);
I2C_disableLoopback (i2c_a_base);
I2C_setOwnAddress (i2c_a_base、i2c_a_own_address);
I2C_setTargetAddress (i2c_a_base、i2c_a_target_address);
I2C_setBitCount (i2c_a_base、I2C_BITCOUNT_8);
I2C_setDataCount (i2c_a_base、2);
I2C_setAddressMode (i2c_a_base、I2C_ADDR_MODE_7BITS);
I2C_enableFIFO (i2c_a_base);
I2C_setEmulationMode (i2c_a_base、I2C_emulation_free_run);
I2C_enableModule (i2c_a_base);
}

您能请参考 F28377D 技术参考手册的页码、我可以从其中获取相关功能的帮助吗? - mcu_msWait (uint16_t msWait)

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

    您好!

    如果您只是在寻找添加特定延迟的方法、我们的示例通常使用"device_delay_US (x)"、其中"x"是 CPU 时钟周期数。 您可以定制数字、以符合您所需的时间。

    此致、

    Allison