📄 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 + -