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