cpubbs 发表于 2009-8-3 00:38:52

转载一位朋友的AT24C1024的C51驱动程序

原贴地址: http://www.51c51.com/bbs/dispbbs.asp?boardID=15&ID=31388&page=19

voiddelayI2C()
{
   _nop_();   
   _nop_();
   _nop_();
   _nop_();
   _nop_();
}
void delayms(uint dlycnt)
{
uint i;
for(;dlycnt>0;dlycnt--)
   {
       for(i=0;i<124;i++)
       {}
   }

}
voidStart()       //SCL为高时,SDA由高到低的变化就是一个起始状态
{
scl=0;
_nop_();
sda=1;
_nop_();
scl=1;
delayI2C();
sda=0;
delayI2C();
scl=0;
_nop_();
}
voidStop()       //SCL为高时,SDA由低到高的变化就是一个起始状态
{
sda=0;
_nop_();
scl=1;
_nop_();
sda=1;
delayI2C();
scl=0;
_nop_();
}
voidSendByte(uchar SData)   //发送数据SCL为低时数据SDA改变,SCL为高时发送
{
uchar j;
for(j=0;j<8;j++)
{
   scl=0;
   SData<<=1;
   sda=CY;
   scl=1;
   delayI2C();
}
scl=0;
}
uchar ReceiveByte()      //接收数据
{
   uchar i;
   uchar RData;
   RData=0;
   for(i=0;i<8;i++)
   {
      sda=1;
      _nop_();
      scl=1;
      _nop_();
      _nop_();
      RData=RData<<1;
      RData=RData|sda;
      _nop_();
      _nop_();
      scl=0;
    }
   return(RData);
}
bitReceiveAck()                  //主机接收应答信号
{
bit Ack;
sda=1;                  
_nop_();
_nop_();
scl=1;         
_nop_();
_nop_();
Ack=sda;
_nop_();
_nop_();
scl=0;
_nop_();
return(Ack);
}
void SendAckI2C()
{
sda=0;
_nop_();
_nop_();
scl=1;
delayI2C();         
scl=0;
_nop_();
_nop_();
}
void SendNoAck()
{
sda=1;
_nop_();
_nop_();
scl=1;
delayI2C();   
scl=0;
_nop_();
_nop_();
}
void SendToSubAddress(unsigned long addr,uchar *pSData,uchar N)
{
uchar i;
uchar SlaveAddress;
SlaveAddress=(addr>>15)%256;
SlaveAddress = SlaveAddress & 0x0e | 0xa0;
Start();
SendByte(SlaveAddress);    //选择器件地址
ReceiveAck();
SendByte((addr>>8)%256);    //发送数据地址高字节
ReceiveAck();
SendByte(addr%256);    //发送数据地址低字节
ReceiveAck();
for(i=0;i<N;i++)
{
    SendByte(pSData);
    ReceiveAck();
}
Stop();
}
void ReceiveFromSubAddress(unsigned long addr,uchar *pRData,uchar N)
{
uchar i;
uchar SlaveAddress;
SlaveAddress=(addr>>15)%256;
SlaveAddress = SlaveAddress & 0x0e | 0xa0;
Start();
SendByte(SlaveAddress);    //发送器件地址
ReceiveAck();
SendByte((addr>>8)%256);    //发送数据地址高字节
ReceiveAck();
SendByte(addr%256); //发送数据地址低字节
ReceiveAck();
Start();                              //I2C 开始
SendByte(SlaveAddress+1);    //读设备
ReceiveAck();
for(i=0;i<N-1;i++)
{
   pRData=ReceiveByte();
   SendAckI2C();
}
pRData=ReceiveByte();
SendNoAck();
Stop();
}
页: [1]
查看完整版本: 转载一位朋友的AT24C1024的C51驱动程序