📄 cat24cx1.c.bak
字号:
//************************cat24cx1 IIC模拟协议******************
//COPY RIGHT BY HUOYAN TECH
//WRITE BY MATRIX
//FINISH:19 DEC
//mcu :at89s51
//晶振为11.0592MHz,如有变更请根据具体情况修改延时时间
//数据类型定义
uchar unsigned char;
bit ack; //应答标志
// 引脚定义
//SDA=
//SCL=
// 函数定义
void IIC_Start(void); // start
void IIC_Wait(void); // wait
void IIC_Stop(void); // stop
void Send_Ack(bit ack);
void IIC_Write(uchar c);//写入一字节数据
bit IIC_WriteByte(uchar sla,uchar c);
bit IIC_WriteNBytes(uchar sla,uchar suba,uchar *s,uchar n);
uchar IIC_Read(void); // 读数据
bit IIC_ReadByte(uchar sla,uchar *c);
bit IIC_ReadNBytes(uchar sla,uchar suba,uchar *s,uchar n);
void ResetDog(void); // 在1.6s内要产生一个电平变化喂狗
//wait function
void IIC_Wait(void)
{
_nop_();
_nop_();
_nop_();
_nop_();
}
//start condidion
//当SCL为高时,SDA由高到低,开始,然后SCL到低
void IIC_Start(void)
{
SDA = 1;
SCL = 1;
IIC_Wait();
SDA = 0;
IIC_Wait();
SCL = 0;
}
//stop condition
//当SCL为高时,SDA由低到高
void IIC_Stop(void)
{
SDA = 0;
SCL=1;
IIC_Wait();
SDA = 1;
IIC_Wait();
SCL = 0;
}
//send ack(1 or 0) to slave device:ACK=0.NON-ACK=1
//应答信号,ack=0为应答,1为非应答
void Send_Ack(bit ack)
{
SDA = ack;
SCL = 1;
IIC_Wait();
SCL = 0;
SDA=~ack;
}
//send one byte
//写入一字节数据
//功能:将数据c发出,可以是地址也可以是数据,发完后等待应答,
//并对此状态位进行操作(不应答或非应答都使ack=0),如果发送正常
//则ack=1,如果ack=0表明被控器无应答或损坏
void IIC_Write(uchar c)
{
uchar BitCnt;
for(BitCnt=0;BitCnt<8;BitCnt++) //传送一个8位字节
{
if((c<<BitCnt)&0x80) //判断发送位
SDA=1;
else
SDA=0;
_nop_();
SCL=1; //置时钟线高电平,通知从器件开始接收数据位
IIC_Wait();
SCL=0;
}
_nop_();
_nop_();
SDA=1; //8位数据位发送完,释放数据线,准备接受应答位
_nop_();
_nop_();
SCL=1;
_nop_();
_nop_();
_nop_();
if(SDA==1)ack=0
else ack=1; //判断是否接收到应答信号
SCL=0;
_nop_();
_nop_();
}
//字节数据接收
//接收从器件传来的数据并判断总线错误(不发应答信号)
//发完后用应答函数
uchar IIC_Read(void)
{
uchar retc,BitCnt;
retc=0;
SDA=1; //置数据线为输入方式
for(BitCnt=0;BitCnt<8;BitCnt++)
{
_nop_();
SCL=0; //置时钟线为低,准备接收数据
IIC_Wait();
SCL=1; //置时钟线高电平,通知从器件开始接收数据位
_nop_();
_nop_();
retc=retc<<1;
if(SDA=1)
retc=retc+1; //接收的数据位放入retc中
_nop_();
_nop_();
}
SCL=0; //置时钟线为低,准备接收数据
_nop_();
_nop_();
return(retc);
}
//向从器件写1字节数据
//启动总线-发送地址-数据-结束总线
//从器件地址为sla。返回1表示操作成功,否则为失败
bit IIC_WriteByte(uchar sla,uchar c)
{
IIC_Start(); //启动总线
IIC_Write(sla); //发送器件地址
if(ack==0)
return(0);//无应答,返回0
IIC_Write(C); //发送数据
if(ack==0)
return(0);//无应答,返回0
IIC_Stop(); //结束总线
return(1);
}
//向从器件写n字节数据
//启动总线-发送地址-子地址-数据-结束总线
//从器件地址为sla,子地址为suba,发送内容为指针s指向的内容,发送n个字节。
//返回1表示操作成功,否则为失败
bit IIC_WriteNBytes(uchar sla,uchar suba,uchar *s,uchar n)
{
uchar i;
IIC_Start(); //启动总线
IIC_Write(sla); //发送器件地址
if(ack==0)
return(0);//无应答,返回0
IIC_Write(suba); //发送器件子地址
if(ack==0)
return(0);//无应答,返回0
for(i=0;i<n;i++)
{
IIC_Write(*s); //发送数据
if(ack==0)
return(0);//无应答,返回0
s++;
}
IIC_Stop(); //结束总线
return(1);
}
//向从器件读1字节数据
//启动总线-发送地址-数据-结束总线
//从器件地址为sla,返回值保存在c。
//返回1表示操作成功,否则为失败
bit IIC_ReadByte(uchar sla,uchar *c)
{
IIC_Start(); //启动总线
IIC_Write(sla+1); //发送器件地址
if(ack==0)
return(0);//无应答,返回0
*c=IIC_Read(); //读取数据
Send_Ack(1); //发送非应答位
IIC_Stop(); //结束总线
return(1);
}
//向从器件读n字节数据
//启动总线-发送地址-子地址-数据-结束总线
//从器件地址为sla,子地址为suba,读内容放到指针s,读n个字节。
//返回1表示操作成功,否则为失败
bit IIC_ReadNBytes(uchar sla,uchar suba,uchar *s,uchar n)
{
uchar i;
IIC_Start(); //启动总线
IIC_Write(sla); //发送器件地址
if(ack==0)
return(0);//无应答,返回0
IIC_Write(suba); //发送器件子地址
if(ack==0)
return(0);//无应答,返回0
IIC_Start();
IIC_Write(sla+1); //发送器件地址
if(ack==0)
return(0);//无应答,返回0
for(i=0;i<n-1;i++)
{
*s=IIC_Read();
Send_Ack(0); //发送应答位
s++;
}
*s=IIC_Read();
Send_Ack(1); //发送非应答位
IIC_Stop();
return(1);
}
// 复位看门狗
void ResetDog(void)
{
SDA=0;
_NOP_();
SDA=1;
}
//////////////////////////////////////////////////////////////////////////////////////////
//FILE END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -