twi.c
来自「ATMEL TWI接口的EEPROM读写程序。支持8字节页写操作。支持32Kbi」· C语言 代码 · 共 199 行
C
199 行
void starti2c()
{ uchar i=20;
while(i--)
{ sda=1;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
scl=1;
_nop_();
_nop_();
_nop_();
if(sda)
{ _nop_();
_nop_();
_nop_();
_nop_();
sda=0;
_nop_();
_nop_();
_nop_();
_nop_();
scl=0;
return;
}
_nop_();
_nop_(); //1.2us
_nop_();
scl=0;
}
}
void stopi2c()
{ sda=0;
_nop_();
_nop_();
_nop_();
scl=1;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
sda=1;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
scl=0;
}
void mack()
{ scl=0;
sda=0;
_nop_(); //min 0
_nop_();
_nop_();
_nop_();
scl=1;
_nop_(); //min 0.6us
_nop_();
_nop_();
_nop_();
scl=0;
_nop_();
_nop_();
_nop_(); //min 100ns
_nop_();
scl=0;
}
/*
void mnack()
{ sda=1;
_nop_();
_nop_();
_nop_();
_nop_();
scl=1;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
scl=0;
_nop_();
_nop_();
_nop_();
_nop_();
sda=0;
}
*/
void cack()
{ sda=1;
_nop_();
_nop_();
scl=1;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
ack=!sda;
scl=0;
_nop_();
_nop_();
_nop_();
_nop_();
}
uchar rdbyte()
{ uchar i,dat;
sda=1;
for(i=0;i<8;i++)
{ scl=0;
_nop_();
_nop_();
_nop_();
_nop_();
scl=1;
_nop_();
_nop_();
_nop_();
_nop_();
dat=dat<<1;
dat|=(uchar)sda;
}
scl=0;
return(dat);
}
void wrbyte(uchar dat)
{ uchar i;
for(i=0;i<8;i++)
{ scl=0;
sda=(bit)(dat&0x80);
dat=dat<<1;
_nop_();
_nop_();
scl=1;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
}
scl=0;
}
void wrbytes(uchar idata *dataPtr,uchar romAddr,uchar n)
{ uchar i,romAddrBak,idata *dataPtrBak,m=30;
i=n;romAddrBak=romAddr;dataPtrBak=dataPtr;
while(m--)
{ starti2c();
wrbyte(0xa0);
cack();
if(!ack) continue;
wrbyte(romAddrBak);
cack();
if(!ack) continue;
for(;i>0;i--)
{ wrbyte(*dataPtrBak++);
cack();
if(!ack) break;
}
if(i>0) continue;
break;
}
stopi2c();
}
void rdbytes(uchar romaddr,uchar idata *dataPtr,uchar n)
{ uchar i;
for(i=0;i<30;i++)
{ starti2c();
wrbyte(0xa0);
cack();
if(!ack) continue;
wrbyte(romaddr);
cack();
if(!ack) continue;
starti2c();
wrbyte(0xa1);
cack();
if(!ack) continue;
for(;n>0;n--)
{ *dataPtr++=rdbyte();
mack();
}
break;
}
stopi2c();
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?