打印

有关msp430g2553 io口模拟i2c的问题

[复制链接]
3170|16
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
hjl240|  楼主 | 2014-10-25 14:23 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
我用msp430f5529控制ds3231时钟芯片,采用IO口模拟I2C,程序正确,时间可以正常工作,

当我用msp430g2553控制ds3231时,也是用IO口模拟I2C,程序基本一样,与5529的程序的唯一区别是时钟不一样,但是G2553却不行,显示为00;请问是什么原因?
5529的时钟程序如下:

#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))
void clk_init()
{
          P5SEL |= BIT2+BIT3;                       // Port select XT2

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

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

          UCSCTL6 &= ~XT2DRIVE0;                    // Decrease XT2 Drive according to
                                                    // expected frequency
          UCSCTL4 |= SELS_5 + SELM_5;               // SMCLK=MCLK=XT2
          UCSCTL5 |= DIVS_2;
}
2553的时钟程序如下:
#define CPU_F          ((double)16000000)
#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))
 BCSCTL1 = CALBC1_16MHZ;                // Set DCO to 1, 8, 12 or 16MHz
       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的程序,不是串口程序,两者的差别就是时钟频率不一样,其他时序都一样

使用特权

评论回复
5
hjl240|  楼主 | 2014-10-25 18:01 | 只看该作者
dirtwillfly 发表于 2014-10-25 16:50
从你提供的始终方面的代码,可以看出5529使用的时钟频率和2553是不一样的。
因为时钟不一样,很有可能会造 ...

IIC的时序延时都是用delayus来控制的,比如
void Start_I2C()
{
        SDA_OUT;
    SDA_H;                  //发送起始条件的数据信号
    delayus(1);
    SCL_H;
    delayus(5);             //起始条件建立时间大于4.7us,延时
    SDA_L;                  //发送起始信号
    delayus(5);             // 起始条件锁定时间大于4μs
    SCL_L;                  //钳住I2C总线,准备发送或接收数据
    delayus(2);
}

void Stop_I2C()
{
        SDA_OUT;
    SDA_L;                  //发送结束条件的数据信号
    delayus(1);             //发送结束条件的时钟信号
    SCL_H;                  //结束条件建立时间大于4us
    delayus(5);
    SDA_H;                  //发送I2C总线结束信号
    delayus(4);
}

使用特权

评论回复
6
dirtwillfly| | 2014-10-25 18:10 | 只看该作者
hjl240 发表于 2014-10-25 18:01
IIC的时序延时都是用delayus来控制的,比如

因为时钟不一样,所以daley的时间间隔全都变了。
建议在移植前,先把5529的时钟调整成和2553一样。如果这样调整后能正常通讯,移到2553就没问题了。

使用特权

评论回复
7
dirtwillfly| | 2014-10-25 18:12 | 只看该作者
虽然是用普通IO模拟的IIC通讯,但也是要满足IIC通讯的时序要求的。
时序,最重要的就是时间间隔。时间间隔变了,时序就变了,通讯也就失败了。

使用特权

评论回复
8
hjl240|  楼主 | 2014-10-25 20:40 | 只看该作者
dirtwillfly 发表于 2014-10-25 18:10
因为时钟不一样,所以daley的时间间隔全都变了。
建议在移植前,先把5529的时钟调整成和2553一样。如果这 ...

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

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

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


使用特权

评论回复
9
dirtwillfly| | 2014-10-25 20:51 | 只看该作者
hjl240 发表于 2014-10-25 20:40
我理解版主的意思,但是,这个两个程序的delayus函数是根据各自的时钟频率计算出来的,比如,对于g2553下 ...

你在两个mcu上都是用的哪两个IO?

使用特权

评论回复
10
youluo235| | 2014-10-26 21:31 | 只看该作者
把时钟搞慢点再试如果确定其他任何东西都一样的话。另外用示波器看下波形。

使用特权

评论回复
11
smilingangel| | 2014-10-27 13:01 | 只看该作者
这个很明显的是时钟源的问题的吧。

使用特权

评论回复
12
dirtwillfly| | 2014-10-28 21:17 | 只看该作者
楼主问题解决了吗?
看过通讯时的波形了吗

使用特权

评论回复
13
shqhope| | 2015-5-19 16:25 | 只看该作者
mark

使用特权

评论回复
14
309030106| | 2015-5-19 20:19 | 只看该作者
首先应该调时钟的,时序也得靠时钟的

使用特权

评论回复
15
comeon201208| | 2015-5-19 22:15 | 只看该作者
i2C总线的是很重要的通讯方式的。

使用特权

评论回复
16
598330983| | 2015-5-31 08:25 | 只看该作者
不是有iic吗?还用这模拟,浪费啊个?

使用特权

评论回复
17
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

粉丝