7903|14

19

帖子

1

TA的资源

一粒金砂(中级)

楼主
 

G2Launchpad 硬件IIC 调试问题啊!两天了,卡在循环里面 [复制链接]


我最近在G2553 Launchpad 用模拟IIC方法调试出 BH1750光照强度模块,现在想实现用硬件IIC查询法调试。为了便于清晰,我只上传了我的 iic初始化和 iic写函数。用CCSV5编译器进行调试的时候,程序总是卡在图中红线位置。不知道为啥啊?真心给跪了。都调试了两天,搞不懂原因,求大神们指点指点小弟!另外还有个问题是,如何收到从机发来的应答信号(ACK)?
/*
* I2C_Init(I2C_MODE i2c_mode, UCSSELx ucsselx)
* 初始化I2C
*
* 参数:
*         i2c_mode --I2C主从模式设置
*      |__        Slave
*      |__        Master
*      |
*         ucsselx --I2C时钟信号选择
*      |__        UCLKI
*      |__        ACLK
*      |__        SMCLK
* 输出:
*    无
*
*/
void I2C_Init(I2C_MODE i2c_mode, UCSSELx ucsselx)
{
        _disable_interrupts();

        P1SEL |= BIT6 + BIT7;                 // GPIO 配置为USCI_B0功能
        P1SEL2|= BIT6 + BIT7;                 // GPIO 配置为USCI_B0功能
        // Own address is a 7-bit address | Address slave with 7-bit address | Single master environment
        switch(i2c_mode)
        {
                case Slave:
                        UCB0CTL0 = UCMODE_3 + UCSYNC;                         //同步通信I2C从机状态
                        break;
                case Master:
                        UCB0CTL0 = UCMST + UCMODE_3 + UCSYNC;         //同步通信I2C主机状态
                        break;
        }
        switch(ucsselx)
        {
                case UCLKI:
                        UCB0CTL1 = UCSSEL_0 + UCSWRST;                         // Use UCLKI,USCI Software Reset
                        break;
                case ACLK:
                        UCB0CTL1 = UCSSEL_1 + UCSWRST;                         // Use ACLK,USCI Software Reset
                        break;
                case SMCLK:
                        UCB0CTL1 = UCSSEL_2 + UCSWRST;                         // Use SMCLK,USCI Software Reset
                        break;
        }
        UCB0BR0 =I2C_BAUDRATE_DIV ;        // 除了分频系数,实际波特率还与时钟有关
        UCB0BR1 = 0;                                 // 这一级别的分频一般不启用
        UCB0I2CSA = SLAVE_ADDR;         // I2C从机地址,可在宏定义中修改
        UCB0CTL1 &= ~UCSWRST;                 // 开启I2C

        _enable_interrupts();
}


void I2C_WriteData(uint8 data)
{
        I2C_Init(Master,SMCLK);
        i2c_delay_ms(1);
        while((UCB0CTL1 & UCTXSTP));         // 确保总线空闲
        UCB0CTL1 |= UCTR + UCTXSTT;     // I2C TX, start condition
        while((IFG2 & UCB0TXIFG)==0);         // UCB0TXIFG is set when UCB0TXBUF is empty.
        UCB0TXBUF = SlaveAddress;                // Load TX buffer
       while((IFG2 & UCB0TXIFG)==0);        // UCB0TXIFG is set when UCB0TXBUF is empty.
        UCB0TXBUF = data;
        while((IFG2 & UCB0TXIFG)==0);         // UCB0TXIFG is set when UCB0TXBUF is empty.
        UCB0CTL1 |= UCTXSTP;                  // I2C stop condition
        i2c_delay_ms(1);
}

最新回复

请问下  DeviceAdds是多少啊? UCB0I2CSA = I2CSlaveAddress;我从官网下载的这个,没有看明白,还请指导下,找了半天也没有看到这个器件地址  详情 回复 发表于 2017-10-16 21:13
 
点赞 关注

回复
举报

400

帖子

0

TA的资源

五彩晶圆(中级)

推荐
 
代码视乎没有错。你用示波器打下波形呢?另外,发你一份我写的I2C主程序做参考,可以直接用。如果还不正确,检查硬件。

I2C_TEST.rar

2.71 KB, 下载次数: 160

点评

大神,非常非常感谢你!你的回复给了我重新调试的勇气我能不能加下您的扣扣或者电话,当面像您请教啊。我的扣扣是34555162,希望您能指教啊~~期盼您的消息 我调试的模块是光照强度模块BH1750[attachimg]149  详情 回复 发表于 2014-5-6 22:55
 
 

回复

19

帖子

1

TA的资源

一粒金砂(中级)

沙发
 
红线框错了,是红线上面的一个while判断while((IFG2 & UCB0TXIFG)==0);        // UCB0TXIFG is set when UCB0TXBUF is empty.
 
 
 

回复

19

帖子

1

TA的资源

一粒金砂(中级)

板凳
 
求大神指点啊!!!!!
 
 
 

回复

19

帖子

1

TA的资源

一粒金砂(中级)

5
 
Triton.zhang 发表于 2014-5-6 13:53
代码视乎没有错。你用示波器打下波形呢?另外,发你一份我写的I2C主程序做参考,可以直接用。如果还不正确 ...

大神,非常非常感谢你!你的回复给了我重新调试的勇气我能不能加下您的扣扣或者电话,当面像您请教啊。我的扣扣是34555162,希望您能指教啊~~期盼您的消息
我调试的模块是光照强度模块BH1750 里面还有几个疑点:1.在写时序中G2553的硬件I2C如何判断是否收到从机来的应答信号ACK; 2.在读时序中,主机读完第一组数据时候如何给从机发送应答信号ACK?(PS:在主机读完第二组数据时候发送非应答信号NCK我知道如何去写UCB0CTL1 |= UCTXNACK)
 
 
 

回复

25

帖子

0

TA的资源

一粒金砂(中级)

6
 
我也卡在 while((IFG2 & UCB0TXIFG)==0);   这里了

点评

你好。。我现在在调试G2553的IIC。。调了两天整整。。就是卡在这句。。。请问您解决了吗  详情 回复 发表于 2014-11-1 21:11
 
 
 

回复

25

帖子

0

TA的资源

一粒金砂(中级)

7
 
为什么检测总线空闲是while((UCB0CTL1 & UCTXSTP));
不是while((UCB0CTL1 & UCBBUSY));

点评

加扣扣一起探讨下  详情 回复 发表于 2014-5-8 22:08
 
 
 

回复

19

帖子

1

TA的资源

一粒金砂(中级)

8
 
墨染卿卿一 发表于 2014-5-8 17:01
为什么检测总线空闲是while((UCB0CTL1 & UCTXSTP));
不是while((UCB0CTL1 & UCBBUSY));

加扣扣一起探讨下
 
 
 

回复

846

帖子

0

TA的资源

纯净的硅(中级)

9
 
建议楼主搞个逻辑分析仪测试分析一下,我没用过你的查询方式,以前用的是中断方式。开始也遇到了一些问题,分析测试后调出来了,不过程序没留。
建议楼主多分析一下MSP430G2553的用户指南的电子文档,其中457页(17.3.4.2 主控模式)开始详细描述了主控模式的发送和接收过程,并结合了操作时序图。需要一句一句读一读,多几遍就搞定了。

点评

谢谢您,说得很中肯,这个问题我已经解决啦 发个结贴的说明~~ 确实,看MSP430 2系列的datasheet,IIC那一章硬件操作的图画得很明白。 还有就是为了防止卡死在循环里面我用了有时间判断,一步一步调试出来了  详情 回复 发表于 2014-5-17 12:01
 
 
 

回复

19

帖子

1

TA的资源

一粒金砂(中级)

10
 
lkl0305 发表于 2014-5-16 21:05
建议楼主搞个逻辑分析仪测试分析一下,我没用过你的查询方式,以前用的是中断方式。开始也遇到了一些问题, ...

谢谢您,说得很中肯,这个问题我已经解决啦     发个结贴的说明~~

确实,看MSP430  2系列的datasheet,IIC那一章硬件操作的图画得很明白。  还有就是为了防止卡死在循环里面我用了有时间判断,一步一步调试出来了,解决问题了才发现并没有刚开始想得那么难
 
 
 

回复

7

帖子

1

TA的资源

一粒金砂(初级)

11
 
墨染卿卿一 发表于 2014-5-8 16:58
我也卡在 while((IFG2 & UCB0TXIFG)==0);   这里了

你好。。我现在在调试G2553的IIC。。调了两天整整。。就是卡在这句。。。请问您解决了吗

点评

void IIC_WriteDevice(uchar DeviceAdds,uchar Adds,uchar Data) { UCB0CTL1 |= UCSWRST; UCB0I2CSA = DeviceAdds; UCB0CTL1 &= ~UCSWRST; UCB0CTL1 |= UCTR + UCTXSTT; UCB0TXBUF = adds; whil  详情 回复 发表于 2014-11-4 16:22
 
 
 

回复

25

帖子

0

TA的资源

一粒金砂(中级)

12
 
horizon_z40 发表于 2014-11-1 21:11
你好。。我现在在调试G2553的IIC。。调了两天整整。。就是卡在这句。。。请问您解决了吗

void IIC_WriteDevice(uchar DeviceAdds,uchar Adds,uchar Data)
{
  UCB0CTL1 |= UCSWRST;
  UCB0I2CSA = DeviceAdds;
  UCB0CTL1 &= ~UCSWRST;
   UCB0CTL1 |= UCTR + UCTXSTT;
  UCB0TXBUF = adds;
  while((IFG2&UCB0TXIFG)==0);
  UCB0TXBUF = data;
  while((IFG2&UCB0TXIFG)==0);
  UCB0CTL1 |= UCTXSTP;
  Delay(200);
}
void Initial_IIC(void)
{
  P1SEL |= BIT6 + BIT7;
  P1SEL2|= BIT6 + BIT7;
  UCB0CTL1 |= UCSWRST;
  UCB0CTL0 = UCMST + UCMODE_3 + UCSYNC;
  UCB0CTL1 = UCSSEL_2 + UCSWRST;
  UCB0BR0 = 10;
  UCB0BR1 = 0;
  UCB0CTL1 &= ~UCSWRST;
}
你试试这个程序。

点评

请问下 DeviceAdds是多少啊? UCB0I2CSA = I2CSlaveAddress;我从官网下载的这个,没有看明白,还请指导下,找了半天也没有看到这个器件地址  详情 回复 发表于 2017-10-16 21:13
 
 
 

回复

13

帖子

0

TA的资源

一粒金砂(初级)

13
 
我也卡在这,但愿能解决
 
 
 

回复

2

帖子

0

TA的资源

一粒金砂(初级)

14
 
我也卡在这里 LZ解决了吗
 
 
 

回复

18

帖子

0

TA的资源

一粒金砂(中级)

15
 
墨染卿卿一 发表于 2014-11-4 16:22
void IIC_WriteDevice(uchar DeviceAdds,uchar Adds,uchar Data)
{
  UCB0CTL1 |= UCSWRST;
  UCB0I2C ...

请问下  DeviceAdds是多少啊?
UCB0I2CSA = I2CSlaveAddress;我从官网下载的这个,没有看明白,还请指导下,找了半天也没有看到这个器件地址
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/6 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表