外部EEPROM,IIC总线和EEPROM通信技术

来源:互联网 发布:在access数据库中 表是 编辑:程序博客网 时间:2024/06/05 22:40
 #include "STC/STC15F2K60S2.h"
 #include <intrins.h> //包含NOP空指令函数_nop_();

 #define AddWr 0xa0   //写数据地址,需要参考24c02芯片文档
 #define AddRd 0xa1   //读数据地址
 #define FALSE 0
 #define TURE 1
 
 sbit SDA=P2^1;       //定义总线连接端口
 sbit SCL=P2^0 ;

void delayus()
{
   _nop_();
   _nop_();
   _nop_();
   _nop_();
   _nop_();
   _nop_();
   _nop_();
}

void delay(unsigned int j)
{
    unsigned int i;
  for(;j>0;j--)
   for(i=0;i<100;i++)
            ;
}


void Start()    //启动iic总线
{    
    
     SCL = 1;
     delayus();
     SDA = 1;
     delayus();
     SDA = 0;
     delayus();
}

void Stop() //停止iic总线
{

    SCL = 1;
    delayus();
    SDA = 1;
    delayus();
    SCL = 0;
    delayus();
}

void Ack()               // 应答IIC总线
{
    SCL = 0;
    SDA = 1;            
    delayus();
    SDA = 0;
    delayus();
    SCL = 1;
    delayus();
    _nop_();
    SCL = 0;
    _nop_();
    _nop_();
}


void NoAck()     //非应答IIC总线
{
    SDA = 1;
    delayus();
    SCL = 1;
    delayus();
    _nop_();
    SCL = 0;
    _nop_();
    _nop_();
}
/*
bit Ack()
{
    bit flag;
    SDA=1;
    SCL=1;
    delayus();
    flag=SDA;
    delayus();
    SCL=0;
    delayus();
    if(flag == 1)
        return FALSE;       //非应答
    else
        return TURE;
}*/
            
void  Send(unsigned char dat)
{
    unsigned char i;
    for(i = 0;i<8;i++)
    {
        dat=dat<<1;
        SCL = 0;
        delayus();
        
        SDA = CY;//PSW为中的进位标识,左移后最高位移入CY
        delayus();
        SCL = 1;//高电平,数据平稳
        delayus();
    }
    SCL = 0;
    delayus();
    SDA = 1;//总线释放
    delayus();
}

unsigned char read()   //读一个字节
{
    unsigned char count;
    unsigned char dat;
    //SDA = 1;
     SCL = 0;
     delayus();
     SDA = 1;
     delayus();

    for(count = 0;count < 8;count++)
    {
        SCL = 1;
        delayus();
        dat = (dat << 1)|(unsigned char)SDA;//dat左移一位,最低位为0,此时与SDA按位或运算
        SCL = 0;                             //读到最低为
        delayus();
    }

    return dat;    
}

/*写入数据*/

void WriteToROM(unsigned char Address,unsigned char Data)
{
        Start();
        Send(AddWr);    //写入芯片地址
        Ack();
        Send(Address);//写入存储地址
        Ack();
        Send(Data);//写数据
        Ack();
        Stop();
        //delay(20);
}
/*  读出数据 */

unsigned char  ReadFromROM(unsigned char Address)
{
    unsigned char PData = 0;
    Start();        //写入芯片地址
    Send(AddWr);
    Ack();
    Send(Address);//写入存储地址
    Ack();
    Start();
    Send(AddRd);    //读入地址
    Ack();
    PData = read();//读数据
    Stop();
    NoAck();
    return PData;
    
}
 void main()
{
  while(1)
  {    
   
    SDA = 1;            //初始化
    delayus();
    SCL = 1;
    delayus();

    WriteToROM(25,0xaa);
    delay(20);
    P0 = ReadFromROM(25);
      //P0 = 1 ;
  }
 }
0 0
原创粉丝点击