有关msp430g2553 io口模拟i2c的问题

[复制链接]
3484|16
 楼主| hjl240 发表于 2014-10-25 14:23 | 显示全部楼层 |阅读模式
我用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工作不正常):






本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
dirtwillfly 发表于 2014-10-25 16:45 | 显示全部楼层
msp430g2553的串口部分的代码,和5529是一样的吗?
dirtwillfly 发表于 2014-10-25 16:50 | 显示全部楼层
本帖最后由 dirtwillfly 于 2014-10-25 16:51 编辑

从你提供的始终方面的代码,可以看出5529使用的时钟频率和2553是不一样的。
因为时钟不一样,很有可能会造成用io模拟出来的通讯波特率无**常使用
 楼主| hjl240 发表于 2014-10-25 17:59 | 显示全部楼层
dirtwillfly 发表于 2014-10-25 16:45
msp430g2553的串口部分的代码,和5529是一样的吗?

这是IIC的程序,不是串口程序,两者的差别就是时钟频率不一样,其他时序都一样
 楼主| hjl240 发表于 2014-10-25 18:01 | 显示全部楼层
dirtwillfly 发表于 2014-10-25 16:50
从你提供的始终方面的代码,可以看出5529使用的时钟频率和2553是不一样的。
因为时钟不一样,很有可能会造 ...

IIC的时序延时都是用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. }

dirtwillfly 发表于 2014-10-25 18:10 | 显示全部楼层
hjl240 发表于 2014-10-25 18:01
IIC的时序延时都是用delayus来控制的,比如

因为时钟不一样,所以daley的时间间隔全都变了。
建议在移植前,先把5529的时钟调整成和2553一样。如果这样调整后能正常通讯,移到2553就没问题了。
dirtwillfly 发表于 2014-10-25 18:12 | 显示全部楼层
虽然是用普通IO模拟的IIC通讯,但也是要满足IIC通讯的时序要求的。
时序,最重要的就是时间间隔。时间间隔变了,时序就变了,通讯也就失败了。
 楼主| hjl240 发表于 2014-10-25 20:40 | 显示全部楼层
dirtwillfly 发表于 2014-10-25 18:10
因为时钟不一样,所以daley的时间间隔全都变了。
建议在移植前,先把5529的时钟调整成和2553一样。如果这 ...

我理解版主的意思,但是,这个两个程序的delayus函数是根据各自的时钟频率计算出来的,比如,对于g2553下的程序:
  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))
这个delayus是在时钟频率为16M时计算出来的,

而对于f5529的程序:
  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))
这个delayus函数是在时钟频率为4M时计算出来的,

两个的延时函数都是比较精确地,也就是版主所说的时间间隔并没有变化。我觉得问题不在延时,,难道是g2553本身IO口模拟IIC有需要特别注意的地方?跟普通单片机模拟IO口模拟IIC不一样?


dirtwillfly 发表于 2014-10-25 20:51 | 显示全部楼层
hjl240 发表于 2014-10-25 20:40
我理解版主的意思,但是,这个两个程序的delayus函数是根据各自的时钟频率计算出来的,比如,对于g2553下 ...

你在两个mcu上都是用的哪两个IO?
youluo235 发表于 2014-10-26 21:31 | 显示全部楼层
把时钟搞慢点再试如果确定其他任何东西都一样的话。另外用示波器看下波形。
smilingangel 发表于 2014-10-27 13:01 | 显示全部楼层
这个很明显的是时钟源的问题的吧。
dirtwillfly 发表于 2014-10-28 21:17 | 显示全部楼层
楼主问题解决了吗?
看过通讯时的波形了吗
shqhope 发表于 2015-5-19 16:25 | 显示全部楼层
309030106 发表于 2015-5-19 20:19 | 显示全部楼层
首先应该调时钟的,时序也得靠时钟的
comeon201208 发表于 2015-5-19 22:15 | 显示全部楼层
i2C总线的是很重要的通讯方式的。
598330983 发表于 2015-5-31 08:25 来自手机 | 显示全部楼层
不是有iic吗?还用这模拟,浪费啊个?
gaoyang9992006 发表于 2015-5-31 20:55 | 显示全部楼层
#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))这些延时函数还是很靠谱的,我也常用。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

16

主题

56

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部