📄 24c04.c
字号:
#include"AT24C04.h"
bit flag3;
unsigned int ucReceData;
void delay(void);
void ACK();
void NoACK();
/**************************************************************/
void delay(void)
{
unsigned int i;
for(i=100;i>0;i--)
_nop_();
}
/*********************************************************
**名称:I2C_Start
**功能:启动I2C
**输入:无
**返回:无
*********************************************************/
void I2C_Start()
{
SDA=1;
delay();
SCL=1;
delay();
SDA=0;
delay();
SCL=0; //钳位I2C总线,准备发送数据
}
/**********************************************************
**名称:I2C_Stop
**功能:停止I2C
**输入:无
**返回:无
**********************************************************/
void I2C_Stop()
{
SDA=0;
delay();
SCL=1;
delay();
SDA=1;
delay();
}
/**********************************************************
**名称:Ack
**功能:应答信号
**输入:无
**返回:无
**********************************************************/
void Ack()
{
SDA=0;
delay();
SCL=1;
delay();
SCL=0;
delay();
SDA=1;
delay();
}
/********************************************************
**名称:NoAck
**功能:发送非应答信号
**输入:无
**返回:无
********************************************************/
void NoAck()
{
SDA=1;
delay();
SCL=1;
delay();
SCL=0;
delay();
SDA=0;
delay();
}
/********************************************************
**名称:Test_Ack()
**功能:检测应答位
**输入:无
**返回:flag3,有应答时flag3为0,无应答时flag3为1
*********************************************************/
bit Test_Ack()
{
SCL=0;
SDA=1;//读入数据
_nop_();_nop_();_nop_();_nop_();
SCL=1;
_nop_();_nop_();_nop_();_nop_();
if(SDA==0)
flag3=1;
else flag3=0;
SCL=0;
return(flag3);
}
/********************************************************
**名称:SendData()
**功能:发送一字节数据
**输入:buffer
**返回:
*******************************************************/
void SendData(unsigned int buffer)
{
unsigned int BitCnt=8;//一字节8位
unsigned int temp=0;
do
{
temp=buffer;
SCL=0;
delay();
if((temp&0x80)==0) //判断最高位是0还是1
SDA=0;
else
SDA=1;
delay();
SCL=1;
temp=_crol_(buffer,1);//将buffer中的数据左移一位
buffer=temp;
BitCnt--;
}
while(BitCnt);
SCL=0;
}
/**************************************************************
**名称:unsigned intReceiveData()
**功能:接收一字节数据
**输入:
**返回:ucReceData
**说明:将接收的数据存放在ucReceData中
**************************************************************/
unsigned int ReceiveData()
{
unsigned int BitCnt=8;
unsigned int temp=0;
SDA=1;//读入数据
do
{
SCL=0;
delay();
SCL=1;
delay();
if(SDA==1)
ucReceData=ucReceData|0x01; //低位置1
else
ucReceData=ucReceData&0x0fe; //低位清0
if(BitCnt-1)
{
temp=_crol_(ucReceData,1); //数据左移一位
ucReceData=temp;
}
BitCnt--;
}
while(BitCnt);
SCL=0;
return(ucReceData);
}
/*************************************************************
**名称:bit WriteNByte()
**功能:主机向24C02中写入多字节数据
**输入:
**返回:
**说明:sla-器件地址 suba-数据地址,*s-写入的数据,n-写入的字节数(n<=8)
**************************************************************/
bit WriteNByte(unsigned int sla,unsigned int suba,unsigned char *s,unsigned int n)
{
unsigned int i;
I2C_Start();//启动I2C
SendData(sla);//发送器件地址
Test_Ack();
if(flag3==0) return(0);
SendData(suba);
Test_Ack();
if(flag3==0) return(0);
for(i=0;i<n;i++)//写入8字节数据
{
SendData(*(s+i));
Test_Ack();
if(flag3==0) return(0);
}
I2C_Stop();
return(1);
}
/*************************************************************
**名称:bit ReadNByte()
**功能:主机从24C02中读出N字节数据(n<=8)
**输入:
**返回:
**说明:随机地址读操作
**************************************************************/
bit ReadNByte(unsigned int sla,unsigned int suba,unsigned char *p,unsigned int n)
{
unsigned int i;
I2C_Start();//启动I2C
SendData(sla);//发送器件地址
Test_Ack();
if(flag3==0) return(0);
SendData(suba);//发送器件内部地址
Test_Ack();
if(flag3==0) return(0);
I2C_Start();
SendData(sla+1);
Test_Ack();
if(flag3==0) return(0);
for(i=0;i<n-1;i++)//读取字节数据
{
*(p+i)=ReceiveData();//读取数据
ACK();
}
*(p+n-1)=ReceiveData();
//*(p+n)='\0';
NoACK();
I2C_Stop();
return(1);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -