⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cat24cx1.c.bak

📁 这是cat24cx1 IIC模拟协议 可以作为iic和eeprom函数 //mcu :at89s51 //晶振为11.0592MHz,如有变更请根据具体情况修改延时时间
💻 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 + -