OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 7877|回复: 11

msp430g2553模拟IIC问题,求指点。。

[复制链接]

3

主题

8

帖子

0

精华

新手上路

积分
42
金钱
42
注册时间
2013-5-12
在线时间
1 小时
发表于 2013-6-2 16:45:34 | 显示全部楼层 |阅读模式
用MSP430G2553模拟IIC对AT24C02进行读写操作,每次从总线读出来的数据都是0xff,纠结了很久,求高手指点。。。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

头像被屏蔽

6168

主题

7041

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
19705
金钱
19705
注册时间
2012-12-27
在线时间
25 小时
发表于 2013-6-2 19:03:13 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

558

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
164883
金钱
164883
注册时间
2010-12-1
在线时间
2099 小时
发表于 2013-6-2 23:05:59 | 显示全部楼层
说明模拟IIC代码的有问题,慢慢查.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

108

主题

1440

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
2233
金钱
2233
注册时间
2012-4-30
在线时间
7 小时
发表于 2013-6-3 14:16:09 | 显示全部楼层
肯定可以的!
回复 支持 反对

使用道具 举报

5

主题

70

帖子

0

精华

限制会员

积分
-404
金钱
-404
注册时间
2013-5-17
在线时间
5 小时
发表于 2013-6-4 09:39:59 | 显示全部楼层
/********************************************************  
*   文件名称:  
*               IIC.c  
*       文件说明:  
*       使用口线模拟IIC  
*********************************************************/   
   
#define MSP_IIC 0   
   
#ifndef MSP430F449_H   
#include <msp430x44x.h>   
#endif   
   
/*********************************************************  
*   数据定义  
*********************************************************/   
unsigned char read_Buf,  //读缓冲区   
          write_Buf, //写缓冲区   
          ctrl_Buf,  //用于存放控制指令等的中间缓冲区    
          addr_Buf,  //高地址缓冲   
          ack_Flag;  //应答标识   
/************************************************  
*   延迟  
************************************************/   
void iic_Delay(void)   
{   
   _NOP();   
   _NOP();   
   _NOP();      
}   
/*********************************************************  
*   启动IIC  
*********************************************************/   
void start_IIC(void)   
{   
     4OUT &= 0x3f; //设置P4OUT   
     4DIR &= 0x7f; //SDA = 1   
     iic_Delay();   
     4DIR &= 0xbf; //SCL = 1   
     iic_Delay();   
     4DIR |= 0x80; //SDA = 0   
     iic_Delay();   
     4DIR |= 0x40; //SCL = 0   
     iic_Delay();   
        
}   
/*******************************************************  
*   停止IIC  
*******************************************************/   
void stop_IIC(void)   
{   
     4DIR |= 0x80; //SDA = 0   
     iic_Delay();   
     4DIR &= 0xbf; //SCL = 1   
     iic_Delay();   
     4DIR &= 0x7f; //SDA = 1   
     iic_Delay();   
     4DIR |= 0x80; //SDA = 0   
     iic_Delay();   
     4DIR |= 0x40; //SCL = 0   
}   
   
/*******************************************************  
*   发送 0  
*******************************************************/   
void send_Zero(void)   
{   
     P4DIR |= 0x80; //SDA = 0   
     iic_Delay();   
     P4DIR &= 0xbf; //SCL = 1   
     iic_Delay();   
     P4DIR |= 0x40; //SCL = 0   
     iic_Delay();   
        
}   
/*******************************************************  
*   发送 1  
*******************************************************/   
void send_One(void)   
{      
     P4DIR &= 0x7f; //SDA = 1   
     iic_Delay();   
     P4DIR &= 0xbf; //SCL = 1   
     iic_Delay();   
     P4DIR |= 0x40; //SCL = 0   
     iic_Delay();   
     P4DIR |= 0x80; //SDA = 0   
     iic_Delay();      
}   
/*******************************************************  
*   发送一个字节数据  
*******************************************************/   
void send_Char(void)   
{   
     unsigned char cnt,tmp=0x80;   
     for(cnt=0;cnt<8;cnt++)   
     {   
        if((ctrl_Buf & tmp )> 0)   
        {   
             send_One();        // 发送1   
        }else   
        {   
             send_Zero();   // 发送0   
        }   
        tmp /= 2;       // tmp右移一位   
     }     
}   
   
/*******************************************************  
*   读一个byte数据  
*******************************************************/   
void read_Char(void)   
{   
     unsigned char cnt,tmp=0x80;   
     read_Buf = 0x00;   
     for(cnt=0;cnt<8;cnt++)   
     {   
        P4DIR &= 0x7f;  //SDA = 1   
        iic_Delay();   
        P4DIR &= 0xbf;  //SCL = 1   
        iic_Delay();   
        if((P4IN & 0x80) > 0x00)   
        {               // 收到 1   
            read_Buf |= tmp;   
        }   
        P4DIR |= 0x40;  //SCL = 0   
        iic_Delay();   
        tmp = tmp/2;   
           
     }   
}   
   
/*************************************************  
*   应答信号  
*************************************************/   
void iic_ACK(void)   
{        
     ack_Flag = 0x00;   
     P4DIR   &= 0x7f;   //SDA = 1   
     iic_Delay();   
     P4DIR   &= 0xbf;   //SCL = 1   
     iic_Delay();   
     if ((P4IN & 0x80) == 0x80 )   
     {   
        ack_Flag = 0x01;   
     }   
     P4DIR   |=  0x40;  //SCL = 0   
     iic_Delay();   
         
}   
/***********************************************  
*  iic_NACK  
************************************************/   
void iic_NACK(void)   
{   
     P4DIR   &= 0x7f;   //SDA = 1   
     iic_Delay();   
     P4DIR   &= 0xbf;   //SCL = 0   
     iic_Delay();   
        
     P4DIR   |= 0x40;   //SCL = 0   
     iic_Delay();   
     P4DIR   |= 0x80;   //SDA = 0   
     iic_Delay();   
}   
   
/************************************************  
*   写一个数据到EEPROM  
*************************************************/   
void write_EEPROM(void)   
{   
     unsigned char step_Flag=0x00;   
     while(step_Flag < 0x03)   
     {   
         if(step_Flag == 0x00)   
         {   
            start_IIC();       // 启动 I2c   
            ctrl_Buf = 0xA0;       // 设置控制位   
            send_Char();       // 发送控制位   
            iic_ACK();         // 确认   
            if (ack_Flag == 0) step_Flag += 1;   
     }else if (step_Flag==1)   
     {   
         ctrl_Buf = addr_Buf;  // 设置地址   
         send_Char();          // 发送地址   
         iic_ACK();            // 读 确认    
         if (ack_Flag == 0)   
         {  // 检测是否地址发送成功   
             step_Flag += 1;   
         }else{   
             step_Flag = 0;   
         }   
      }else{   
         ctrl_Buf = write_Buf; // 设置写内容   
         send_Char();      // 写    
         iic_ACK();            // 读响应信息   
         if (ack_Flag == 0)    
         {                     // 检测是否写成功   
             step_Flag += 1;   
         }else{   
             step_Flag = 0;   
         }    
      }   
      }   
                  
      stop_IIC();                // 停止 IIC   
            
}   
/*************************************************  
*   从EEPROM读数据  
*************************************************/   
void read_EEPROM()   
{   
     unsigned char step_Flag=0;   
     while(step_Flag < 0x03)   
     {   
         if(step_Flag == 0x00)   
         {   
            start_IIC();        //启动 I2c   
            ctrl_Buf = 0xa0;        //设置控制位   
            send_Char();        //发送控制位   
            iic_ACK();          //读取应答   
            if (ack_Flag == 0) step_Flag += 1;   
     }else if (step_Flag==1){   // 如果控制位发送成功   
         ctrl_Buf = addr_Buf;   // 设置读地址   
         send_Char();           // 发送地址   
         iic_ACK();             // 读响应   
         if (ack_Flag == 0)    
         {   // 是否地址已经发送    
             step_Flag += 1;       
         }else{   
             step_Flag = 0;   
         }   
      }else{   
         start_IIC();          // 启动 IIC   
         ctrl_Buf = 0xa1;      // 设置读模式   
         send_Char();      // 发送控制位   
         iic_ACK();            // 获取响应   
         if (ack_Flag == 0)   
         {                     // 是否发送成功     
             step_Flag += 1;   
             read_Char();      // 读字符   
             iic_NACK();       // 发响应     
         }else{    
             step_Flag = 0;   
         }    
      }   
      }               
      stop_IIC();                  // 停止 IIC   
}
回复 支持 反对

使用道具 举报

5

主题

70

帖子

0

精华

限制会员

积分
-404
金钱
-404
注册时间
2013-5-17
在线时间
5 小时
发表于 2013-6-4 09:40:36 | 显示全部楼层
加大延迟时间试试,一般都是这个问题。
回复 支持 反对

使用道具 举报

54

主题

537

帖子

0

精华

高级会员

Rank: 4

积分
797
金钱
797
注册时间
2012-2-27
在线时间
7 小时
发表于 2013-11-26 21:47:22 | 显示全部楼层
楼主搞定了么?
回复 支持 反对

使用道具 举报

3

主题

8

帖子

0

精华

新手上路

积分
42
金钱
42
注册时间
2013-5-12
在线时间
1 小时
 楼主| 发表于 2013-12-5 00:17:37 | 显示全部楼层
回复【7楼】wwjdwy:
---------------------------------
搞定了。。
回复 支持 反对

使用道具 举报

3

主题

8

帖子

0

精华

新手上路

积分
42
金钱
42
注册时间
2013-5-12
在线时间
1 小时
 楼主| 发表于 2013-12-5 00:17:46 | 显示全部楼层
谢谢大家
回复 支持 反对

使用道具 举报

54

主题

537

帖子

0

精华

高级会员

Rank: 4

积分
797
金钱
797
注册时间
2012-2-27
在线时间
7 小时
发表于 2013-12-5 11:20:48 | 显示全部楼层
回复【8楼】xiandni:
---------------------------------
哪里改的?我最近也是IIC有点问题
回复 支持 反对

使用道具 举报

3

主题

8

帖子

0

精华

新手上路

积分
42
金钱
42
注册时间
2013-5-12
在线时间
1 小时
 楼主| 发表于 2013-12-5 16:09:49 | 显示全部楼层
回复【10楼】wwjdwy:
---------------------------------
#include <MSP430g2553.h>

#define  SlaveWriteAddress  0xa0

#define  SlaveReadAddress   0xa1

#define  OwnAddress         0xee

#define  I2CSDA             BIT1 

#define  I2CSCL             BIT2

#define  I2CSDA_SET_1       1OUT |=  I2CSDA

#define  I2CSDA_SET_0       1OUT &=~ I2CSDA

#define  I2CSCL_SET_1       1OUT |=  I2CSCL

#define  I2CSCL_SET_0       1OUT &=~ I2CSCL

#define  I2CSDA_INPUT_IN    1IN&I2CSDA

 

unsigned char READI2CBUF;

 

void delay5us( void )

    {

      unsigned char count=8;

      while(count--);

    }     

 

void Delay_MS( unsigned int m )

    {    

      unsigned int i,j;

      for(i=0;i<m;i++)

          for(j=0;j<125;j++);

    } 

void Setting_System_Clock_For_On_Chip_RC( char Frequency )

    {

      switch (Frequency)

        {

          case 1COCTL = BCSCTL1 = CALBC1_1MHZ;break;

          case 8COCTL = BCSCTL1 = CALBC1_8MHZ;break;

          case 12COCTL = BCSCTL1 = CALBC1_12MHZ;break;

          case 16COCTL = BCSCTL1 = CALBC1_16MHZ;break;

        }    

    } 

 

void I2C_Pins_DIR_Setting ( unsigned char SDADIR )

    {

      1DIR  |= I2CSDA + I2CSCL;  

      if(SDADIR==1)

        {

          1DIR &=~ I2CSDA;

          1OUT &=~ I2CSDA;

        }

    }

 

void Engender_I2C_start_signal(void)

    {

      I2CSCL_SET_1;  delay5us();

      I2CSDA_SET_1;  delay5us();

      I2CSDA_SET_0;  delay5us();

    }       

void Engender_I2C_stop_signal(void)

    { 

      I2CSDA_SET_0;  delay5us();

      I2CSCL_SET_1;  delay5us(); 

      I2CSDA_SET_1;  delay5us();

    }       

void Engender_I2C_ack_signal(void)

    {     

      I2CSCL_SET_0;  delay5us();

      I2CSCL_SET_1;  delay5us();

      I2CSCL_SET_0;  delay5us();

    }          

void Engender_I2C_noack_signal(void)   

    { 

      I2CSDA_SET_1;  delay5us();

      I2CSCL_SET_0;  delay5us();

      I2CSCL_SET_1;  delay5us();

      I2CSCL_SET_0;  delay5us();

    }  

 

void WRITE_BYTE_TO_24C04( unsigned char BytEDAta )   

    { 

      unsigned char count;

      for(count=0;count<8;count++)

        {

          I2CSCL_SET_0;

          delay5us();

          if(BytEDAta&0x80)I2CSDA_SET_1;

          else             I2CSDA_SET_0;

          delay5us();

          I2CSCL_SET_1;

          delay5us();

          BytEDAta><<=1;

        }

    }          

unsigned char READ_BYTE_TO_24C04( void )

    { 

      unsigned char count,readbyte=0; 

      I2CSCL_SET_0; 

      for(count=0;count<8;count++)

        {

          readbyte=readbyte<<1; 

          I2CSCL_SET_1; 

          delay5us();  

          if(I2CSDA_INPUT_IN)readbyte=readbyte|0x01;

          else               readbyte=readbyte&0xfe;

          delay5us();

          I2CSCL_SET_0;

          delay5us(); 

        }

      I2CSCL_SET_0;

      return readbyte;

    }        

void WRITE_DATA_TO_24C04( unsigned char Address,unsigned char Date )

    {

      Setting_System_Clock_For_On_Chip_RC(1);

      I2C_Pins_DIR_Setting(0);

      Engender_I2C_start_signal();

      WRITE_BYTE_TO_24C04(SlaveWriteAddress);

      Engender_I2C_ack_signal();

      WRITE_BYTE_TO_24C04(Address);

      Engender_I2C_ack_signal();

      WRITE_BYTE_TO_24C04(Date);

      Engender_I2C_ack_signal();

      Engender_I2C_stop_signal();

      Delay_MS(15);

      I2CSCL_SET_0;

      I2CSDA_SET_0;

      Setting_System_Clock_For_On_Chip_RC(12);

     }           

unsigned char READ_DATA_FROM_24C04( unsigned char Address )

    { 

      unsigned char readdate;

      Setting_System_Clock_For_On_Chip_RC(1);

      I2C_Pins_DIR_Setting(0);

      Engender_I2C_start_signal();

      WRITE_BYTE_TO_24C04(SlaveWriteAddress);

      Engender_I2C_ack_signal();

      WRITE_BYTE_TO_24C04(Address); 

      Engender_I2C_ack_signal();

      Delay_MS(15);         

      Engender_I2C_start_signal();

      WRITE_BYTE_TO_24C04(SlaveReadAddress);  

      I2C_Pins_DIR_Setting(1);

      Engender_I2C_ack_signal();

      readdate=READ_BYTE_TO_24C04();

      I2C_Pins_DIR_Setting(0);     

      Engender_I2C_noack_signal();

      Engender_I2C_stop_signal();

      I2CSCL_SET_0;

      I2CSDA_SET_0;    

      Setting_System_Clock_For_On_Chip_RC(12);

      return (readdate);

    }

 

void main( void )                    

    {  

      unsigned char Data=0x50;

      WDTCTL  =  WDTPW+WDTHOLD;   

      Setting_System_Clock_For_On_Chip_RC(12);            

      1DIR |= BIT0;

      while(1)

        {

         // WRITE_DATA_TO_24C04(0X19,Data);

          READI2CBUF=READ_DATA_FROM_24C04(0x75); 

          if( READI2CBUF == 0x68)

            {

              1OUT |=  BIT0;

            }

          else

            {

              P1OUT ^=0x01;

            }

          Delay_MS(600);

        }

    }
回复 支持 反对

使用道具 举报

1

主题

14

帖子

0

精华

新手上路

积分
48
金钱
48
注册时间
2016-3-22
在线时间
8 小时
发表于 2016-3-31 15:36:08 | 显示全部楼层
xiandni 发表于 2013-12-5 16:09
回复【10楼】wwjdwy:
---------------------------------
#include&nbsp;&lt;MSP430g2553.h&gt;

#define&nbs ...

请问楼主,最终实验现象是灯闪还是常亮?个人感觉应该是常亮才对,可是按你下面的程序跳出来是灯闪    读到的数据还是0xFF   
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-5-24 04:33

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表