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.

[参考译文] MSP430FR5969:I2C 配置

Guru**** 2535750 points


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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1081199/msp430fr5969-i2c-configuration

部件号:MSP430FR5969

您好,

我正在尝试为 P1.6和 P1.7配置 I2C

我想发送一个命令0xFD,后跟地址0x44以写入从属设备。

我有两台设备,并检查了示例程序  

P1SEL1 |= 0xC0;/* P1.7和 P1.6的 GPIO 引脚配置*/
/* I2C 初始化*/

UCB0CTLW0 = 0x0FD1;/*主和从,主模式 I2C,smclk 设置,从机架,发射器,自动启动和停止*/的7位地址
UCB0BRW = 0x001F;/*时钟 PRESCAAR 值设为32 */
UCB0CTLW1 |= UCAST_2;//自动停止已生成
UCB0TBCNT = 0x0005;//要接收的字节数

UCB0CTLW0 = 0x0FD0;/*软件重置已禁用*/
UCB0I2CSA = 0x0044;

/*数据传输配置*/

同时(UCB0CTL1和 UCTXSTP);//确保发送停止条件
UCB0CTL1 |= UCTXSTT;

While (!(UCB0IFG 和 UCTXIFG0)){}
UCB0CTL1 ^= UCTXSTT;
UCB0TXBUF = 0xFD;
__delay_cycles (800);
UCB0CTL1 |= UCTXSTP;
// UCB0CTL1 ^= UCTXSTT;
UCB0TXBUF = 0xFD;
//__delay_cycles (1000);
UCB0CTL1 |= UCTXSTP;

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

    您真的不会说出问题所在;

    这一行:“UCB0CTL1 ^= UCTXSTT;”只是在问问题。 发送地址后,STT 位将自动清除。 在最好的情况下,这种做法毫无作用。 在最坏的情况下,它在位清除后执行,从而导致重复启动。

    您可以选择自动停止生成(计数较高),然后设置停止位。 使用自动停止或不使用。

    从范围跟踪中,地址和数据(0xFD)似乎已发送。 然后它会等待(延迟循环)直到您请求停止条件。 停止将暂停事务,您必须重新开始以获取更多数据。 我建议您查看 TI 提供的代码示例。

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

    大卫,你好。

    这是我的更新代码,我的问题是在传输 STOP 命令后,I2C 通信将继续传输。  

    P1SEL1 |= 0xC0;/* P1.7和 P1.6的 GPIO 引脚配置*/
    /* I2C 初始化*/

    UCB0CTLW0 = 0x0FD1;/*主和从,主模式 I2C,smclk 设置,从机架,发射器,自动启动和停止*/的7位地址
    UCB0BRW = 0x001F;/*时钟 PRESCAAR 值设为32 */
    UCB0CTLW1 |= UCSWACK;//自动停止已生成
    UCB0TBCNT = 0x0005;//要接收的字节数

    UCB0CTLW0 = 0x0FD0;/*软件重置已禁用*/
    /* UCB0CTLW1未使用,ACK 由 USCI 模块*/完成
    UCB0I2CSA = 0x0044;

    同时(UCB0CTL1和 UCTXSTP);//确保发送停止条件
    UCB0CTL1 |= UCTXSTT;

    While (!(UCB0IFG 和 UCTXIFG0)){}
    UCB0TXBUF = 0xFD;
    __delay_cycles (400);//800
    UCB0CTL1 |= UCTXSTP;
    UCB0TXBUF = 0xFA;

    只有通过向 TX 缓冲区发送额外数据,我才能获得所需的输出  

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

    你(们)好  

    I2C 传输后您会怎么做? 发送停止信号后,I2C 将停止运行,它不需要另一个字节来停止功能。