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.

[参考译文] MSP430G2955:MSP430主接收器 I2C 不工作!!

Guru**** 2589280 points
Other Parts Discussed in Thread: MSP430G2955

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/610805/msp430g2955-msp430-master-receiver-i2c-not-working

器件型号:MSP430G2955

大家好、

我目前 正在努力将 NFC NT3H1101/NT3H1201)与 MSP430连接起来,所以我想在我的代码中接收16字节的数据,当我逐步运行代码时,我的代码在   while (UCB0CTL1和 UCTXSTT)停止;            //确保发送了启动条件

(UCB0CTL1和 UCTXSTT);            //确保发送起始条件
我已经查看了 TI msp430g2x55_uscib0_i2c_04.c 给出的示例、但仍然无法理解为什么它们通过该指令建立状态、因为 MSP430负责发送停止预测
 while (UCB0CTL1 & UCTXSTP);            //确保发送了 STOP 条件

在下面、您可以看到我的代码

#include 


/*
* main.c
*//

***全局变量的声明*********
unsigned char * ptrRx;
unsigned char RXData[10];


int main (void){
WDTCTL = WDTPW + WDTHOLD;//停止 WDT 以防止复位
BCSCTL1 = CALBC1_16MHz; //将 DCO 设置为16MHz
DCOCTL = CALDCO_16MHz;

I2C_init (
);

while (1){
I2C_READ_INTERRUPT_INIT (RXData、1);

}


返回0;
}
//初始
化 void i2c_init (void){
//为 I2C 配置 P3.1 (SDA)和 P3.2 (SCL)
P3SEL =BIT1|BIT2;
P3SEL2 &=~(BIT1|BIT2);

//确保在配置前 USCI_B0被复位
UCB0CTL1 |=UCSWRST;
//slve 地址、带7位
UCB0CTL1 &=~UCSLA10;
//将 MSP430设置为主模式
UCB0CTL0 |=UCMST|UCMODE_3|UCSYNC;
//从 SMCLK 获取 USCI 时钟源
UCB0CTL1|=UCSSEL_3;
//从 SMCLK、SMCLK=16MHz 拉取时将波特率寄存器配置为100kHz
UCB0BR0 = 80;// UCBRx 的低字节
UCB0BR1 = 0;
//写入从机地址
UCB0I2CSA = 0xAA;
//清除软件复位,使 USCI 模块退出复位
UCB0CTL1 &=~UCSWRST;
//启用 Rx 中断
IE2 |=UCB0RXIE;

}

//接收函数

void i2c_read_interrupt_init (unsigned char * rxbuf、unsigned char length){
unsigned char i;
//接收器模式
UCB0CTL1 &=~UCTR;
UCB0CTL1 |= UCTXSTT; // I2C 启动条件
while (UCB0CTL1 & UCTXSTT); //确保发送起始条件
_bis_SR_register (LPM0 | GIE); //输入 LPM0,带中断

for (i=0;i 

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

    你好、tarik、

    示例代码演示了如何设置 USCIB0 I2C 主 模式并在两个 MSP430G2955器件之间进行通信、如果您要读取其他 i2c 器件、如 NT3H1101/NT3H1201、代码应参考数据表中的 I2C 协议、如下所示:

    此致

    Kc

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 KC、
    正如您所说的、我已经查看了数据表、但我对了解 R/W 位有一些问题、因此在 MSP430主接收器中、我必须清除 UCTR 以进行读取、设置 UCTR 以进行写入、在 NTAG NFC 中、它表示 R/W = 0 (写入)、 R/W=1 (读取)。所以根据 MSP430和 NTAG NFC、我不知道如何使用这个位、因为它们看起来是相反的。谢谢
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Tarik、

    置位 UCTR 时、R/W = 0 (写入)、清除 UCTR、R/W = 1 (读取)。

    此致
    Kc
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    void i2c_read_interrupt_mem (unsigned char * rxbuf、unsigned char length、unsigned char mEMA){
    unsigned char i;
    存储器地址的//发送器模式
    UCB0CTL1 |=UCTR;//发送器
    UCB0CTL1 |= UCTXSTT; // I2C 启动条件
    while (UCB0CTL1 & UCTXSTT); //确保发送起始条件
    //发送内存地址
    UCB0TXBUF=MEMA;
    while (((UCB0CTL1 & UCTXSTT)&&(!(IFG2 & UCB0TXIFG))); //确保发送起始条件并且正在读取内存地址
    
    //停止条件
    UCB0CTL1 |=UCTXSTP;
    //接收器模式
    UCB0CTL1 &=~UCTR;
    UCB0CTL1 |= UCTXSTT; // I2C 启动条件
    
    //接收器模式
    _bis_SR_register (LPM0 | GIE); //输入 LPM0,带中断
    
    for (i=0;i 
    

    尊敬的 KC:

    感谢您解决我的疑问。现在、我明白了。 但是、我已经根据 NTAG NFC 修改了我的代码、并且我的代码仍然在这一行代码处停止:

      while (UCB0CTL1 & UCTXSTT);       //确保发送起始条件

    在检查逻辑分析仪时、SCL 始终处于高电平、我在 SDA 上看到许多没有任何意义的随机数据

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

    在 USCI 生成起始条件并发送 Salve 地址后、一旦从器件确认地址、USCI 将清零 UCTXSTT 位。 您的代码在此处停止意味着 USCI 不会从从从器件获取确认。

    奇怪的是、SCL 始终处于高电平、如果它具有高电平、则需要检查硬件、因为有某种原因。 至少应正确发送从地址0xAA。

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

     您好 KC、

    我使用0x55地址运行代码、因为我认为自己必须改变代码、选择200kh 的时钟时出错、我得到了地址为0xAA 的一个应答。然而、我看到 SCL 频率为200kHz、没有任何问题。 但是、由于这一点、每当我在 MSP430上编译代码时、我都会看到 SCL 为高电平、这使得它变得奇怪。 我也运行了我对100kHz 时钟所做的最后一个更改、但仍然是同样的问题

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

    您是否有可在200K 以下工作的备份代码? 然后、您可以在进行传输时比较不同的代码或寄存器设置。 希望这能有所帮助。

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

     尊敬的 KC:
    备份代码完全相同。 我刚刚将这个代码行的值从80更改为160 (16MHz 以获得100kHz):UCB0BR0 =80;// UCBRx 的低字节
    因此、它对这两个器件都起了一次作用、因为没有显示正确的数据、SCL 始终处于高电平。

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

    很抱歉、您的回答较晚、您现在是否解决了问题?

    此致
    Kc
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 KC、
    不幸的是,我仍然在为它而挣扎
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    你好、tarik、

    您可以向我发送 SCH 和代码文件吗?

    此致
    Kc
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 KC、
    如果您愿意、我会将逻辑分析仪的屏幕截图发送给您