我想学学430单片机自带的IIC模块使用,现在编了段小程序,可是运行不正确,程序如下,问题在最后面。
//初始化IIC模块
UCB0CTL1 |= UCSWRST;
UCB0CTL0 |=UCMST+UCMODE1+UCMODE0+UCSYNC; // I2C Master, synchronous mode
UCB0CTL1 = UCMODE1+UCMODE0+UCSWRST; // Use SMCLK, keep software reset
P3SEL |=0x06; //p3.1为UCB0SDA,P3.2为UCB0SCL
UCB0CTL1 = UCSSEL_3+UCSWRST; // Use SMCLK, keep SW reset
UCB0BR0 =10; // fSCL = SMCLK/12 = ~100kHz
UCB0BR1 = 0;
UCB0CTL1 &= ~UCSWRST; // Clear software reset, resume operation
//写函数
UCB0CTL0 |=UCMST+UCMODE_3+UCSYNC; // I2C Master, synchronous mode
//UCB0CTL1 = UCMODE1+UCMODE0+UCSWRST; // Use SMCLK, keep software reset
UCB0I2CSA = 0x3a; //这个地址是真实地址后面加读/写位组成
UCB0CTL0 &=~UCSLA10; //从机地址为7位
UCB0CTL1 |= UCTR;//transmitter mode 发送模式
UCB0CTL1 |= UCTXSTT; //start condition,
while((IFG2 & UCB0TXIFG) != UCB0TXIFG);//检测UCB0TXBUF是否为空,为空则UCB0TXIFG为1.
for(i=0;i<1;i++)
{
UCB0TXBUF = 0x0d;//IIC设备中寄存器的地址
while((UCB0CTL1 & UCTXSTT) == UCTXSTT);//检测从机ACK信号,有ACK信号,则UCTXSTT自动清零//以上顺序不能改变
while((IFG2 & UCB0TXIFG) != UCB0TXIFG);//检测UCB0TXBUF是否为空,
}
UCB0CTL1 |= UCTXSTP;//发送STOP信号
我的问题是 :
1. UCB0CTL1 |= UCTXSTT; 也就是发送START后示波器上显示的IIC从设备的地址信息不对;
2. UCB0TXBUF = 0x0d,运行后,示波器没反应更谈不上有ACK信号,可是却通过了while((UCB0CTL1 & UCTXSTT) == UCTXSTT判断是否有确认信号的这句话;
3. 程序停在了倒数第二句话while((IFG2 & UCB0TXIFG) != UCB0TXIFG);//检测UCB0TXBUF是否为空,既然已经把数据0x0d送到发送缓冲中去,就应该有输出,而且UCB0TXBUF为空才对啊?
向大家请教了!!
此帖出自
小平头技术问答
一周热门 更多>