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

📄 memory card.c

📁 AVR读写CF卡的应用例子
💻 C
字号:
#include <atmega128.h>
#include <ina90.h>
#include <string.h>
#include <__debug_stdio.h>

#include "delays.h"
#include "compactflash.h"
#include "memory card.h"

#define	make16(varhigh,varlow)	(((unsigned int)varhigh & 0xFF)* 0x100) + ((unsigned int)varlow & 0x00FF)

static unsigned char driveNumber=0;
static unsigned int sector[256];

void waitWhileBusy(unsigned int registerNo)
{
	while(rd_cf_io8(registerNo)&BUSY);
}

unsigned char sendCommand(unsigned char cmd, unsigned char drive,unsigned long address,unsigned char nSectors)
{
	unsigned char status;

	waitWhileBusy(STATUS);
	wr_cf_io8(0xe0|(drive*DRIVE_NO)|(0xf&(address>>24)),DRIVE_HEAD);
        wr_cf_io8(0xff&(address>>16),CYLINDER_HI);
        wr_cf_io8(0xff&(address>>8),CYLINDER_LO);
        wr_cf_io8(0xff&address,SECTOR_NO);
        wr_cf_io8(nSectors,SECTOR_CNT);
        wr_cf_io8(cmd,COMMAND);
        Delay10TCYx(1);
	waitWhileBusy(STATUS);
	
        status=rd_cf_io8(STATUS);
        if(status&ERROR) return rd_cf_io8(ERROR_REG);
        else return 0;
}



unsigned char writeSector(unsigned long address)
{
  unsigned int i;

  if(sendCommand(WRITE_SECTOR,driveNumber,address,1)) return 1;
  for(i=0;i<256;i++) 
  {
    wr_cf_io8(sector[i]&0xff,WR_DATA);
    wr_cf_io8((sector[i]>>8)&0xff,WR_DATA);
    
  }
  return 0;
}

unsigned char readSector(unsigned long address)
{
  unsigned int i;

  if(sendCommand(READ_SECTOR,driveNumber,address,1)) return 1;
  for(i=0;i<256;i++) sector[i]=make16(rd_cf_io8(RD_DATA),rd_cf_io8(RD_DATA));
  return 0;
}

unsigned char getDriveNumber(void)
{
  driveNumber=0x1&(rd_cf_reg(SOCKET_COPY)>>4);
  return driveNumber;
}

void setDriveNumber(unsigned char n)
{
  driveNumber=n;
  wr_cf_reg((0xef&rd_cf_reg(SOCKET_COPY))|((n&1)<<4),SOCKET_COPY);
}

void setOperatingMode(unsigned char mode)
{
  unsigned int corcon;
  unsigned char corData;

  corcon=getCORCONAddress();
  corData = rd_cf_reg(corcon);
  Delay10KTCYx(2);
  wr_cf_reg(mode|(corData&0xe0),corcon);
  Delay10KTCYx(10);
  while(!(rd_cf_io8(STATUS)&READY));
}

unsigned long initMemoryCard(void)
{
  unsigned int i;

  getDriveNumber();
  printf("Drive number is %i\n",driveNumber);
  setOperatingMode(IO_MAPPED);

  if(sendCommand(IDENTIFY_DRIVE,driveNumber,0,0)) return 0;
  for(i=0;i<256;i++) sector[i]=make16(rd_cf_io8(RD_DATA),rd_cf_io8(RD_DATA));
  
  return (((unsigned long)sector[7])<<16)|sector[8]; // number of sectors on card
}
    

unsigned char getByteFromSector(unsigned int i)
{
  return (i&1) ?  0xff&sector[i>>1] : 0xff&(sector[i>>1]>>8);
}

void setByteInSector(unsigned int i,unsigned char byte)
{
  sector[i>>1] = (i&1) ? (sector[i>>1]&0xff00)|byte : (sector[i>>1]&0x00ff)|(byte<<8);
}

⌨️ 快捷键说明

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