Chinaunix首页 | 论坛 | 博客
  • 博客访问: 582172
  • 博文数量: 199
  • 博客积分: 5087
  • 博客等级: 大校
  • 技术积分: 2165
  • 用 户 组: 普通用户
  • 注册时间: 2010-01-26 21:53
文章存档

2010年(199)

我的朋友

分类: 嵌入式

2010-04-10 10:01:56

/**************************************************************************
 
                     IO口模拟I2C程序
 
               COPYLEFT (c)   2010 BY
                         --  ALL RIGHTS RESERVED  --
 
   File Name:       i2c.h
   Author:         
   Created:         2005/4/3
   Modified:  continue  2010-04-10
   Revision:   1.0
   注意:
   1.  在star信号之后总线就被认为处于忙状态;
   2. 在stop信号之后的几个时钟周期i2c总线才被认为为重新处于空闲状态,因此需要加延时;
     这里加延时delay1(100);
  
***************************************************************************/
#define NUM_PER_PAGE  8
#define M_PAGE        3             //左移右移的次数,与页的大小有关
/**************************
 DEVICE   BYTESNUM_PER_PAGE
 24c01   8
 24c02   8
 24c04   16
 24c08   16
 24c16   16
*****************************/
sbit sda=P1^2;                          //IO口定义
sbit scl=P1^1;
void delay1(uchar x)

 for(;x>0;x--);
}
void flash()
{  ;  ; }
void x24c02_init()  //24c02初始化子程序
{
 scl=1;
 flash();
 sda=1;
 flash();
}
void start()        //启动I2C总线
{
 sda=1;
 flash();
 scl=1;
 flash();
 sda=0;
 flash();
 scl=0;
 flash();
}
void stop()         //停止I2C总线
{
 sda=0;
 flash();
 scl=1;
 flash();
 sda=1;
 flash();
}
void writex(uchar j)  //写一个字节

 uchar i,temp;
    temp=j;
    for (i=0;i<8;i++)
  {
   temp=temp<<1;
   scl=0;
   flash();
   sda=CY;
   flash();
   scl=1;
   flash();
  }
 scl=0;
 flash();
 sda=1;
 flash();
}
uchar readx()   //读一个字节
{
 uchar i,j,k=0;
 scl=0;
 flash();
 sda=1;
    for (i=0;i<8;i++)
  { 
   flash();
   scl=1;
   flash();
   if (sda==1) j=1;
   else j=0;
   k=(k<<1)|j;
   scl=0;
  }
 flash();
 return(k);
}
void clock()         //I2C总线时钟
{
 uchar i=0;
 scl=1;
 flash();
 while ((sda==1)&&(i<255))i++;
 scl=0;
 flash();
}
void ack_1(void)  //非应答
{
  sda=1;
 flash();
 scl=1;
 flash();
 scl=0;
 flash();
}
void ack_0(void) //应答
{
 sda=0;
 flash();
 scl=1;
 flash();
 scl=0;
 flash();
}
////////从24c02的地址address中读取一个字节数据/////
uchar x24c02_read(uchar address)
{
 uchar i;
 start();
 writex(0xa0);
 clock();
 writex(address);
 clock();
 start();
 writex(0xa1);
 clock();
 i=readx();
  ack_1();
 stop();
 delay1(10);
 return(i);
}
//////向24c02的address地址中写入一字节数据info/////
void x24c02_write(uchar address,uchar info)
{
 EA=0;
 start();
 writex(0xa0);
 clock();
 writex(address);
 clock();
 writex(info);
 clock();
 stop();
 EA=1;
// delay1(50);
}
/**读取页**/
void i2c_page_read(uchar addr, uchar *const data_s)    //?
{
 uchar i;
 //uchar reads_num=(addr>>M_PAGE+1)< //EA=0;
 start();
 writex(0xa0);
 clock();
 writex(addr);
 clock();
 start();
 writex(0xa1);
 clock();
 for(i=0;i<8;i++)
  {
   
   data_s[i]=readx();
   if(i<7)
    ack_0();
   else
    ack_1();
  }
 stop();
 delay1(10);
  
}
/**页写**/
void i2c_page_write(uchar addr, uchar *const data_s)    //?
{
 uchar i;
// uchar reads_num=8;//(addr>>M_PAGE+1)< EA=0;
 start();
 writex(0xa0);     //为0时为写操作
 clock();
 writex(addr);
 clock();
 for(i=0;i<16;i++)
  {
   writex(*(data_s+i));
   clock();
  }
 stop();
 delay1(10);
  EA=1;
  
}
 
my Email
阅读(1674) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~