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.

[参考译文] CCS/MSP430F5529:通过I2C将多字节传输到INA219传感器时出现问题

Guru**** 2609895 points
Other Parts Discussed in Thread: MSP430F5529, INA219

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/655669/ccs-msp430f5529-issue-while-transmitting-mutiple-bytes-via-i2c-to-ina219-sensor

部件号:MSP430F5529
主题中讨论的其他部分: INA219

工具/软件:Code Composer Studio

IA M尝试将多字节数据从MSP430F5529发送到INA219校准寄存器以进行电流测量。我总共发送3个字节,其中第一字节是校准寄存器地址,其余两字节是要写入 校准寄存器的内容 以下代码片段,在传输注册地址后,程序停止,编译器甚至不进入中断服务例程。如果我知道我的代码片段是否有问题,以及需要进行哪些适当的更改以满足我的目的,将会很有帮助。

#include"driverlib.h"
#define slaver_address 0x40
#define TXLENGTH 0x03
uint8_t S数据[3]={0x40,0x34,0x6E};
uint8_t传输计数器= 0;
void main()
{
//停止WDT
WDT_A_HOLD (WDT_A_BASE);

//将I2C引脚分配给USI_B0
GPIO_setAsPeripheralModuleFunctionInputPin (
GPIO端口P3,
GPIO _PIN1 + GPIO _PIN2
);

//初始化主中继器
USI_B_I2C_initMasterParam ={0};
param.selectClockSource = USI_B_I2C_CLOCKSOURCE_SMCLK;
PARAM.i2cClk = UCS_getSMCLK();
Param.datarate = USI_B_I2C_SET_DATA_RATE_400KBPS;
USI_B_I2C_INITMaster (USI_B0_BASE,&param);

//指定从属地址
USI_B_I2C_setSlaveAddress (USI_B0_BASE,
Slaver_address
);

//设置传输模式
USI_B_I2C_setMode (USI_B0_BASE,
USI_B_I2C_Transmit_mode
);

//启用I2C模块以启动操作
USI_B_I2C_ENABLE (USI_B0_BASE);

同时(1)
{
//启用发射中断
USI_B_I2C_clearInterrupt (USI_B0_BASE,
USI_B_I2C_Transmit_Interrupt
);
USI_B_I2C_enableInterrupt (USI_B0_BASE,
USI_B_I2C_Transmit_Interrupt
);

//每个事务之间的延迟
__DELAY周期(50);

//加载TX字节计数器
传输计数器= 1;

//启动开始并发送第一个字符
USI_B_I2C_masterSendMultiByteStart(USCI_B0_Base,
传输数据[0]
);

//在启用中断的情况下输入LPM0
__bis_sr_register (LPM0_bits + GIE);
__no_operation();

//延迟到传输完成
while (USI_B_I2C_isBusy (USI_B0_BASE))
{
;}

}//******************************************************************************************************



//
//这是USI_B0中断向量服务例程。
////************************************************************************************************

#if defined(__TI_Compiler_version__)|| defined(__IAR_systems_ICC__)
#pragma vector=USI_B0_vector
__interrupt
#Elif defined(__Gnu___)
__attribute__((interrupt (USI_B0_vector))
#endif
void USI_B0_ISR(vector))
{
SWITCH(__EIV_IN_RANGE(UCB0IV,12))
{
案例USI_I2C_UCTXIFG:
{
//检查TX字节计数器
IF (传输计数器< TXLENGTH)
{
//启动从主服务器到从服务器的字符发送
USI_B_I2C_masterSendMultiByteNext(USCI_B0_BASE,
传输数据[传输计数器]
);

//增量TX字节计数器
传输计数器++;
}
否则
{
//仅启动停止
USI_B_I2C_masterSendMultiByteStop (USI_B0_BASE);

//清除主中断状态
USI_B_I2C_clearInterrupt (USI_B0_BASE,
USI_B_I2C_Transmit_Interrupt);

//中断返回时退出LPM0
__BIC_SR_REGISTER_ON_EXIT (LPM0_bits);
}
中断;
}
}
}

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

    为了澄清,程序是否为发送的第一个字节输入ISR? 或者,您是否从未看到它进入ISR?

    此致,
    Nathan
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您提供的代码几乎是USI_b_i2c_ex2_masterTxMultiple代码示例的直接副本。
    由于代码很可能是稳定的,我们应该将重点放在硬件设置上。 您选择的从属地址将指示INA219引脚A0和A1已连接到GND,请确保这是情况。 您是否在SDA和SCL上都填充了典型的3.3 kOhm上拉电阻? 最重要的是MSP430F5529 USCIB0 I2C引脚位于WFP 3.0 和WFP 3.1 上,您的代码需要反映出这一点。 使用逻辑分析仪或示波器进一步分析您的通信总线。

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

    感谢您的建议。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    它甚至没有进入ISR,我可以看到变量传输器甚至设置为1。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好,

    Ryan的建议是否帮助你解决了问题? 如果是,请将其标记为"已回答"。

    此致,
    Nathan