下面贴24c512程序,顺便也把IIc的程序贴出来。真是纯干货啊。。。
对了我在这提一下IIc吧。个人认为这是最烂的,最有误导性的通信协议,说是同步通信其实类似异步,还没Uart,SPI快
。注意:下面的程序只适合400khz的器件。
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
sbit sda=P3^7; //???????
sbit scl=P3^6; //???????
void delayus() //??4?????,??4.34us
{
; //????11.0592M,?????1.085??
}
void delayms(int ms) //?????
{
int i;
int j;
for(i=ms;i>0;i--)
{
for(j=113;j>0;j--)
{}
}
}
void iic_start()
{
sda=1;
scl=1;
delayus();
_nop_();
sda=0;
delayus();
}
void iic_stop()
{
sda=0;_nop_();
scl=1;
delayus();
sda=1;
delayus();
//?:??scl?sda??1
}
void iic_sendByte(unsigned char byteData)
{
unsigned char i;
unsigned char temp=byteData;
for(i=0;i<8;i++)
{
temp=temp<<1;
scl=0;
_nop_();
sda=CY;
_nop_();
scl=1;
_nop_();
}
scl=0;
_nop_();
sda=1;
_nop_();
}
unsigned char iic_readByte()
{
unsigned char i,temp;
scl=0;
_nop_();
sda=1;
_nop_();
for(i=0;i<8;i++)
{
scl=1;
delayus();
temp=(temp<<1)|sda;
scl=0;
delayus();
}
return temp;
}
unsigned char iic_checkACK()
{
unsigned char errCounts=255;
scl=1;
_nop_();
while(sda)
{
if(0==errCounts)
{
scl=0;
_nop_();
return 0;
}
errCounts--;
}
scl=0;
_nop_();
return 1;
}
void iic_init()
{
scl=1;
sda=1;
delayus();
}
void iic_sendACK(uchar b_ACK)
{
scl=0;
_nop_();
if(b_ACK) //ACK
{
sda=0;
}
else //unACK
{
sda=1;
}
_nop_();
scl=1;
delayus();
scl=0;
_nop_();
}
void AT24C512_writeByte(uchar addressh,uchar addressl,uchar dataByte)
{
iic_start();
iic_sendByte(0xa0)
iic_checkACK();
iic_sendByte(addressh);
iic_checkACK();
iic_sendByte(addressl);
iic_checkACK();
iic_sendByte(dataByte);
iic_checkACK();
iic_stop();
delayms(2);
}
void AT24C512_writeData(uchar beginAddr,uchar lastAddr,uchar numBytes,uchar buf[])
{
uchar i=0;
iic_start();
iic_sendByte(0xa0);
iic_checkACK();
iic_sendByte(beginAddr);
iic_checkACK();
iic_sendByte(lastAddr);
iic_checkACK();
while(numBytes--)
{
iic_sendByte(buf[i]);
iic_checkACK();
i++;
}
iic_stop();
}
void AT24C02_readData(uchar beginAddr,uchar lastAddr,uchar dataSize,uchar* buf)
{
iic_start();
iic_sendByte(0xa0);
iic_checkACK();
iic_sendByte(beginAddr);
iic_checkACK();
iic_sendByte(lastAddr);
iic_checkACK();
iic_start();
iic_sendByte(0xa1);
iic_checkACK();
while(dataSize--)
{
*buf++=iic_readByte();
iic_sendACK(dataSize);
}
iic_stop();
}
void main()
{ uchar i=0;
uchar buf[18];
uchar arr[34]={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15, //0x00-0x0f
16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,//0x10-0x1f
32,0x55}; //0x20-0x21
iic_init();
AT24C02_writeData(0x00,0x00,sizeof(arr),arr);
//AT24C02_writeByte(0x00,0x00,0x11);
AT24C02_readData(0x00,0x17,sizeof(buf),buf);
while(1)
{
P1=buf[i];
delayms(500);
i++;
}
}