?? i2c.c
字號:
#include "i2c.h"
/*I2C總線初始化程序*/
/*延時函數*/
void delay(void)
{
;
}
/*停止信號函數*/
void I_stop(void)
{
SDA=0; delay( );
SCL=1; delay( );
SDA=1; delay( );
}
/*起始信號函數*/
void I_start(void)
{
SCL=1; delay( );
SDA=0; delay( );
SCL=0; delay( );
}
void I_init(void)
{
SCL=0;
I_stop();
}
/*提供i2c總線的時鐘信號并返回在時鐘電平為高期間SDA信號線上的狀態*/
bit I_clock(void)reentrant
{
bit idata sample;
SCL =1;
delay( );
sample=SDA;
SCL =0;
delay( );
return(sample);
}
/*應答信號函數*/
void I_ACK(void)
{
SDA=0;
I_clock();
SDA=1;
}
/*時鐘信號函數*/
/*數據發送函數*/
/*向I2C總線發送8位數據,并請求一個應答信號ACK,如果收到ACK應答,表示發送成功,并返回1*/
bit I_send(uchar I_data)
{
register uchar send_num;
for(send_num=0;send_num<8;send_num++)
{
SDA=(bit)(I_data&0x80);
I_data=I_data<<1;
I_clock( );
}
SDA=1;
return (~I_clock());
}
/*數據接收函數*/
/*從I2C總線上接收8位數據,將接收到的數據作為1個字節返回值*/
uchar I_receive(void)
{
register uchar rec_num;
uchar I_data=0;
for(rec_num=0;rec_num<8;rec_num++)
{
I_data*=2;
if(I_clock()) I_data++;
}
return(I_data);
}
/* 器件從地址和片內地址寫入函數發出起始信號后,若地址寫入成功
則返回1,否則返回0*///
bit W_address(uchar wpage, uchar WStAddress)
{
I_start( );
if(I_send(wpage))
{
return(I_send(WStAddress));
}
else
return(0);
}
////////////////////////////////////////////////////////////////////
/*5ms延時函數*/
/*void wait_5ms(void)
{
register int i;
for(i=0;i<1000;i++)
{; }
} */
void wait_1ms(void)
{
register int i;
for(i=0;i<100;i++)
{; }
}
////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////
bit Wblock(uchar wpage, uchar WSAdd , uchar *StartChar, uchar length)reentrant
{
register uchar Wnum;
////////////////////////////////////////////////////////////////////
/*將映象數組中前length個字節數據寫入24C16A的StartAddress前length個單元*/
I_init();
if (W_address(wpage,WSAdd))
{
for(Wnum=0;Wnum<length;Wnum++)
{
if(I_send(StartChar[Wnum])) ;
else
{
I_stop();
return 0 ;
}
}
I_stop();
return 1;
}
I_stop();
return 0 ;
}
////////////////////////////////////////////////////////////////////
void W_block(uchar wpage, uchar WSAdd, uchar *StartChar, uchar length)reentrant
{
register uchar i;
uchar addr=0,nextchar=0,len=0;
if((length%16)==0)
{
len=length/16;
for(i=0;i<len;i++)
{
Wblock(wpage, WSAdd+addr ,&StartChar[nextchar],16);
nextchar+=16;
addr+=16;
wait_1ms();
}
}
else
{
len=(length/16)+1;
for(i=0;i<len;i++)
{
if(i==(len-1))
{
Wblock(wpage, WSAdd+addr ,&StartChar[nextchar],length%16);
wait_1ms();
}
else
{
Wblock(wpage, WSAdd+addr ,&StartChar[nextchar],16);
nextchar+=16;
addr+=16;
wait_1ms();
}
}
}
}
////////////////////////////////////////////////////////////////////
/*將映象數組中前length個字節數據寫入24C16A的前length個單元*/
bit R_block(uchar wpage,uchar rpage, uchar RStAddress, uchar StartChar[], uchar length)reentrant
{
register uchar Rnum;
I_init();
if (W_address(wpage,RStAddress))
{
I_start();
if (I_send(rpage))
{
for( Rnum=0;Rnum<length ;Rnum++)
{
StartChar[Rnum]=I_receive();
if (Rnum < (length-1)) I_ACK();
}
I_stop();
return 1;
}
}
I_stop();
return 0 ;
}
////////////////////////////////////////////////////////////////////
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -