欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標題:
AT24C02 IIC驅動 C代碼
[打印本頁]
作者:
xiaos
時間:
2015-4-10 17:26
標題:
AT24C02 IIC驅動 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函數
{
SDA_H;
SCL_H;
Wait;
SDA_L;
Wait;
SCL_L;
Wait;
}
void IIC_Stop(void)//停止IIC函數
{
SDA_L;
SCL_H;
Wait;
SDA_H;
}
void IIC_Send_Byte(uint8_t data)//想IIC器件發送8個位數據
{
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位數據
{
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)//等待應答
{
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)//發送應答
{
SDA_L;
Wait;
SCL_H;
Wait;
SCL_L;
Wait;
SDA_H;
}
void NAck(void)//發送非應答
{
SDA_H;
Wait;
SCL_H;
Wait;
SCL_L;
Wait;
}
uint8_t AT24C02_Pag_Write(uint8_t address,uint8_t *data,uint8_t size)//AT24C02寫數據函數 第一個參數是 AT24C02的要寫頁的地址 0-255,第二個參數是 緩沖區指針,第三個參數是 要寫的字節數//不能超過8個字節
{
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的地址進行寫操作 其中第一個參數是 AT24C02要寫的地址 第二個參數是 緩沖區指針 第三個參數是 要寫的字節數 0-255;
{
uint8_t Page=0;//所需要的頁數
uint8_t Cont=0;//不足一頁的字節數
uint8_t Add_Pag=0;//某一頁已經寫了的字節數
uint8_t Sur=0;//某一頁還能寫的字節數
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();//此函數沒有定義 需要自己定義 大約延時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個字節 第一個參數是 讀AT24C02 的數據的首地址 第二個參數是 緩沖區指針 第三個參數是 要讀取的字節數
{
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;
}
復制代碼
歡迎光臨 (http://www.raoushi.com/bbs/)
Powered by Discuz! X3.1