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

📄 24c512.c

📁 24C512的驱动程序
💻 C
字号:
#include "global.h"
#include "LzmaUn.h"




void IicStart(void)					//IIC启动信号				
{
	DWORD 	i;	
	
	for(i=0 ; i<IIC_DELAY ; i++);
	SetSCL(CF_512);
	for(i=0 ; i<IIC_DELAY ; i++);
	SetSDAIN(CF_512);
	for(i=0 ; i<IIC_DELAY ; i++);
	ClrSDAIN(CF_512);	
	for(i=0 ; i<IIC_DELAY ; i++);
	ClrSCL(CF_512);
}//void IicStart(void)

void IicStop(void)					//IIC停止信号
{
	DWORD	i;	

	for(i=0 ; i<IIC_DELAY ; i++);
	ClrSDAIN(CF_512);
	for(i=0 ; i<IIC_DELAY ; i++);
	SetSCL(CF_512);
	for(i=0 ; i<IIC_DELAY ; i++);
	SetSDAIN(CF_512);	
	for(i=0 ; i<IIC_DELAY ; i++);
	ClrSCL(CF_512);
}//void IicStop(void)



BYTE WriteByteToIic(BYTE Data)		//写入一个字节给IIC
{
	DWORD 	i, j;
	
	for(j=0;j<8;j++)
	{
		for(i=0 ; i<IIC_DELAY ; i++);
		if( Data & 0x80 )
			SetSDAIN(CF_512);
		else
			ClrSDAIN(CF_512);
		for(i=0 ; i<IIC_DELAY ; i++);
		SetSCL(CF_512);			// 上升沿把数值送进去
		for(i=0 ; i<IIC_DELAY ; i++);
		ClrSCL(CF_512);
		Data <<= 1;
	}	
	for(i=0 ; i<IIC_DELAY ; i++);
	SetSDAIN(CF_512);	
					
	ReadEnable();					//ACK(要切换到读取的状态)
	for(i=0 ; i<IIC_DELAY ; i++);
	SetSCL(CF_512);
	for(i=0 ; i<IIC_DELAY ; i++);
	i = SDAOut(CF_512);
	ClrSCL(CF_512);
	WriteEnable();
	if( i )
		return FALSE;
	else
		return TRUE;
}//BYTE WriteByteToIic(BYTE WriteData)




BYTE ReadByteFromIic(void)		//从IIC读取一个字节
{
	BYTE 	Data = 0;
	DWORD 	i , j;
	
	for(j=8 ; j>0 ; j--)
	{
		for(i=0 ; i<IIC_DELAY ; i++);
		Data <<=1;
		//Iic_Sda = 1;
		for(i=0 ; i<IIC_DELAY ; i++);
		SetSCL(CF_512);
		for(i=0 ; i<IIC_DELAY ; i++);
		Data |= SDAOut(CF_512);
		for(i=0 ; i<IIC_DELAY ; i++);
		ClrSCL(CF_512);			//下降沿把数值送出来
	}
	return Data;
}//BYTE ReadByteFromIic(void)
//**************************************//



//一次最多只能采用页读取		
BYTE Read24C512(BYTE IC_Select,WORD ReadAddr,BYTE ReadNo,BYTE *buf)
{	
	BYTE 	IICHead[4];
	WORD	i, j; 		
	
	if(IC_Select == 0)							//CF卡1
	{
		CF_512 = 0;
		IICHead[0] = 0xa0;						//CF卡写操作
		IICHead[3] = 0xa1;						//CF卡读操作	
	}
	else if(IC_Select == 1)						//CF卡2
	{
		CF_512 = 0;
		IICHead[0] = 0xa2;						//CF卡写操作
		IICHead[3] = 0xa3;						//CF卡读操作	
	}
	else if(IC_Select == 2)						//FLASH512_1
	{
		CF_512 = 1;
		IICHead[0] = 0xa0;						//FLASH512_1写操作
		IICHead[3] = 0xa1;						//FLASH512_1读操作
	}	
	else if(IC_Select == 3)						//FLASH512_2
	{
		CF_512 = 1;
		IICHead[0] = 0xa2;						//FLASH512_2写操作
		IICHead[3] = 0xa3;						//FLASH512_2读操作	
	}	
	IICHead[1] = (ReadAddr>>8);				//高8位地址
	IICHead[2] = ReadAddr;					//低8位地址
	
	
	WriteAble(CF_512);						//打开写允许引脚
	WriteEnable();								//切换输出/输入功能
	
	IicStart();									//IIC启动信号
		
	for(i=0;i<3;i++)
	{
		if( WriteByteToIic(IICHead[i]) == FALSE )	//写入IIC的头
		{
			IicStop();			
			return FALSE;	
		}
	}
	
	IicStart();	
	
	if( WriteByteToIic(IICHead[3]) == FALSE )		//写入IIC的头
	{
		IicStop();		
		return FALSE;
	}

	for(i=0;i<ReadNo;i++)
	{	
		ReadEnable();
		buf[i] = ReadByteFromIic();				//读取数据
		for(j=IIC_DELAY;j>0;j--);
		WriteEnable();	
		if( i == ReadNo - 1 )
			SetSDAIN(CF_512);
		else
			ClrSDAIN(CF_512);				//ACK或者NO_ACK
		for(j=IIC_DELAY;j>0;j--);
		SetSCL(CF_512);
		for(j=IIC_DELAY;j>0;j--);
		ClrSCL(CF_512);
	}
	IicStop();									//停止信号
	WriteDisable(CF_512);						//关闭写允许引脚
	return TRUE;
}//BYTE Read24C512(WORD ReadAddr,BYTE ReadNo,BYTE *buf)  



//一次最多只能是页写入	
BYTE Write24C512(BYTE IC_Select,WORD WriteAddr,BYTE WriteNo,BYTE *buf)
{
	BYTE 	IICHead[3];	
	WORD	i;
	
	if(IC_Select == 0)							//CF卡
	{
		CF_512 = 0;
		IICHead[0] = 0xa0;						//CF卡写操作
	}
	else if(IC_Select == 1)						//CF卡2
	{
		CF_512 = 0;
		IICHead[0] = 0xa2;						//CF卡写操作		
	}
	else if(IC_Select == 2)						//FLASH512_1
	{
		CF_512 = 1;
		IICHead[0] = 0xa0;						//FLASH512_1写操作
	}	
	else if(IC_Select == 3)						//FLASH512_2
	{
		CF_512 = 1;
		IICHead[0] = 0xa2;						//FLASH512_2写操作
	}	
	IICHead[1] = (WriteAddr>>8);				//高8位地址
	IICHead[2] = WriteAddr;					//低8位地址
	
	WriteAble(CF_512);						//打开写允许引脚
	WriteEnable();								//切换输入/输出	
	
	IicStart();									//IIC启动信号
		
	for(i=0;i<3;i++)
	{
		if( WriteByteToIic(IICHead[i]) == FALSE )	//写入IIC的头
		{
			IicStop();			
			return FALSE;	
		}
	}
	
	for(i=0;i<WriteNo;i++)
	{
		if( WriteByteToIic(buf[i]) == FALSE )		//写入数据
		{
			IicStop();			
			return FALSE;	
		}
	}
	IicStop();									//停止信号
	Delayms(50);								//延时20ms,IIC进入内部写	
	WriteDisable(CF_512);						//关闭写允许引脚
	return TRUE;
}//BYTE Write24C512(WORD WriteAddr,BYTE WriteNo,BYTE *buf)


void ReadEnable(void)				//把SDA线设置为输入
{
	EERPOM_512_Input();	
	EERPOM_CF_Input();
}//void ReadEnable(void)



void WriteEnable(void)				//把SDA线设置为输出
{
	EERPOM_512_Output();	
	EERPOM_CF_Output();
}//void ReadEnable(void)



//指定地址,读取IIC的多个数据
BYTE RWMultiEEPROMData(BYTE r_w,DWORD WriteAddr,DWORD WriteNo,BYTE *temp)
{
	BYTE		bIC_Select,bNumber;	
	DWORD		i,AddrTemp;		

	if( WriteAddr%BYTE512 != 0 )
		return FALSE;
				
	for(i=0 ; i<(WriteNo/BYTE512)+1 ; i++)					//读取整数页地址
	{	
		CplWatchDog();
												
		if(i == WriteNo/BYTE512)						//检查整页的余数
			bNumber = WriteNo%BYTE512;
		else
			bNumber = BYTE512;
			
		if(bNumber == 0)								//判断是否已经全部写完
			break;						
													//512_1地址范围
		if( WriteAddr<=END_ADDR_512_1 )
		{			
			bIC_Select = FLASH512_1;					//512_2地址范围
			AddrTemp = START_ADDR_512_1;
		}	
		else if( WriteAddr>=START_ADDR_512_2 && WriteAddr<=END_ADDR_512_2)
		{		
			bIC_Select = FLASH512_2;					//CF_1地址范围
			AddrTemp = START_ADDR_512_2;
		}	
		else if( WriteAddr>=START_ADDR_CF_1 && WriteAddr<=END_ADDR_CF_1)	
		{
			bIC_Select = CF_CARD_1;					//CF_2地址范围
			AddrTemp = START_ADDR_CF_1;
		}
		else if( WriteAddr>=START_ADDR_CF_2 && WriteAddr<=END_ADDR_CF_2)	
		{
			bIC_Select = CF_CARD_2;	
			AddrTemp = START_ADDR_CF_2;
		}
		else
			return FALSE;
		
		if(r_w == CMD_WRITE)		//写入操作
		{											//写入数据,一次读取128字节
			if(Write24C512(bIC_Select,(WriteAddr - AddrTemp),bNumber,(temp+i*BYTE512)) == FALSE)	
				return FALSE;
		}		
		else if(r_w == CMD_READ)	//读取操作		
		{
													//写入数据,一次读取128字节
			if(Read24C512(bIC_Select,(WriteAddr - AddrTemp),bNumber,(temp+i*BYTE512)) == FALSE)	
				return FALSE;	
		}
		
		WriteAddr +=128;								//地址增加			
		Delayms(1);	
					 
		Copy_Course += bNumber;						//处理读取写入数据百分数	
		if(Copy_Course >= Total_Course)
			Copy_Course -=1;		
		CheckTimer5();								//检查系统时钟
		Uart0_CheckCommData();						//检查通讯命令	
	}
	return TRUE;
}//BYTE RWMultiEEPROMData(BYTE R_W,WORD WriteAddr,WORD WriteNo,BYTE *buf)








⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -