查看: 8008|回复: 5

[教程] 430模拟IIC读取出的数据都为0xff,求高手帮忙

[复制链接]
  • TA的每日心情
    奋斗
    2014-7-24 09:00
  • 签到天数: 205 天

    连续签到: 1 天

    [LV.7]常住居民III

    发表于 2013-5-31 09:01:07 | 显示全部楼层 |阅读模式
    分享到:
    小弟草鸟一枚用430模拟IIC通信对AT24C02进行读取,但是从AT24C02中读取出的数据都是0xff,这个问题纠结了好几天,求大侠相助。。


    #include "msp430g2553.h"
    /******************设置BIT0为SDA数据线,BIT1为时钟线SCL*******************************/
    #define SCL_1     P2OUT|=BIT1
    #define SCL_0     P2OUT&=~BIT1
    #define SDA_IN    P2DIR&=~BIT0
    #define SDA_OUT   P2DIR|=BIT0
    #define SDA_1     P2OUT|=BIT0
    #define SDA_0     P2OUT&=~BIT0
    /**********开启IIC*********************/
    void IIC_start()
    {
      SCL_1;
    __delay_cycles(4);                   //大概延时4us
    SDA_OUT;
    SDA_1;
    __delay_cycles(4);
    SDA_0;
    __delay_cycles(4);
    SCL_0;
    __delay_cycles(4);
    }
    /***************结束IIC***********************/
    void IIC_stop()
    {
      SCL_1;
      __delay_cycles(4);
      SDA_OUT;
      SDA_0;
      __delay_cycles(4);
      SDA_1;
      __delay_cycles(4);
      SCL_0;
      __delay_cycles(4);
      
    }
    /***************向总线写数据********************/
    void IIC_writedata(unsigned char data)
    {
      unsigned char n;
      SDA_OUT;
      for(n=0;n<8;n++)
      {
        if(data&0x80)
          SDA_1;
        else
          SDA_0;
        asm("NOP");
        __delay_cycles(7);
        data=data<<1;
        SCL_1;
        asm("NOP");
        //__delay_cycles(7);
        asm("NOP");
        SCL_0;
        asm("NOP");
        __delay_cycles(7);
      }
      SDA_IN;
      asm("NOP");
      SCL_1;
    // while(P2IN&BIT0);
      asm("NOP");
      asm("NOP");
      SCL_0;
      __delay_cycles(7);
      SDA_OUT;
    }
    /******************从IIC总线上读一个数据************************/
    unsigned char IIC_readdata()
    {
      unsigned char data,n;
      SDA_IN;               //读总线数据将sda设置位输入
      for(n=0;n<8;n++)
      {
        data=data<<1;
        SCL_1;
        asm("NOP");
       //__delay_cycles(7);
        asm("NOP");
        if(P2IN&BIT0)
          data=data|0x01;
        else
          data=data&&0xfe;
        SCL_0;
        //__delay_cycles(7);
        asm("NOP");
        asm("NOP");
       
      }
      SDA_OUT;
      __delay_cycles(7);
      return data;
    }
    /***************向AT24C02中写一个数据******************/
    void write_c02(unsigned char add,unsigned char data)
    {
      IIC_start();
      IIC_writedata(0xa0);               //选择写数据
      IIC_writedata(add);
      IIC_writedata(data);
      IIC_stop();
    }
    /****************从AT24C02中读一个数据*******************************/
    unsigned char read_c02(unsigned char add)
    {
      unsigned char data;
      IIC_start();
      IIC_writedata(0xa0);
      IIC_writedata(add);
      
      IIC_start();            //IIC启动信号
      IIC_writedata(0xA1);      //发送AT24C02的器件地址和读信号
      data=IIC_readdata();      //读一个字节数据
      IIC_stop();             //产生IIC停止信号
      return data;
    }
    int main( void )
    {
      // Stop watchdog timer to prevent time out reset
      WDTCTL = WDTPW + WDTHOLD;
      unsigned char test;
      
      DCOCTL = 0x00;                          // Set DCOCLK to 1MHz
      BCSCTL1 = CALBC1_1MHZ;
      DCOCTL = CALDCO_1MHZ;

      P2DIR|=BIT1+BIT2;                      //BIT1位设定为时钟线scl,BIT2是测试位
      P2SEL=0X00;
      P2OUT&=~BIT2;
      P2REN|=BIT0;
      P1OUT=0X00;

      asm("NOP");
      asm("NOP");
      asm("NOp");
      write_c02(0x18,4);
      test=read_c02(0x18);
      
      while(1)
      {
       
        if(test==4)
          P2OUT|=BIT2;
        if(test==0xff)                                          //这里得出read_c02得到的数据都是0xff,不明白是为什么

        {P2OUT^=0X04;__delay_cycles(40000);}
      }
       
    }

    回复

    使用道具 举报

  • TA的每日心情
    奋斗
    2016-8-15 09:28
  • 签到天数: 222 天

    连续签到: 1 天

    [LV.7]常住居民III

    发表于 2013-5-31 09:38:04 | 显示全部楼层
    没有读取成功,建议好好研究研究通信协议
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2014-7-24 09:00
  • 签到天数: 205 天

    连续签到: 1 天

    [LV.7]常住居民III

     楼主| 发表于 2013-5-31 11:08:00 | 显示全部楼层
    奋斗哥 发表于 2013-5-31 09:38
    没有读取成功,建议好好研究研究通信协议

    好吧,谢谢你。。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2016-6-12 21:59
  • 签到天数: 647 天

    连续签到: 1 天

    [LV.9]以坛为家II

    发表于 2013-5-31 12:17:04 | 显示全部楼层
    这并不是都是0xff,建议用串口通信看下读出来的数据
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2014-7-24 09:00
  • 签到天数: 205 天

    连续签到: 1 天

    [LV.7]常住居民III

     楼主| 发表于 2013-5-31 12:46:00 | 显示全部楼层
    QQ哥 发表于 2013-5-31 12:17
    这并不是都是0xff,建议用串口通信看下读出来的数据

    谢谢,我试一下。。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2022-10-10 06:47
  • 签到天数: 1313 天

    连续签到: 3 天

    [LV.10]以坛为家III

    发表于 2013-5-31 17:53:43 | 显示全部楼层
    网上应该有例子的,比如51的,对照一下。看看延时对不对。
    回复 支持 反对

    使用道具 举报

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

    本版积分规则

    关闭

    站长推荐上一条 /3 下一条

    手机版|小黑屋|与非网

    GMT+8, 2025-1-20 19:10 , Processed in 0.149039 second(s), 24 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.