[原创] E6060模拟IIC与内部EEPROM通信
389 查看
0 回复
 楼主 | 发布于 2021-04-23 | 只看楼主
分享到:
//==============================================
//I2C通信设定↓(时钟线始终设为输出,数据线随读写状态改变)
//---------------------------------------------- 
void input(void)//read_IO口设置为输入
{
    DDR00=0;//时钟线/输出
    DDR17=1;//数据线/输入
}
void output(void)//write_IO口设置为输出
{
    DDR00=0;//时钟线/输出
    DDR17=0;//数据线/输出
}
void IIC_delay(void)//短暂延时
{
    Nop();
    Nop();
    Nop();
    Nop();
    Nop();
}
void start(void)  //开始信号

    output();
    SDA=1;
    IIC_delay();
    SCL=1;
    IIC_delay();
    SDA=0;
    IIC_delay();
}

void IIC_stop(void)   //停止信号
{
    output();
    SDA=0;
    IIC_delay();
    SCL=1;
    IIC_delay();
    SDA=1;
    IIC_delay();
    DDR00=1;//时钟线/输入
    DDR17=1;//数据线/输入
}

void s_respons(void)  //从机应答信号
{
    uchar i=0;
    input();
    SCL=1;
    IIC_delay();
    while((SDA==1)&&(i<250))i++;//超时设定     
    SCL=0;
    IIC_delay();
}
void m_respons(void)//主机应答信号
{
  output();
  SCL=0; 
  IIC_delay();
  SDA=1;
  IIC_delay();
  SCL=1; 
  IIC_delay(); 
  SCL=0; 
  IIC_delay(); 
}

void write_byte(uchar date)//写入一个字节Byte
{
    uchar j,temp=0;
    temp=date;
    output();
    for(j=0;j<8;j++)
    {
      SCL=0;
      temp=temp<<1;
      IIC_delay();
      SDA=C;//C位对应最高位移出的值
      IIC_delay();
      SCL=1;
      IIC_delay();
    }
    SCL=0;
    IIC_delay();
    SDA=1;
    IIC_delay();
}

uchar read_byte(void)//读出一个字节Byte
{
    uchar h,k=0;
    input();
    SCL=0;
    IIC_delay();
    SDA=1;
    IIC_delay();
    for(h=0;h<8;h++)
    {
        SCL=1;
        IIC_delay();   
        k=(k<<1)|SDA;
        SCL=0;
        IIC_delay();   
    }
    return k;
}

void write_add(uchar address,uchar date)//在任意地址写入一个数
{
      start();
      write_byte(0xa0);//设备地址
      s_respons();
      write_byte(address);//数据地址
      s_respons();
      write_byte(date);//数据
      s_respons();
      IIC_stop();
}

uchar read_add(uchar address)//读出任意一个地址的数据
{
    uchar date=0;
    start();
    write_byte(0xa0);
    s_respons();
    write_byte(address);
    s_respons();
    start();
    write_byte(0xa1);
    s_respons();   
    date=read_byte();
    m_respons();
    IIC_stop();
    return date;
}
(0 ) (0 )
回复 举报
  • 发表回复
    0/3000





    举报

    请选择举报类别

    • 广告垃圾
    • 违规内容
    • 恶意灌水
    • 重复发帖

    全部板块

    返回顶部