打印
[技术问题解答]

KL25 模拟 I2C (24LC256)出现问题 ,24lc02没问题(已解决)

[复制链接]
1877|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
water198617|  楼主 | 2014-5-28 16:56 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
water198617|  楼主 | 2014-5-28 17:05 | 只看该作者
#define SCL_H          gpio_set(PORTE,5,1)     //库函数
#define SCL_L          gpio_set(PORTE,5,0)
   
#define SDA_H          gpio_set(PORTE,0,1)
#define SDA_L          gpio_set(PORTE,0,0)

#define SCL_read      gpio_get(PORTE,5)
#define SDA_read      gpio_get(PORTE,0)



void I2C_delay(void)
{       
   u8 z= 35; //这里可以优化速度        ,经测试最低到5还能写入,示波器测 约为7.5US
   while(z)
   {
     z--;
   }
}


   
/*********************************************************************
描    述:        产生IIC起始信号
返回值         :               
其它说明:               
*********************************************************************/
void I2C_Start(void)
{
          SDA_H;
          I2C_delay();
        SCL_H;
        I2C_delay();
        SDA_L;
        I2C_delay();
       
}
/*********************************************************************
描    述:        产生IIC停止信号
返回值         :               
其它说明:               
*********************************************************************/
void I2C_Stop(void)
{
       
        SDA_L;
        I2C_delay();
        SCL_H;
        I2C_delay();
        SDA_H;
        I2C_delay();
}



/*********************************************************************
描    述:        产生ACK应答
返回值         :               
其它说明:               
*********************************************************************/
void I2C_Ack(void)
{       
        SCL_L;
        I2C_delay();
        SDA_L;
        I2C_delay();
        SCL_H;
        I2C_delay();
    //     I2C_delay();
  //       I2C_delay();
        SCL_L;
        I2C_delay();
}

/*********************************************************************
描    述:        不产生ACK应答
返回值         :               
其它说明:               
*********************************************************************/
void I2C_NoAck(void)
{       
        SCL_L;
        I2C_delay();
        SDA_H;
        I2C_delay();
        SCL_H;
        I2C_delay();
    //      I2C_delay();
  //        I2C_delay();
        SCL_L;
        I2C_delay();
}

/*********************************************************************
描    述:        等待应答信号到来
返回值         :        1,有ACK
                        0,无ACK        
其它说明:               
*********************************************************************/
void I2C_WaitAck(void)
{
        u16 i=0;
       
        SCL_H;
        I2C_delay();
          gpio_init(PORTE,0,GPI,0);//设为输入
          while((SDA_read==1)&&(i<255))
          {
            i++;
          }
          SCL_L;
           gpio_init(PORTE,0,GPO,1); //设为输出
        I2C_delay();
         
       
}


/*********************************************************************
描    述:        I2C发送一位数据的驱动函数
参数         :        待发送的数据        
其它说明:        数据从高位到低位       
*********************************************************************/
void I2C_SendByte(u8 SendByte)
{
    u8 i=8;
    while(i--)
    {
        SCL_L;
        I2C_delay();
      if(SendByte&0x80)
        SDA_H;  
      else
        SDA_L;   
        SendByte<<=1;
        I2C_delay();
        SCL_H;
        I2C_delay();
    }
    SCL_L;
     I2C_delay();
     SDA_H;  
      I2C_delay();
   
}

/*********************************************************************
描    述:        I2C接收一位数据的驱动函数
返回值         :        接收到的数据        
其它说明:        数据从高位到低位       
*********************************************************************/


u8 I2C_ReceiveByte(void)
{
    u8 i=8;
    u8 ReceiveByte=0;
    SCL_L;
    I2C_delay();
    SDA_H;
    I2C_delay();
    gpio_init(PORTE,0,GPI,0);
    while(i--)
    {
      ReceiveByte<<=1;      
      SCL_L;
      I2C_delay();
          SCL_H;
      I2C_delay();       
      if(SDA_read)
      {
        ReceiveByte|=0x01;
      }
    }
    SCL_L;
    gpio_init(PORTE,0,GPO,1);
    return ReceiveByte;
}



u8 I2C_ReadOneByte(u16 ReadAddress)
{       

           u8 temp ;  
           
           u8 adrl=ReadAddress%256;       //低8位地址
           u8 adrh=ReadAddress/256;       //高8位地址
                                                                                                                                             
        I2C_Start();
        I2C_SendByte(0xa0);           //发送写命令
        I2C_WaitAck();
        I2C_SendByte(adrh);//发送高地址
        I2C_WaitAck();               
        I2C_SendByte(adrl);   //设置低起始地址      
          I2C_WaitAck();
          I2C_Start();
          I2C_SendByte(0xa1);
          I2C_WaitAck();
          temp=I2C_ReceiveByte();
          I2C_NoAck();
          I2C_Stop();
    return temp;                  
}


void I2C_WriteOneByte(u16 WriteAddress, u8 DataToWrite)
{       

  
     u8 adrl=WriteAddress%256;       //低8位地址
     u8 adrh=WriteAddress/256;       //高8位地址
   
        I2C_Start();
        I2C_SendByte(0xa0);            //发送写命令
        I2C_WaitAck();
        I2C_SendByte(adrh);//发送高地址
        I2C_WaitAck();         
        I2C_SendByte(adrl);   //设置低起始地址   
        I2C_WaitAck();       
        I2C_SendByte(DataToWrite);
        I2C_WaitAck();   
        I2C_Stop();

}

使用特权

评论回复
板凳
FSL_TICS_A| | 2014-5-28 17:33 | 只看该作者
你好,楼主!
如果正如你所说的,读写24lc02如果没有问题的话,那就应该不是指令时序的问题啊。
我建议你最好根据24LC256手册上的读写指令过程,比较一下与24LC02有什么区别。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

84

帖子

1

粉丝