我想学学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为空才对啊?
向大家请教了!!
此帖出自
小平头技术问答
还有,实在是不好意思,我没有太看懂您给我粘贴的程序哪里是发送从地址的语句,麻烦您给我简单解释一下行吗?急死了。
我觉得我表述的不对,现在更正一下:
我所说的IIC从设备的地址是address;我所说的从地址是IIC从设备内部的寄存器的地址sub-address
我先把IIC从设备地址给了UCB0I2CSA = 0x1d;
在我想配置IIC从设备内部寄存器的时候就把寄存器地址给了缓冲区UCB0TXBUF = CTRL_REG3;(#define CTRL_REG3 0x23)
拜谢了!
[ 本帖最后由 wqy 于 2013-3-21 22:04 编辑 ]
一周热门 更多>