我想 使用 MSP430F5529从 I2C 从机模块的特定0x03寄存器中读取数据、但我不能使用带应答的16位数据、而只能获取8位数据开关 NACK。我的代码
#include
字符 Data_in=0;
unsigned char RXByteCtr;
unsigned char * PRxData;
volatile unsigned char RxBuffer[128];
void main (void)
{
volatile int i;
WDTCTL = WDTPW + WDTHOLD; //停止 WDT // P1.0输出
P3SEL |= 0x03; //将 I2C 引脚分配给 USCI_B0
UCB0CTL1 |= UCSWRST; //启用 SW 复位
UCB0CTL0 = UCMST + UCMODE_3 + UCSYNC; // I2C 主器件、同步模式
UCB0CTL1 |= UCSSEL_2; //使用 SMCLK
UCB0BR0 = 12; // fSCL = SMCLK/12 =~100kHz
UCB0BR1 = 0;
UCB0I2CSA = 0x40; //从地址为048h
UCB0CTL1 &=~UCSWRST; //清除 SW 复位,恢复运行
UCB0IE |= UCTXIE;
UCB0IE |= UCSTPIE + UCSTTIE + UCRXIE;
volatile int c=1;
_enable_interrupt ();
while (1)
{
RXByteCtr = 2;
UCB0CTL1 |= UCTR + UCTXSTT;
while (UCB0CTL1 & UCTXSTP);
UCB0CTL1 &=~UCTXSTP;
UCB0CTL1 &=~UCTR;
UCB0CTL1 |=UCTXSTT;
while (UCB0CTL1 & UCTXSTP);
UCB0CTL1 &=~UCTXSTP;
}
}
#pragma vector = USCI_B0_vector
_interrupt void USCI_B0_ISR (void)
{
switch (UCB0IV){
情况0x0A:
RXByteCtr --; //递减 RX 字节计数器
IF (RXByteCtr)
{
* PRxData++= UCB0RXBUF; //将 RX 数据移动到地址 PRxData
如果(RXByteCtr = 1) //只剩下一个字节?
UCB0CTL1 |= UCTXSTP; //生成 I2C 停止条件
}
其他
{
* PRxData = UCB0RXBUF; //将最终的 RX 数据移动到 PRxData
_BIC_SR_REGISTER_ON_EXIT (LPM0_BITS);//退出活动 CPU
}
中断;
情况0x0C:
UCB0TXBUF = 0x01;
中断;
默认值:
中断;}
}

