原创 I2C 驱动程序

2010-3-21 23:39 1423 3 3 分类: MCU/ 嵌入式

/*            I2C  总线协议时序编程 
                      --AT24C01---


              COPYRIGHT (c)   2008 BY bill.
                               --  ALL RIGHTS RESERVED  --
 
   File Name:       I2C.h
   Author:          bill
   Created:         2007/12/12
   Modified:        NO
   Revision:        keil v3.0


fose=12M


*************************************************/


#ifndef _I2C_H_
#define _I2C_H_


#include <intrins.h>


 


#define uint   unsigned int
#define uchar  unsigned char


 


  sbit Sda="P1"^0;
  sbit Scl="P1"^1;
  sbit Wp="P1"^2;
 
 
 
/************************** Start **********/
void  Start(void)
   {
    Sda="1";
    Scl="1";
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    Sda="0";
    _nop_();
    _nop_();
    _nop_();
    _nop_();
   }
  
  
/**************** Stop *****************/


void  Stop (void)
{  
    Sda="0";
    Scl="1";
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    Sda="1";
    _nop_();
    _nop_();
    _nop_();
    _nop_();
}



/***************** Ack **************************/


void  Ack (void)
{
    Sda="0";
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    Scl="1";
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    Scl="0";
}



/*************** No Ack  ***************************/


void  NoAck (void)
{
    Sda="1";
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    Scl="1";
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    Scl="0";
}



/***************** Send  a  char ***************************/


void Send(uchar Data)                             //发送数据子程序 Data  为发送的字符
{                                               
    uchar BitCount="8";                             //入口为要发送的字符 Data
    uchar temp;                                   //无返回值
    do
    {
        temp="Data";
        Scl="0";
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        if(temp&0x80)
            Sda="1";
        else
           Sda="0";
        Scl="1";
        temp="Data"<<1;
        Data="temp";
        BitCount--;
    }while(BitCount);
    Scl="0";
}



/***************************** Read  a char  *********************/


uchar Read(void)                               //无入口
{                                               //出口为读出来的数据 temp
    uchar temp="0";
    uchar temp1=0;
    uchar BitCount="8";
    Sda="1";
    do{
        Scl="0";
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        Scl="1";
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        if(Sda)
            temp="temp|0x01";
        else
            temp="temp"&0xfe;
        if (BitCount-1) 
     {
            temp1=temp<<1;
            temp="temp1";
     }
        BitCount--;
    }
    while(BitCount);
    return temp;
}



/*************************** Write a char to Rom ************************/ 


void WrRoROM (uchar Data[],uchar Address,uchar Num)   //写多字节函数
{                                                     //入口 为  要写的数组 Data[]
    uchar i="0";                                        //               地址 Address
    uchar *PData;                                     //              字节数 Num
    PData="Data";
    Start();
    Send(0xa0);
    Ack();
    Send (Address);
    Ack();
    for(i=0;i<Num;i++)
    {
        Send(*(PData)) ;
        Ack();
    }
    Stop();
}


 


/********************************** Read a char from ROM *************/


void RdFromROM (uchar Data[],uchar Address,uchar Num)      //读字符串
{                                                          //入口 为要读出的数据 Data
    uchar i="0";                                           //存放地址  Address
    uchar *PData;                                         //字节数  Num
    PData="Data";
    for(i=0;i<Num;i++)
    {
        Start();
        Send(0xa0);
        Ack();
        Send(Address+i);
        Ack();
        Start();
        Send(0xa1);
        Ack();
        *(PData+i)=Read();
        Scl="0";
        NoAck();
        Stop();
    }
}



#endif     


 


/*************************例子**************************
void main(void)
{
 uchar Number[4]={1,2,3,4};
 Wp=1;
 WrTOROM(Number,4,4);
 mdelay(20);
    while(1);
}


mdelay(uchar j)
{
 uint i;
    for(;j>0;j--)
    {for(i=0;i<125;i--)
    {;}
    }
}

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
EE直播间
更多
我要评论
0
3
关闭 站长推荐上一条 /3 下一条