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

6 篇文章 0 订阅
1 篇文章 0 订阅
 #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
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值