有关msp430g2553 io口模拟i2c的问题

2019-07-27 18:42发布

我用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现象如下(工作正常):
IMG_20141024_214927.jpg

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





友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
16条回答
dirtwillfly
1楼-- · 2019-07-27 22:26
msp430g2553的串口部分的代码,和5529是一样的吗?
dirtwillfly
2楼-- · 2019-07-28 00:53
 精彩回答 2  元偷偷看……
hjl240
3楼-- · 2019-07-28 03:39
dirtwillfly 发表于 2014-10-25 16:45
msp430g2553的串口部分的代码,和5529是一样的吗?

这是IIC的程序,不是串口程序,两者的差别就是时钟频率不一样,其他时序都一样
hjl240
4楼-- · 2019-07-28 06:28
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
5楼-- · 2019-07-28 10:44
hjl240 发表于 2014-10-25 18:01
IIC的时序延时都是用delayus来控制的,比如

因为时钟不一样,所以daley的时间间隔全都变了。
建议在移植前,先把5529的时钟调整成和2553一样。如果这样调整后能正常通讯,移到2553就没问题了。
dirtwillfly
6楼-- · 2019-07-28 13:42
虽然是用普通IO模拟的IIC通讯,但也是要满足IIC通讯的时序要求的。
时序,最重要的就是时间间隔。时间间隔变了,时序就变了,通讯也就失败了。

一周热门 更多>