5445|15

324

帖子

0

TA的资源

一粒金砂(高级)

楼主
 

有关msp430g2553 io口模拟i2c的问题 [复制链接]

我用msp430f5529控制ds3231时钟芯片,采用IO口模拟I2C,程序正确,时间可以正常工作,

当我用msp430g2553控制ds3231时,也是用IO口模拟I2C,程序基本一样,与5529的程序的唯一区别是时钟不一样,但是G2553却不行,显示为00;请问是什么原因?
5529的时钟程序如下:
  1. #define CPU_F          ((double)4000000)
  2. #define delay_us(x)      __delay_cycles((long)(CPU_F*(double)x/1000000.0))
  3. #define delayus(x)      __delay_cycles((long)(CPU_F*(double)x/1000000.0))
  4. #define delay_ms(x)         __delay_cycles((long)(CPU_F*(double)x/1000.0))
  5. #define DelayMS(x)         __delay_cycles((long)(CPU_F*(double)x/1000.0))
  6. void clk_init()
  7. {
  8.           P5SEL |= BIT2+BIT3;                       // Port select XT2

  9.           UCSCTL6 &= ~XT2OFF;                       // Enable XT2
  10.           UCSCTL3 |= SELREF_2;                      // FLLref = REFO
  11.                                                     // Since LFXT1 is not used,
  12.                                                     // sourcing FLL with LFXT1 can cause
  13.                                                     // XT1OFFG flag to set
  14.           UCSCTL4 |= SELA_2;                        // ACLK=REFO,SMCLK=DCO,MCLK=DCO

  15.           // Loop until XT1,XT2 & DCO stabilizes - in this case loop until XT2 settles
  16.           do
  17.           {
  18.             UCSCTL7 &= ~(XT2OFFG + XT1LFOFFG + DCOFFG);
  19.                                                     // Clear XT2,XT1,DCO fault flags
  20.             SFRIFG1 &= ~OFIFG;                      // Clear fault flags
  21.           }while (SFRIFG1&OFIFG);                   // Test oscillator fault flag

  22.           UCSCTL6 &= ~XT2DRIVE0;                    // Decrease XT2 Drive according to
  23.                                                     // expected frequency
  24.           UCSCTL4 |= SELS_5 + SELM_5;               // SMCLK=MCLK=XT2
  25.           UCSCTL5 |= DIVS_2;
  26. }
复制代码
2553的时钟程序如下:
  1. #define CPU_F          ((double)16000000)
  2. #define delay_us(x)      __delay_cycles((long)(CPU_F*(double)x/1000000.0))
  3. #define delayus(x)      __delay_cycles((long)(CPU_F*(double)x/1000000.0))
  4. #define delay_ms(x)         __delay_cycles((long)(CPU_F*(double)x/1000.0))
  5. #define DelayMS(x)         __delay_cycles((long)(CPU_F*(double)x/1000.0))
复制代码



  1. BCSCTL1 = CALBC1_16MHZ;                // Set DCO to 1, 8, 12 or 16MHz
  2.         DCOCTL = CALDCO_16MHZ;
复制代码


5529现象如下(工作正常):


2553现象如下(一直显示00,i2c工作不正常):


最新回复

楼主解决了没???我现在差不多的问题,用的也是模拟I2C,现在出不来东西。怀疑是I2C的软件编程有问题,楼主能发一下I2C的程序么  详情 回复 发表于 2016-4-25 23:36
 
点赞 关注
个人签名

欢迎关注:JL单片机


回复
举报

324

帖子

0

TA的资源

一粒金砂(高级)

沙发
 
两个程序的唯一区别就是内部时钟配置不一样,其他完全一样,,很奇怪,不知道哪里出了问题
 
个人签名

欢迎关注:JL单片机

 

回复

1193

帖子

0

TA的资源

纯净的硅(高级)

板凳
 
去弄个逻辑分析仪,几十块钱的事情,读一下波形看看问题出在哪。
通信这东西读线上信号最准确了,就这么看代码很难看出到底是哪有问题的。
或者如果有示波器的话直接用示波器看当然也没问题。

点评

能推荐一款吗,以前没用过,想买一款  详情 回复 发表于 2014-10-28 09:38
 
 
 

回复

1976

帖子

1

TA的资源

五彩晶圆(初级)

4
 
你有把两者的主时钟频率调到一样吗?你可以把2553上的时钟调节成1MHz试试看有没有数据

点评

我觉得不是时钟的问题,时钟的变化只对延时函数delayus起作用,而宏定义 [*]#define CPU_F ((double)4000000) 已经定义好,延时也是精确地  详情 回复 发表于 2014-10-25 18:09
 
 
 

回复

951

帖子

1

TA的资源

纯净的硅(中级)

5
 
移植程序需要把时钟频率调到一致呢!不然你的读、写可能因为延时或者执行速度的不同而导致读不出来正确的数据呢!详细你可以参看ds3231的时序图。

点评

时序中的延时都是根据时钟频率设定的,虽然两个程序都是用delayus函数来延时,但是两个delayus延时函数实质是不一样的, g2553的delayus函数是16M下计算出来的, 而f5529的delayus函数是4M下计算出来的, [*]#d  详情 回复 发表于 2014-10-25 18:18
其实时钟设置都是为 IIC时序的延时起作用,比如如下代码:g2553和f5529的这部分程序是一摸一样的,其中的delayus延时都是宏定义时的,延时都比较精确,时钟设置好之后,delayus延时函数就相应改变,延时还是精确地  详情 回复 发表于 2014-10-25 18:05
 
个人签名人有的时候真是奇怪,选择了会后悔,放弃了会遗憾,完美只能是一种理想,不是一种存在。
 
 

回复

324

帖子

0

TA的资源

一粒金砂(高级)

6
 
huixianfxt 发表于 2014-10-25 10:17
移植程序需要把时钟频率调到一致呢!不然你的读、写可能因为延时或者执行速度的不同而导致读不出来正确的数 ...

其实时钟设置都是为  IIC时序的延时起作用,比如如下代码:g2553和f5529的这部分程序是一摸一样的,其中的delayus延时都是宏定义时的,延时都比较精确,时钟设置好之后,delayus延时函数就相应改变,延时还是精确地,所以我觉得时钟改变没有太大影响


  1. void Start_I2C()
  2. {
  3.         SDA_OUT;
  4.     SDA_H;                  //发送起始条件的数据信号
  5.     delayus(1);
  6.     SCL_H;
  7.     delayus(5);             //起始条件建立时间大于4.7us,延时
  8.     SDA_L;                  //发送起始信号
  9.     delayus(5);             // 起始条件锁定时间大于4μs
  10.     SCL_L;                  //钳住I2C总线,准备发送或接收数据
  11.     delayus(2);
  12. }

  13. void Stop_I2C()
  14. {
  15.         SDA_OUT;
  16.     SDA_L;                  //发送结束条件的数据信号
  17.     delayus(1);             //发送结束条件的时钟信号
  18.     SCL_H;                  //结束条件建立时间大于4us
  19.     delayus(5);
  20.     SDA_H;                  //发送I2C总线结束信号
  21.     delayus(4);
  22. }
复制代码


 
个人签名

欢迎关注:JL单片机

 
 

回复

324

帖子

0

TA的资源

一粒金砂(高级)

7
 
bobde163 发表于 2014-10-25 00:56
你有把两者的主时钟频率调到一样吗?你可以把2553上的时钟调节成1MHz试试看有没有数据

我觉得不是时钟的问题,时钟的变化只对延时函数delayus起作用,而宏定义
  • #define CPU_F          ((double)4000000)   已经定义好,延时也是精确地

 
个人签名

欢迎关注:JL单片机

 
 

回复

324

帖子

0

TA的资源

一粒金砂(高级)

8
 
huixianfxt 发表于 2014-10-25 10:17
移植程序需要把时钟频率调到一致呢!不然你的读、写可能因为延时或者执行速度的不同而导致读不出来正确的数 ...

时序中的延时都是根据时钟频率设定的,虽然两个程序都是用delayus函数来延时,但是两个delayus延时函数实质是不一样的,
g2553的delayus函数是16M下计算出来的,
  1. #define CPU_F          ((double)16000000)
  2. #define delay_us(x)      __delay_cycles((long)(CPU_F*(double)x/1000000.0))
  3. #define delayus(x)      __delay_cycles((long)(CPU_F*(double)x/1000000.0))
  4. #define delay_ms(x)         __delay_cycles((long)(CPU_F*(double)x/1000.0))
  5. #define DelayMS(x)         __delay_cycles((long)(CPU_F*(double)x/1000.0))
复制代码
而f5529的delayus函数是4M下计算出来的,
  • #define CPU_F          ((double)4000000)
  • #define delay_us(x)      __delay_cycles((long)(CPU_F*(double)x/1000000.0))
  • #define delayus(x)      __delay_cycles((long)(CPU_F*(double)x/1000000.0))
  • #define delay_ms(x)         __delay_cycles((long)(CPU_F*(double)x/1000.0))
  • #define DelayMS(x)         __delay_cycles((long)(CPU_F*(double)x/1000.0))



所以时钟不一样对时序几乎不影响,,,


部分时序如下:
  1. void Start_I2C()
  2. {
  3.         SDA_OUT;
  4.     SDA_H;                  //发送起始条件的数据信号
  5.     delayus(1);
  6.     SCL_H;
  7.     delayus(5);             //起始条件建立时间大于4.7us,延时
  8.     SDA_L;                  //发送起始信号
  9.     delayus(5);             // 起始条件锁定时间大于4μs
  10.     SCL_L;                  //钳住I2C总线,准备发送或接收数据
  11.     delayus(2);
  12. }

  13. void Stop_I2C()
  14. {
  15.         SDA_OUT;
  16.     SDA_L;                  //发送结束条件的数据信号
  17.     delayus(1);             //发送结束条件的时钟信号
  18.     SCL_H;                  //结束条件建立时间大于4us
  19.     delayus(5);
  20.     SDA_H;                  //发送I2C总线结束信号
  21.     delayus(4);
  22. }
复制代码




 
个人签名

欢迎关注:JL单片机

 
 

回复

300

帖子

0

TA的资源

一粒金砂(高级)

9
 
换一个io口,可能是io口坏了

点评

换过了,还是不管用,,应该不是IO口坏掉的原因 、、、、、、、、、、、、、  详情 回复 发表于 2014-10-25 19:07
 
个人签名世间万物皆系于一键之上~
 
 

回复

324

帖子

0

TA的资源

一粒金砂(高级)

10
 
07611128 发表于 2014-10-25 18:41
换一个io口,可能是io口坏了

换过了,还是不管用,,应该不是IO口坏掉的原因                           、、、、、、、、、、、、、
 
个人签名

欢迎关注:JL单片机

 
 

回复

1193

帖子

0

TA的资源

纯净的硅(高级)

11
 
还是上逻辑分析仪/示波器吧,一抓图啥都清楚了。
 
 
 

回复

1531

帖子

49

TA的资源

五彩晶圆(中级)

12
 
学习下也遇到过类似的问题,还有可能是某些寄存器的问题
 
 
 

回复

447

帖子

0

TA的资源

纯净的硅(中级)

13
 
qiushenghua 发表于 2014-10-24 23:12
去弄个逻辑分析仪,几十块钱的事情,读一下波形看看问题出在哪。
通信这东西读线上信号最准确了,就这么看 ...

能推荐一款吗,以前没用过,想买一款

点评

当然是最便宜的24M的saleae逻辑分析仪,淘宝上也就二三十块钱。一搜一大把的。  详情 回复 发表于 2014-10-28 09:53
 
 
 

回复

1193

帖子

0

TA的资源

纯净的硅(高级)

14
 
zzbaizhi 发表于 2014-10-28 09:38
能推荐一款吗,以前没用过,想买一款

当然是最便宜的24M的saleae逻辑分析仪,淘宝上也就二三十块钱。一搜一大把的。
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

15
 
楼主能不能把msp430f5529读写DS3231的代码发我一份?谢谢啦
 
 
 

回复

23

帖子

0

TA的资源

一粒金砂(中级)

16
 
楼主解决了没???我现在差不多的问题,用的也是模拟I2C,现在出不来东西。怀疑是I2C的软件编程有问题,楼主能发一下I2C的程序么
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

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

 
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
快速回复 返回顶部 返回列表