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/MSP430I2041:UCB0BCNT 在通过 I2C 发送第一个字节后不会递增

Guru**** 2587365 points


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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/845519/ccs-msp430i2041-ucb0bcnt-not-incremented-after-first-byte-transmitted-over-i2c

器件型号:MSP430I2041

工具/软件:Code Composer Studio

大家好、

从器件发送多字节 I2C 响应时、我尝试使用 UCB0BCNT 作为索引。 问题是 、UCB0BCNT 似乎只在发送第二个字节后递增。

用户指南说:"字节计数器在每个字节的第二个位位置递增、与以下 ACK 或 NACK 无关。 一个 START 或者 RESTART 条件将计数器值复位为零。 地址字节不会使计数器递增。 如果在数据的第一位期间发生仲裁丢失、字节计数器也会在第二个字节位置递增。"

我认为这意味着、如果我发送一个字节、字节计数器应该随着第二个位的发送而递增、这意味着当我发送下一个字节时、计数器应该已经递增。

以下是我的 MSP430代码:

void i2c_initialize (uint8_t 地址){
/**
*为 I2C 配置 I2C 引脚。
*
P1SEL0 |= BIT6 | BIT7;
P1SEL1 &=~(BIT6 | BIT4);

/**
*将 USCI_B0配置为 I2C 从模式。
*
UCB0CTLW0 |= UCSWRST; //软件复位被启用
UCB0CTLW0 |= UCMODE_3 | UCSYNC;// I2C 从机模式
UCB0I2COA0 =地址| UCOAEN;//地址+使能
UCB0CTL1 &=~UCSWRST; //软件复位被禁用
UCB0IE |= UCTXIE0; //启用中断
}

#if defined (__TI_Compiler_version__)|| defined (__IAR_systems_ICC__)
#pragma vector=USCI_B0_vector
__interrupt void USCIB0_ISR (void)
#Elif defined (__GNU__)
void COMPILE_attribute__(interrupt (interrupt (USCI_B0_ISR)#vector

)#USCIB0!错误!
#endif
{
switch (__evo_in_range (UCB0IV、USCI_I2C_UCBIT9IFG)){
USCI_NONE 案例:中断;
USCI_I2C_UCALIFG 案例:中断;
案例 USCI_I2C_UCNACKIFG:中断;
案例 USCI_I2C_UCSTTIFG:中断;
案例 USCI_I2C_UCSTPIFG:中断;
USCI_I2C_UCRXIFG3案例:中断;
USCI_I2C_UCTXIFG3案例:中断;
USCI_I2C_UCRXIFG2案例:中断;
USCI_I2C_UCTXIFG2案例:中断;
USCI_I2C_UCRXIFG1案例:中断;
USCI_I2C_UCTXIFG1案例:中断;
案例 USCI_I2C_UCRXIFG0:中断;
USCI_I2C_UCTXIFG0案例:
UCB0TXBUF = UCB0BCNT;
中断;
案例 USCI_I2C_UCBCNTIFG:break;
USCI_I2C_UCCLTOIFG 案例:中断;
USCI_I2C_UCBIT9IFG 案例:中断;
默认值:break;
}
}

从我的主器件中、如果我执行3次读取、每次读取5个字节、我会得到:

MSP430读取0、0、1、2、3。
MSP430读取0、0、1、2、3。
MSP430读取0、0、1、2、3。

有人能解释为什么字节计数器在第一个字节后不递增?

谢谢、

Jason

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

    我想我已经解决了这个问题、但是如果有人能够确认我的理论、那将会非常有帮助。

    我认为正在发生的情况是:

    USCI_I2C_UCTXIFG0触发、并且 I LOAD UCB0TXBUF = UCB0BCNT = 0。

    2、我的字节被载入到 I2C 移位寄存器中、USCI 开始发送位。

    3. USCI_I2C_UCTXIFG0再次触发、并且我加载 UCB0TXBUF = UCB0BCNT = 0。 它仍然为0、因为来自第一个字节的第二个位尚未发送。

    第一个字节完成发送、所以 USCI_I2C_UCTXIFG0第三次触发、这次 UCB0BCNT = 1、因为第一个字节已经发送。

    谢谢、

    Jason

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

    您好 Jason、

    是的、您的逻辑对我来说是正确的!  当您的第一个字节被传输到移位寄存器时、TXIFG0会再次触发以预加载下一个字节。  这将导致您传输两次。   

    我还想向您介绍我们提供的标准 I2C 从机软件示例: http://dev.ti.com/tirex/explore/node?node=AMw9w1udhtIrpm2pjwKOxA__IOGqZri__LATEST 

    谢谢、

    JD

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

    谢谢 JD! 我很感谢 I2C 从设备的链接。 我还没有看到这个例子。 供参考 、http://dev.ti.com/tirex/nodeContent?node=AHs0-dizYPTbBIT6mD-bNw__IOGqZri__LATEST 顶部的说明中似乎有错误