主题中讨论的其他器件:INA237、 C2000WARE
工具与软件:
尊敬的社区:
我正在开发一个固件、以使用 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)