標(biāo)題:
AT24C02 IIC驅(qū)動 C代碼
[打印本頁]
作者:
xiaos
時間:
2015-4-10 17:26
標(biāo)題:
AT24C02 IIC驅(qū)動 C代碼
#define SCL_L //拉低SCL線的宏
#define SCL_H //拉高SCL線的宏
#define SDA_L //拉低SDA線的宏
#define SDA_H //拉高SDA線的宏
#define SDA_Read //讀SDA線的宏
#define Wait //延時宏 大約為5us
void IIC_Start(void)//啟動IIC函數(shù)
{
SDA_H;
SCL_H;
Wait;
SDA_L;
Wait;
SCL_L;
Wait;
}
void IIC_Stop(void)//停止IIC函數(shù)
{
SDA_L;
SCL_H;
Wait;
SDA_H;
}
void IIC_Send_Byte(uint8_t data)//想IIC器件發(fā)送8個位數(shù)據(jù)
{
uint8_t i;
for(i=0;i<8;i++)
{
if(data&(0x80>>i))
SDA_H;
else
SDA_L;
Wait;
SCL_H;
Wait;
SCL_L;
Wait;
}
SDA_H;
Wait;
}
uint8_t IIC_Read_Byte()//讀取8位數(shù)據(jù)
{
uint8_t i,buff=0x00;
for(i=0;i<8;i++)
{
buff<<=1;
SCL_H;
Wait;
if(SDA_Read)
buff|=0x01;
SCL_L;
Wait;
}
return buff;
}
uint8_t Wait_Ack(void)//等待應(yīng)答
{
uint8_t flag;
SDA_H;
Wait;
SCL_H;
Wait;
if(SDA_Read)
flag=1;
else
flag=0;
SCL_L;
Wait;
return flag;
}
void Ack(void)//發(fā)送應(yīng)答
{
SDA_L;
Wait;
SCL_H;
Wait;
SCL_L;
Wait;
SDA_H;
}
void NAck(void)//發(fā)送非應(yīng)答
{
SDA_H;
Wait;
SCL_H;
Wait;
SCL_L;
Wait;
}
uint8_t AT24C02_Pag_Write(uint8_t address,uint8_t *data,uint8_t size)//AT24C02寫數(shù)據(jù)函數(shù) 第一個參數(shù)是 AT24C02的要寫頁的地址 0-255,第二個參數(shù)是 緩沖區(qū)指針,第三個參數(shù)是 要寫的字節(jié)數(shù)//不能超過8個字節(jié)
{
uint8_t i;
IIC_Stop();
for(i=0;i<100;i++)
{
IIC_Start();
IIC_Send_Byte(0xa0);
if(Wait_Ack()==0)
{
break;
}
}
if(m=100)
{
IIC_Stop();
return 0;
}
IIC_Send_Byte(address);
if(Wait_Ack())
{
IIC_Stop();
return 0;
}
for(i=0;i<size;i++)
{
IIC_Send_Byte(*(data+i));
if(Wait_Ack())
{
IIC_Stop();
return 0;
}
}
IIC_Stpo();
return 1;
}
uint8_t AT24C02_Write(uint8_t address,uint8_t *data,uint8_t size)//對任意AT24C02的地址進(jìn)行寫操作 其中第一個參數(shù)是 AT24C02要寫的地址 第二個參數(shù)是 緩沖區(qū)指針 第三個參數(shù)是 要寫的字節(jié)數(shù) 0-255;
{
uint8_t Page=0;//所需要的頁數(shù)
uint8_t Cont=0;//不足一頁的字節(jié)數(shù)
uint8_t Add_Pag=0;//某一頁已經(jīng)寫了的字節(jié)數(shù)
uint8_t Sur=0;//某一頁還能寫的字節(jié)數(shù)
Page=size/8;
Cont=size%8;
Add_Pag=address%8;
Sur=8-Add_Pag;
if(Add_Pag==0)
{
if(Page==0)
{
AT24C02_Pag_Write(address,data,size);
Delay();//此函數(shù)沒有定義 需要自己定義 大約延時2000us
}
else
{
while(Page--)
{
AT24C02_Pag_Write(address,data,8);
Delay();
address+=8;
data+=8;
}
if(Cont!=0)
{
AT24C02_Pag_Write(address,data,Cont);
Delay(2000);
}
}
}
else
{
if(Page==0)
{
if(Sur>=size)
{
AT24C02_Pag_Write(address,data,size);
Delay;
}
else
{
AT24C02_Pag_Write(address,data,Sur);
Delay;
address+=Sur;
data+=Sur;
AT24C02_Pag_Write(address,data,size-Sur) ;
Delay;
}
}
else
{
AT24C02_Pag_Write(address,data,Sur);
Delay(2000);
address+=Sur;
data+=Sur;
Page=size/8;
Cont=size%8;
Add_Page=address%8;
Sur=8-Add_Page;
if(Page==0)//
{
AT24C02_Pag_Write(address,data,size);
Delay(2000);
}
else//
{
while(Page--)
{
AT24C02_Pag_Write(address,data,8);
Delay(2000);
address+=8;
data+=8;
}
if(Cont!=0)
{
AT24C02_Pag_Write(address,data,Cont);
Delay(2000);
}
}
}
}
}
uint8_t AT24C02_Read(uint8_t address,uint8_t *data,uint8_t size)//從AT24C02讀取size個字節(jié) 第一個參數(shù)是 讀AT24C02 的數(shù)據(jù)的首地址 第二個參數(shù)是 緩沖區(qū)指針 第三個參數(shù)是 要讀取的字節(jié)數(shù)
{
uint8_t i;
IIC_Start();
IIC_Send_Byte(0xa0);
if(Wait_Ack())
{
IIC_Stop();
return 0;
}
IIC_Send_Byte(address)
if(Wait_Ack())
{
IIC_Stop();
return 0;
}
IIC_Start();
IIC_Send_Byte(0xa1);
if(Wait_Ack())
{
IIC_Stop();
return 0;
}
for(i=0;i<size;i++)
{
*(data+i)=IIC_Read_Byte();
if(i!=size-1)
{
Ack();
}
else
{
NAck();
}
}
IIC_Stop();
return 1;
}
復(fù)制代碼
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1