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.

[参考译文] MSP430F6779A:I2C 无法正常工作

Guru**** 2394305 points


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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/951041/msp430f6779a-i2c-not-working-properly

器件型号:MSP430F6779A

因此、我一直在尝试接收一些通过 I2C 连接到 I/O 扩展器的数字 INPIT 位。 代码在几个月前就运行过一次、但现在当我再次尝试时、它不起作用。 当我在中断矢量表中为 NACK 中断标志添加断点时、我发现微控制器正在获取 NACK 标志。 我100%确定从器件地址正确(0x19)。 我已启用所有中断、但当我尝试接收字节信息时、代码会停留在 while 循环中。 这表明主器件和从器件之间的连接没有建立、这会导致问题的发生。 我已经尝试了一切以使它正常工作、但它不起作用。 请在这里帮助我。 

我遇到卡滞的部分位于下方。 当我尝试在主电源 while 环路中接收字节时、代码卡在 EUSCI_B_I2C_masterReceiveSingle while 环路中。 当我尝试在中断中调用如下代码所示的同一函数时、控制器不会到达该语句、因为 RXIFG 位未置位。




uint8_t eUSCI_B_I2C_masterReceiveSingle (uint16_t baseAddress)
{
//如果 RXIE 未被使能则轮询 RXIFG0
if (!(HWREG16 (baseAddress + OFS_UCBxIE)& UCRXIE0))
{
while (!(HWREG16 (baseAddress + OFS_UCBxIFG)& UCRXIFG0)) //代码卡在此处
{
;
}
}

//读取一个字节。
返回(HWREG16 (baseAddress + OFS_UCBxRXBUF));
} 


这是我通过 I2C 接收数据的整个代码


#define SLAVE_ADDRESS 0x19
#include "driverlib.h"
uint8_t RXData;
void main (void)
{
//停止 WDT
WDT_A_HOLD (WDT_A_base);

GPIO_setPeripheralModuleFunctionInputPin (
GPIO_PORT_P4、
GPIO_PIN4 + GPIO_PIN5
);

EUSCI_B_I2C_initMasterParam param ={0};
param.selectClockSource = EUSCI_B_I2C_CLOCKSOURCE_SMCLK; //将时钟源设置为 SMCLK
param.i2cClk = UCS_getSMCLK ();
param.datarate = EUSCI_B_I2C_SET_DATA_RATE_100KBPS;
param.byteCounterThreshold = 1; //要接收的字节数
param.autoSTOPGeneration =
EUSCI_B_I2C_NO_AUTO_STOP; //无自动停止。 如果接收到所需的字节(在本例中为-1)、我可以将其设置为停止。
EUSCI_B_I2C_initMaster (EUSCI_B1_base、&param);

EUSCI_B_I2C_setSlaveAddress (EUSCI_B1_base、
从器件地址
);

//将主设备设置为接收模式
EUSCI_B_I2C_setMode (EUSCI_B1_BASE、
EUSCI_B_I2C_Receive_mode
);

UCB1IE = 0;
//启用 I2C 模块以启动操作
EUSCI_B_I2C_ENABLE (EUSCI_B1_BASE);

EUSCI_B_I2C_clearInterrupt (EUSCI_B1_base、
EUSCI_B_I2C_Receive_INTERRUPT1 +
EUSCI_B_I2C_BYTE_COUNTER_INTERRUPT + EUSCI_B_I2C_NAK_INTERRUPT); //清除所有必需的中断


EUSCI_B_I2C_enableInterrupt (EUSCI_B1_BASE、
EUSCI_B_I2C_Receive_INTERRUPT1 +
EUSCI_B_I2C_BYTE_COUNTER_INTERRUPT + EUSCI_B_I2C_NAK_INTERRUPT
);


_ENABLE_INTERRUPT ();
//_bis_SR_register (GIE);
while (1)
{
_DELAY_CYCLES (2000);
while (EUSCI_B_I2C_Sending _stop =
EUSCI_B_I2C_masterIsStopSent (EUSCI_B1_BASE)
{
;
}
// I2C 启动条件
EUSCI_B_I2C_masterReceiveStart (EUSCI_B1_BASE);
}
}

#if defined (__TI_Compiler_version__)|| defined (__IAR_systems_icc_)
#pragma vector=USCI_B1_vector
__interrupt
#elif defined (__GNU__)
__attribute__(INTERRUPT (USCI_B1_vector)))#endif

void USCIB1_ISR (void
)
静态 uint8_t 计数= 0;
switch (__evo_in_range (UCB1IV、0x1E))
{
情况0x00:
中断; //向量0:无中断中断;
情况0x02:break; //向量2:ALIFG 中断;
情况0x04:
EUSCI_B_I2C_masterReceiveStart (EUSCI_B1_BASE);
中断; //向量4:NACKIFG 中断;
情况0x06:break; //向量6:STT IFG 中断;
情况0x08:break; //向量8:STPIFG 中断;
情况0x0a:中断; //向量10:RXIFG3中断;
情况0x0c:中断; //向量14:TXIFG3中断;
情况0x0E:中断; //向量16:RXIFG2 break;
情况0x10:中断; //向量18:TXIFG2中断;
情况0x12:
RXData = EUSCI_B_I2C_masterReceiveSingle (
EUSCI_B1_BASE
);
中断; //向量20:RXIFG1 break;
情况0x14:中断; //向量22:TXIFG1中断;
情况0x16:
RXData = EUSCI_B_I2C_masterReceiveSingle (
EUSCI_B1_BASE
); //获取 RX 数据

中断; //向量24:RXIFG0中断;
情况0x18:break; //向量26:TXIFG0中断;
情况0x1a:
中断; //向量28:BCNTIFG 中断;
情况0x1c:中断; //向量30:时钟低电平超时中断;
情况0x1E:中断; //向量32:第9位中断;
默认值:break;
}
} 



请帮我、我不确定我在做什么。 我已经花了几周的时间尝试找出这个问题。Pls 帮助。 谢谢
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    如果从从器件获得 NACK、则无法执行其他任何操作。 我建议您重点关注这一点。

    1) 1)检查您的接线(再次)。 您是否相当确定从器件已加电、并且上拉电阻器仍处于连接状态? (请记住、NACK 只是缺少 ACK、因此如果从器件处于"死状态"、这就是您将看到的结果。)

    2) 2)您使用的是什么从器件? 更具体地说:它安装在什么板上? 某些电路板允许您使用跳线更改从器件地址、如果您更改了从器件地址(即使是意外更改)、则会遇到 nack。

    3) 3)如果您有范围、交易跟踪通常具有启发性。

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

    您好、Harsh、

    您是否在这方面取得了更多进展?  

    您是否有一个 LSA 来查看 I2C 总线?   

    此外、我通常建议用户从 MSP430 I2C 标准主器件示例开始、其中包含一些 Read_register 和 Write_Register 函数示例:    

    谢谢、

    JD