转载一位朋友的AT24C1024的C51驱动程序
原贴地址: http://www.51c51.com/bbs/dispbbs.asp?boardID=15&ID=31388&page=19voiddelayI2C()
{
_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]