工具/软件: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