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

📄 cf.h

📁 单片机读写大容量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 + -