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.

[参考译文] MSP430FR5989:driverlib:控制器在等待发送中断标志时被击中

Guru**** 2595805 points
Other Parts Discussed in Thread: MSP430FR5989

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/740668/msp430fr5989-driverlib-controller-struck-while-waiting-for-transmit-interrupt-flag

器件型号:MSP430FR5989
主题中讨论的其他器件: MSP430WARE

您好!

我尝试使用 MSP430FR5989从基于 I2C 的 EEPROM 读取数据。 我目前正在使用基于 MSP430Ware v3.80.05.04的 driverlib API 进行通信。 发送起始条件后、控制器始终在以下行中挂起:

//轮询发送中断标志。
while (!(HWREG16 (baseAddress + OFS_UCBxIFG)& UCTXIFG)); 

我已经尝试使用多个 API、现在都很成功。 为了更好地理解、我附上了以下代码。 我缺少什么吗?

-Lovelesh

#define SLAVE_ADDRESS 0xA6

#define NFC_LPD_PORT GPIO_PORT_P3
#define NFC_LDW_PIN GPIO_PIN0
#define NFC_LPD_LOW GPIO_setOutputLowOnPin (NFC_LDW_PORT、NFC_LDW_PIN)
#define NFC_LDW_HIGH GPIO_setOutputHighOnPin (NFC_LDW_PORT、NFC_LDW_PIN)

uint8_t TXData[]={'0x00'、'0x01'、'H'、'E'、'L'、 'L'、'O'、'0x06'、'0x07'、'0x08'}; //指向 TX 数据
uint8_t TXByteCtr 的指针;
uint8_t MAXByte = 10;

void main (void)
{
WDT_A_HOLD (WDT_A_base);

//将 DCO 频率设置为1MHz
CS_setDCOFreq (CS_DCORSEL_0、CS_DCOFSEL_0);
//set ACLK = VLO、分频器为1
CS_initClockSignal (CS_ACLK、CS_VLOCLK_select、CS_clock_divider);
//set SMCLK = DCO、分频器为1
CS_initClockSignal (CS_SMCLK、CS_DCOCLK_select、CS_Clock_divider);
//set MCLK = DCO、分频器为1
CS_initClockSignal (CS_MCLK、CS_DCOCLK_select、CS_Clock_divider);

//为 I2C 配置引脚
//将 P1.6和 P1.7设置为辅助模块功能输入。
/*

*选择端口1
*将引脚6、7设置为输入次级模块功能(UCB0SIMO/UCB0SDA、UCB0SOMI/UCB.S)。
*
GPIO_setPeripheralModuleFunctionInputPin (
GPIO_PORT_P1、
GPIO_PIN6 + GPIO_PIN7、
GPIO_secondary 模块功能
);

/*
*禁用 GPIO 上电默认高阻抗模式以激活
*先前配置的端口设置
*
PMM_unlockLPM5 ();

EUSCI_B_I2C_initMasterParam param ={0};
param.selectClockSource = EUSCI_B_I2C_CLOCKSOURCE_SMCLK;
param.i2cClk = CS_getSMCLK ();
param.datarate = EUSCI_B_I2C_SET_DATA_RATE_400KBPS;
param.byteCounterThreshold = 0;
param.autoSTOPGeneration = EUSCI_B_I2C_NO_AUTO_STOP;
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_Transmit 模式
);

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

EUSCI_B_I2C_clearInterrupt (EUSCI_B1_base、
EUSCI_B_I2C_Transmit INTERRUPT0 +
EUSCI_B_I2C_NAK_INTERRUPT
);

//启用主机接收中断
EUSCI_B_I2C_enableInterrupt (EUSCI_B1_BASE、
EUSCI_B_I2C_Transmit INTERRUPT0 +
EUSCI_B_I2C_NAK_INTERRUPT
);

_DELAY_CYCLES (1000); //传输之间的延迟
// TXByteCtr = 0; //加载 TX 字节计数器
NFC_LPD_LOW;
while (EUSCI_B_I2C_Sending = EUSCI_B_I2C_masterIsStopSent)
(EUSCI_B1_BASE));

EUSCI_B_I2C_masterSendStart (EUSCI_B1_BASE);
uint8_t i = 0;
对于(i = 0;i <= MAXByte;i++)
{
EUSCI_B_I2C_masterSendSingleByte (EUSCI_B1_BASE、TXData[i]);
while (EUSCI_B_I2C_isBusy (EUSCI_B1_BASE));
}

EUSCI_B_I2C_masterSendMultiByteStop (EUSCI_B1_BASE);
} 

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    当没有从器件 ACK 从器件地址时、会发生这种情况。

    我的晶振球告诉我 EEPROM 的从器件地址实际上是0x53。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    大家好、Clemens、
    我使用的 EERPOM 芯片是 ST25DV04。 根据数据表、要读取用户存储器部分、从器件地址应为0xA6、要读取系统寄存器、应使用地址0xAE。

    -Lovelesh
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我借用了克莱明的晶体球、它告诉我、由于 I2C 地址只有7位、它不能是0xA6。

    数据表将"I2C 地址"与"I2C 地址字节"混用(然后将其称为其他内容)。 R/W 位不是地址的一部分。

    数据表表表表51显示、在用户模式下、地址为0b1010011或0x53。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!

    您是否能够测试 Bruce 和 Clemens 对正确的从地址值的建议? 如果他们的帖子帮助您解决了问题、请继续并选择"已解决"。

    此致、

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

    我将再联系一次、看看这个问题是否仍然存在。 如果您仍有问题、请随时反馈意见以获得进一步支持。 如果没有、我将继续并关闭该线程。

    此致、

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

    由于我发现时钟脉冲未生成、因此问题未得到解决。 因此、我不得不使用 Bitbanging 来使 I2C 正常工作。

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

    TI 提供代码示例、帮助客户将器件外设成功集成到自己的项目中。 MSP430Ware 内部包含寄存器级代码示例、还有基于 driverlib 的示例、我认为这些示例可以直接帮助您了解如何正确初始化和使用 I2C 外设、因为您也在使用 driverlib。 driverlib I2C 代码示例的默认路径为:C:\ti\msp430ware_3_80_05_04\driverlib\examples\MSP430FR5xx_6xx\eusci_b_i2c

    将示例与您的项目交叉参考应该有助于您调试问题。

    此致、

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

    我已经听不到您的意见了一周,因此我假设您能够使用我引用的 I2C 代码示例解决您的问题。 如果情况并非如此,您可以单击“这无法解决我的问题”按钮,并使用更多信息回复此主题。 如果此主题锁定、请单击"提出相关问题"按钮、然后在新主题中描述您的问题的当前状态以及您可能需要帮助我们帮助解决您的问题的任何其他详细信息。

    此致、
    Matt