📄 cf.h
字号:
unsigned char xdata CF_DATA_REG _at_ 0x8000;
unsigned char xdata CF_ERROR_REG _at_ 0x8100;
unsigned char xdata CF_FEATURE_REG _at_ 0x8100;
unsigned char xdata CF_SECTOR_COUNT_REG _at_ 0x8200;
unsigned char xdata CF_SECTOR_REG _at_ 0x8300;
unsigned char xdata CF_LBA_0_7_REG _at_ 0x8300;
unsigned char xdata CF_CYLINDER_L_REG _at_ 0x8400;
unsigned char xdata CF_LBA_8_15_REG _at_ 0x8400;
unsigned char xdata CF_CYLINDER_H_REG _at_ 0x8500;
unsigned char xdata CF_LBA_16_23_REG _at_ 0x8500;
unsigned char xdata CF_HEAD_REG _at_ 0x8600;
unsigned char xdata CF_LBA_24_27_REG _at_ 0x8600;
unsigned char xdata CF_DRIVER_REG _at_ 0x8600;
unsigned char xdata CF_STATUS_REG _at_ 0x8700;
unsigned char xdata CF_COMMAND_REG _at_ 0x8700;
#define CF_CMD_DIAGNOSTIC 0x90 //诊断
#define CF_CMD_IDENTITY 0xec //读CF卡信息
#define CF_CMD_READSECTOR 0x20 //读扇区
#define CF_CMD_SETFEATURE 0xef //设置特性
#define CF_CMD_SLEEP 0x99 //进入Sleep模式(省电)
#define CF_CMD_STANDBY 0x96 //进入Standby模式
#define CF_CMD_WRITESECTOR 0x30 //写扇区
#define CF_LBA_MASTER 0xe0
#define CF_LBA_SLAVE 0xf0
#define loop_until_bit_is_clear(X,Y) while(X&(1<<Y))
#define loop_until_bit_is_set(X,Y) while(!(X&(1<<Y)))
#define sbi(X,Y) X|=(1<<Y)
#define cbi(X,Y) X&=(~(1<<Y))
unsigned char CF_Initialize()
{
CF_COMMAND_REG=CF_CMD_DIAGNOSTIC; //执行诊断指令,判断CF卡是否可用
loop_until_bit_is_clear(CF_STATUS_REG,7); //等待BUSY位清空
if(CF_ERROR_REG==0x01) //返回0x01表示成功
{
CF_FEATURE_REG=0x01;
CF_DRIVER_REG=0xa0;
CF_COMMAND_REG=CF_CMD_SETFEATURE; //设置驱动器特性
loop_until_bit_is_clear(CF_STATUS_REG,7);
return CF_ERROR_REG;
}
else
return CF_ERROR_REG;
}
void CF_ChangeDrive(unsigned char d)
{
if(d)
sbi(CF_DRIVER_REG,4); //从盘
else
cbi(CF_DRIVER_REG,4); //主盘
}
unsigned char CF_LBAReadSector(unsigned long LBA,unsigned char *buf)
{
unsigned char i=0;
sbi(CF_DRIVER_REG,6); //以LBA方式访问
CF_SECTOR_COUNT_REG=1;
CF_SECTOR_REG=(LBA&0xff); /*要求读写的开始扇区号低字节*/
CF_CYLINDER_L_REG=((LBA&0xffff)>>8); /*要求读写的开始扇区号中间字节*/
CF_CYLINDER_H_REG=(LBA>>16); /*要求读定的开始扇区号高字节*/
CF_COMMAND_REG=CF_CMD_READSECTOR;
loop_until_bit_is_clear(CF_STATUS_REG,7);
if(CF_ERROR_REG) return CF_ERROR_REG;
else
{
loop_until_bit_is_set(CF_STATUS_REG,3);
do
{
*(buf++)=CF_DATA_REG;
*(buf++)=CF_DATA_REG;
}while(--i);
return 0;
}
}
unsigned char CF_LBAWriteSector(unsigned long LBA,char *buf)
{
unsigned char i = 0;
sbi(CF_DRIVER_REG, 6);
CF_SECTOR_COUNT_REG=1;
CF_SECTOR_REG=(LBA&0xff); /*要求读写的开始扇区号低字节*/
CF_CYLINDER_L_REG=((LBA&0xffff)>>8); /*要求读写的开始扇区号中间字节*/
CF_CYLINDER_H_REG=(LBA>>16); /*要求读定的开始扇区号高字节*/
CF_COMMAND_REG=CF_CMD_WRITESECTOR;
loop_until_bit_is_clear(CF_STATUS_REG,7);
if(CF_ERROR_REG)
return CF_ERROR_REG;
else
{
loop_until_bit_is_set(CF_STATUS_REG, 3);
do
{
CF_DATA_REG=*(buf ++);
CF_DATA_REG=*(buf ++);
}while(--i);
loop_until_bit_is_clear(CF_STATUS_REG, 7);
return CF_ERROR_REG;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -