关于I2C模块的问题

2019-03-24 08:26发布

我试图用msp430G2 launchpad与 DS3231模块进行I2c的时候出现以下问题:
当我执行初始化程序后,有时我执行完 UCB0CTL1 &= ~UCSWRST后,UCBBUSY就一直是1,后来我用电表测量,又做了机组对照,发现以下问题:
1. 与硬件IIC模块有关的程序,当下载进MCU后,SDA总线就一直处于低电平。
2.经过对照,应该是DS3231拉低了总线,但是这应该不是DS3231的问题,因为其他模块也会出现类似的问题。
3.有些代码开始无法运行,但是重新上电就可以了。但是还有一部分代码不行。但是我认为应该不是代码的问题,因为总线拉低是出现在某些代码发挥作用之前。
比如:
#include <msp430.h>
#define DS3231ADDR 0X68
unsigned int TEMP[9];
unsigned int i = 0;
void I2CINIT();
void DS3231RX(unsigned char ADDR);
void DS3231TX(unsigned char ADDR, unsigned DATA);
void main()
{
    WDTCTL = WDTPW | WDTHOLD; // Stop watchdog timer
    I2CINIT();
    DS3231TX(0X03, 0X02);
    DS3231RX(0X03);
    DS3231RX(0X00);


   I2CINIT();
//尤其注意初始化这句,如果加上这句,那么单片机上电后,sda就会被立刻拉低。而去掉这句,重新上电以后就可以运行。
//不止这一句会产生这样的影响,比如曾经我想套用一个例程,我只是把停止位换了下位置(方便其他函数调用),调用后补上停止位,也发生了上述情况

    DS3231RX(0X01);
    P1DIR |= BIT0;
    P1OUT |= BIT0;
    while(1);
}

void I2CINIT()
{
  P1SEL |= BIT6 + BIT7;
  P1SEL2|= BIT6 + BIT7;
UCB0CTL1 |=  UCSWRST;
UCB0CTL1 = UCSSEL_2 + UCSWRST;
UCB0CTL0 = UCMST + UCMODE_3 + UCSYNC;
UCB0BR0 = 14;
UCB0BR1 = 0;
UCB0I2CSA = 0X68;
UCB0CTL1 &= ~UCSWRST;
}
void DS3231TX(unsigned char ADDR, unsigned DATA)
{
while ((UCB0STAT & UCBBUSY)||(UCB0CTL1&UCTXSTP));
UCB0CTL1 |= UCTXSTT + UCTR;
while(!(IFG2 & UCB0TXIFG));
UCB0TXBUF = ADDR;
while(!(IFG2 & UCB0TXIFG));
UCB0TXBUF = DATA;
while(!(IFG2 & UCB0TXIFG));
UCB0CTL1 |= UCTXSTP;
}
void DS3231RX(unsigned char ADDR)
{
while ((UCB0STAT & UCBBUSY)||(UCB0CTL1&UCTXSTP));
UCB0CTL1 |= UCTXSTT + UCTR;
while(!(IFG2 & UCB0TXIFG));
UCB0TXBUF = ADDR;
while(!(IFG2 & UCB0TXIFG));
UCB0CTL1 &= ~UCTR;
UCB0CTL1 |= UCTXSTT;
while(!(IFG2 & UCB0RXIFG));
TEMP[i] = UCB0RXBUF;
i++;
while(!(IFG2 & UCB0RXIFG));
TEMP[i] = UCB0RXBUF;
i++;
while(!(IFG2 & UCB0RXIFG));
TEMP[i] = UCB0RXBUF;
i++;
while(!(IFG2 & UCB0RXIFG));
UCB0CTL1 |= UCTXSTP;
}

此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
4条回答
qwerghf
1楼-- · 2019-03-24 16:14
< 首先你要配置时钟源,看你的时钟源没配置,引脚配置也是有问题的,外部电阻上拉了,建议用模拟I2C测试一下,对于430常用模拟I2C来操作
CoolDoWN
2楼-- · 2019-03-24 19:35
 精彩回答 2  元偷偷看……
CoolDoWN
3楼-- · 2019-03-24 21:54
qwerghf 发表于 2017-7-26 07:57
首先你要配置时钟源,看你的时钟源没配置,引脚配置也是有问题的,外部电阻上拉了,建议用模拟I2C测试一下 ...

还是问下,如果我用模拟I2C驱动某一个设备,可以成功。但是在调用那段函数驱动另外一个设备时就出现无应答的问题,这种情况出现在哪里了呢?
qwerghf
4楼-- · 2019-03-25 02:54
CoolDoWN 发表于 2017-7-26 08:55
还是问下,如果我用模拟I2C驱动某一个设备,可以成功。但是在调用那段函数驱动另外一个设备时就出现无应 ...

总线被占用,设备有问题

一周热门 更多>

相关问题

    相关文章