亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? mmc.c

?? C8051控制器操作SD卡實現文件系統
?? C
字號:
/*-----------------------------------------------------------------------*/
/* MMC/SDC (in SPI mode) control module 				   */
/*-----------------------------------------------------------------------*/
#include "C8051F060.h"

#include <stdio.h>

#include "diskio.h"
//#include "Board.h"

#define CARD_WP_PIN
#define CARD_INS_PIN

sbit CARD_SELECT_PIN = P1 ^ 7;


/* MMC/SD command (in SPI) */
#define CMD0	(0x40+0)	/* GO_IDLE_STATE */
#define CMD1	(0x40+1)	/* SEND_OP_COND */
#define CMD9	(0x40+9)	/* SEND_CSD */
#define CMD10	(0x40+10)	/* SEND_CID */
#define CMD12	(0x40+12)	/* STOP_TRANSMISSION */
#define CMD17	(0x40+17)	/* READ_SINGLE_BLOCK */
#define CMD18	(0x40+18)	/* READ_MULTIPLE_BLOCK */
#define CMD24	(0x40+24)	/* WRITE_BLOCK */
#define CMD25	(0x40+25)	/* WRITE_MULTIPLE_BLOCK */
#define CMD58	(0x40+58)	/* READ_OCR */

#define ACMD13	(0xC0+13)	/* SD_STATUS (SDC) */
#define	ACMD23	(0xC0+23)	/* SET_WR_BLK_ERASE_COUNT (SDC) */
#define	ACMD41	(0xC0+41)	/* SEND_OP_COND (SDC) */

#define POWER_ON()
#define POWER_OFF()

static volatile
DSTATUS data Stat = STA_NOINIT;	/* Disk status */

static volatile
unsigned long xdata Timer;			/* 100Hz decrement timer */

static
BYTE data CardType;			/* b0:MMC, b1:SDv1, b2:SDv2, b3:Block addressing */
/*-----------------------------------------------------------------------*/
/* Module Private Functions 											 */
void SELECT()
{
	CARD_SELECT_PIN = 0; /* MMC CS = L */
}

void DESELECT()
{
	CARD_SELECT_PIN = 1; /* MMC CS = H */
}

static
BYTE MCU_SPI(BYTE outgoing)
{
	BYTE data Old_Page = SFRPAGE,incomming;

	SFRPAGE = SPI0_PAGE;

	SPI0DAT = outgoing;

	while (!SPIF);					//當SPI中斷為到,即數據為傳輸完時則循環等待.				
	SPIF = 0;	

	incomming = SPI0DAT; 

	SFRPAGE = Old_Page;

	return(incomming);
}

/*--------------------------------*/
/* Transmit a byte to MMC via SPI */
/* (Platform dependent) 		  */

static
void xmit_spi(BYTE dat)		//Send Byte
{
	MCU_SPI(dat);
}

/*---------------------------------*/
/* Receive a byte from MMC via SPI */
/* (Platform dependent) 		   */

static
BYTE rcvr_spi(void)			//Receive Byte
{
	return MCU_SPI(0xff);
}


static
void rcvr_spi_m(BYTE *dst)
{
	*dst = rcvr_spi();
}


/*---------------------*/
/* Wait for card ready */

static
BYTE wait_ready()
{
	BYTE data res;

	Timer = 5000;			/* Wait for ready in timeout of 500ms */
	rcvr_spi();
	do
	{
		res = rcvr_spi();
	}
	while ((res != 0xFF) && Timer--);

	return res;
}

/*--------------------------------*/
/* Receive a data packet from MMC */

extern
BOOL rcvr_datablock(BYTE *buff, /* Data buffer to store received data */
	BYTE data wc				/* Word count (0 means 256 words) */)
{
	BYTE token;

	Timer = 1000;
	do
	{
		/* Wait for data packet in timeout of 100ms */
		token = rcvr_spi();
	}
	while ((token == 0xFF) && Timer--);

	if (token != 0xFE)
	{
		return FALSE;
	}	/* If not valid data token, retutn with error */

	do
	{
		/* Receive the data block into buffer */
		rcvr_spi_m(buff++);
		rcvr_spi_m(buff++);
	}
	while (--wc);

	rcvr_spi();						/* Discard CRC */
	rcvr_spi();

	return TRUE;					/* Return with success */
}



/*---------------------------*/
/* Send a data packet to MMC */

#ifndef _READONLY
static
BOOL xmit_datablock(const BYTE *buff, /* 512 byte data block to be transmitted */
					BYTE data token			/* Data/Stop token */)
{
	BYTE resp, wc = 0;


	if (wait_ready() != 0xFF)
	{
		return FALSE;
	}

	xmit_spi(token);					/* Xmit data token */
	if (token != 0xFD)
	{
		/* Is data token */
		do
		{
			/* Xmit the 512 byte data block to MMC */
			xmit_spi(*buff++);
			xmit_spi(*buff++);
		}
		while (--wc);
		xmit_spi(0xFF);					/* CRC (Dummy) */
		xmit_spi(0xFF);
		resp = rcvr_spi();				/* Reveive data response */
		if ((resp & 0x1F) != 0x05)		/* If not accepted, return with error */
		{
			return FALSE;
		}
	}

	return TRUE;
}
#endif


/*------------------------------*/
/* Send a command packet to MMC */
extern
BYTE send_cmd(BYTE data cmd, /* Command byte */
	DWORD data arg		/* Argument */)
{
	BYTE data n, res;


	if (wait_ready() != 0xFF)
	{
		return 0xFF;
	}

	/* Send command packet */
	xmit_spi(cmd);						/* Command */
	xmit_spi((BYTE) (arg >> 24));		/* Argument[31..24] */
	xmit_spi((BYTE) (arg >> 16));		/* Argument[23..16] */
	xmit_spi((BYTE) (arg >> 8));			/* Argument[15..8] */
	xmit_spi((BYTE) arg);				/* Argument[7..0] */
	xmit_spi(0x95);						/* CRC (valid for only CMD0) */

	/* Receive command response */
	if (cmd == CMD12)
	{
		rcvr_spi();
	}		/* Skip a stuff byte when stop reading */
	n = 10;								/* Wait for a valid response in timeout of 10 attempts */
	do
	{
		res = rcvr_spi();
	}
	while ((res & 0x80) && --n);

	return res;			/* Return with the response value */
}




/*-----------------------------------------------------------------------*/
/* Public Functions 													 */


/*-----------------------*/
/* Initialize Disk Drive */
/* (Platform dependent)  */

DSTATUS disk_initialize(BYTE drv /* Physical drive nmuber (0..) */)
{
	BYTE data i = drv;
	BYTE data n;
	unsigned int data nn;

	POWER_ON();					/* Socket power ON */

	for (nn = 3000; nn; nn--)
		;	

	Stat |= STA_NOINIT;
	if (!(Stat & STA_NODISK))
	{
		n = 10;						/* Dummy clock */
		do
		{
			rcvr_spi();
		}
		while (--n);

		SELECT();			/* CS = L */

		if (send_cmd(CMD0, 0) == 1)
		{
			/* Enter Idle state */
			Timer = 10000;					/* Wait for card ready in timeout of 1 sec */

			while (Timer-- && send_cmd(CMD1, 0))
			{
				;}

			if (Timer > 0)
			{
				Stat &= ~STA_NOINIT;
			}	/* When device goes ready, clear STA_NOINIT */
		}

		DESELECT();			/* CS = H */

		rcvr_spi();			/* Idle (Release DO) */
	}

	if (Stat & STA_NOINIT)
	{
		disk_shutdown();
	}

	return Stat;
}

/*-----------------------*/
/* Shutdown 			 */
/* (Platform dependent)  */


DSTATUS disk_shutdown()
{
	return 0;
}


/*--------------------*/
/* Return Disk Status */

DSTATUS disk_status(BYTE drv/* Physical drive nmuber (0..) */)
{
	BYTE data i = drv;

	return Stat;
}



/*----------------*/
/* Read Sector(s) */

DRESULT disk_read(BYTE drv, /* Physical drive nmuber (0..) */
	BYTE *buff, /* Data buffer to store read data */
	DWORD data sector, /* Sector number (LBA) */
	BYTE data count			/* Sector count (1..255) */)
{
	BYTE data i = drv;

	if (Stat & STA_NOINIT)
	{
		return RES_NOTRDY;
	}
	if (!count)
	{
		return RES_PARERR;
	}

	sector *= 512;		/* LBA --> byte address */

	SELECT();			/* CS = L */

	if (count == 1)
	{
		/* Single block read */
		if ((send_cmd(CMD17, sector) == 0)	/* READ_SINGLE_BLOCK */ &&
			rcvr_datablock(buff,
						   (BYTE)
						   (512 / 2)))
		{
			count = 0;
		}
	}
	else
	{
		/* Multiple block read */
		if (send_cmd(CMD18, sector) == 0)
		{
			/* READ_MULTIPLE_BLOCK */
			do
			{
				if (!rcvr_datablock(buff, (BYTE) (512 / 2)))
				{
					break;
				}
				buff += 512;
			}
			while (--count);
			send_cmd(CMD12, 0);				/* STOP_TRANSMISSION */
		}
	}

	DESELECT();			/* CS = H */
	rcvr_spi();			/* Idle (Release DO) */

	return count ? RES_ERROR : RES_OK;
}



/*-----------------*/
/* Write Sector(s) */

#ifndef _READONLY
DRESULT disk_write(BYTE data drv, /* Physical drive nmuber (0..) */
	const BYTE *buff, /* Data to be written */
	DWORD data sector, /* Sector number (LBA) */
	BYTE data count			/* Sector count (1..255) */)
{
	BYTE data i = drv;

	if (Stat & STA_NOINIT)
	{
		return RES_NOTRDY;
	}
	if (Stat & STA_PROTECT)
	{
		return RES_WRPRT;
	}
	if (!count)
	{
		return RES_PARERR;
	}
	sector *= 512;		/* LBA --> byte address */

	SELECT();			/* CS = L */

	if (count == 1)
	{
		/* Single block write */
		if ((send_cmd(CMD24, sector) == 0)	/* WRITE_BLOCK */ &&
			xmit_datablock(buff,
						   0xFE))
		{
			count = 0;
		}
	}
	else
	{
		/* Multiple block write */
		if (send_cmd(CMD25, sector) == 0)
		{
			/* WRITE_MULTIPLE_BLOCK */
			do
			{
				if (!xmit_datablock(buff, 0xFC))
				{
					break;
				}
				buff += 512;
			}
			while (--count);
			if (!xmit_datablock(0, 0xFD))	/* STOP_TRAN token */
			{
				count = 1;
			}
		}
	}

	DESELECT();			/* CS = H */
	rcvr_spi();			/* Idle (Release DO) */

	return count ? RES_ERROR : RES_OK;
}
#endif



/*--------------------------*/
/* Miscellaneous Functions  */

DRESULT disk_ioctl(BYTE data drv, /* Physical drive nmuber (0..) */
	BYTE data ctrl, /* Control code */
	void *buff		/* Buffer to send/receive data block */)
{
	BYTE data i = drv;

	DRESULT data res;
	BYTE n, csd[16], *ptr = buff;
	WORD data csm, csize;


	if (Stat & STA_NOINIT)
	{
		return RES_NOTRDY;
	}

	SELECT();		/* CS = L */

	res = RES_ERROR;
	switch (ctrl)
	{
		case CTRL_SYNC :
			/* Make sure that no pending write process */
			SELECT();
			if (wait_ready() == 0xFF)
			{
				res = RES_OK;
			}
			break;

		case GET_SECTOR_COUNT :
			/* Get number of sectors on the disk (unsigned long) */
			if ((send_cmd(CMD9, 0) == 0) && rcvr_datablock(csd, 16 / 2))
			{
				/* Calculate disk size */
				csm = 1 << (((csd[10] & 128) >> 7) + ((csd[9] & 3) << 1) + 2);
				csize = ((WORD) (csd[8] & 3) >> 6) +
						(WORD) (csd[7] << 2) +
						((WORD) (csd[6] & 3) << 10) +
						1;
#ifdef _BYTE_ACC
				ST_DWORD(ptr, (DWORD) csize * csm);
#else
				*(DWORD *) ptr = (DWORD) csize * csm;
#endif
				res = RES_OK;
			}
			break;

		case GET_SECTOR_SIZE :
			/* Get R/W sector size (WORD) */
			*(WORD *) buff = 512;
			res = RES_OK;
			break;

		case GET_BLOCK_SIZE :
			/* Get erase block size in unit of sector (DWORD) */
			if (CardType & 4)
			{
				/* SDC ver 2.00 */
				if (send_cmd(ACMD13, 0) == 0)
				{
					/* Read SD status */
					rcvr_spi();
					if (rcvr_datablock(csd, 16))
					{
						/* Read partial block */
						for (n = 64 - 16; n; n--)
						{
							rcvr_spi();
						}	/* Purge trailing data */
						*(DWORD *) buff = 16UL << (csd[10] >> 4);
						res = RES_OK;
					}
				}
			}
			else
			{
				/* SDC ver 1.XX or MMC */
				if ((send_cmd(CMD9, 0) == 0) && rcvr_datablock(csd, 16))
				{
					/* Read CSD */
					if (CardType & 2)
					{
						/* SDC ver 1.XX */
						*(DWORD *) buff = (((csd[10] & 63) << 1) +
										   ((WORD) (csd[11] & 128) >> 7) +
										   1) <<
										  ((csd[13] >> 6) - 1);
					}
					else
					{
						/* MMC */
						*(DWORD *) buff = ((WORD) ((csd[10] & 124) >> 2) + 1) * (((csd[11] & 3) <<
																				  3) +
																				 ((csd[11] & 224) >>
																				  5) +
																				 1);
					}
					res = RES_OK;
				}
			}
			break;

		case MMC_GET_TYPE :
			/* Get card type flags (1 byte) */
			*ptr = CardType;
			res = RES_OK;
			break;

		case MMC_GET_CSD :
			/* Receive CSD as a data block (16 bytes) */
			if ((send_cmd(CMD9, 0) == 0)	/* READ_CSD */ &&
				rcvr_datablock(ptr,
							   16 /
																			 2))
			{
				res = RES_OK;
			}
			break;

		case MMC_GET_CID :
			/* Receive CID as a data block (16 bytes) */
			if ((send_cmd(CMD10, 0) == 0)	/* READ_CID */ &&
				rcvr_datablock(ptr,
							   16 /
																			 2))
			{
				res = RES_OK;
			}
			break;

		case MMC_GET_OCR :
			/* Receive OCR as an R3 resp (4 bytes) */
			if (send_cmd(CMD58, 0) == 0)
			{
				/* READ_OCR */
				for (n = 0; n < 4; n++)
				{
					*ptr++ = rcvr_spi();
				}
				res = RES_OK;
			}
			break;

		case MMC_GET_SDSTAT :
			/* Receive SD statsu as a data block (64 bytes) */
			if (send_cmd(ACMD13, 0) == 0)
			{
				/* SD_STATUS */
				rcvr_spi();
				if (rcvr_datablock(ptr, 64))
				{
					res = RES_OK;
				}
			}
			break;

		default:
			res = RES_PARERR;
	}

	DESELECT();			/* CS = H */
	rcvr_spi();			/* Idle (Release DO) */

	return res;
}



/*---------------------------------------*/
/* Device timer interrupt procedure 	 */
/* This must be called in period of 10ms */
/* (Platform dependent) 				 */

void disk_timerproc(void)
{
	;}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
成人黄色在线网站| 中文av一区二区| 欧美日韩亚洲丝袜制服| 97超碰欧美中文字幕| 成人黄色网址在线观看| 高清国产一区二区| 国产成人小视频| 国产成人99久久亚洲综合精品| 国产乱子轮精品视频| 国产剧情一区二区三区| 国产v综合v亚洲欧| 99久久国产综合精品麻豆| 91在线你懂得| 色欧美片视频在线观看 | 欧美影院午夜播放| 欧洲精品一区二区三区在线观看| 日本乱码高清不卡字幕| 欧美性猛交xxxx乱大交退制版| 欧美色爱综合网| 欧美视频三区在线播放| 欧美精品三级在线观看| 欧美成人猛片aaaaaaa| 久久久国产午夜精品| 中文字幕不卡的av| ...av二区三区久久精品| 亚洲一级在线观看| 久久精品99国产精品| 国产精品一二三在| 97久久精品人人做人人爽50路| 91免费精品国自产拍在线不卡| 在线一区二区三区做爰视频网站| 欧美日韩国产一区二区三区地区| 欧美一区二区日韩| 欧美高清在线视频| 亚洲国产精品欧美一二99| 日本vs亚洲vs韩国一区三区 | 久久激情综合网| 丁香网亚洲国际| 欧美在线不卡视频| 欧美不卡123| 亚洲欧洲美洲综合色网| 亚洲高清免费观看高清完整版在线观看| 天天色天天操综合| 国产成人免费在线观看不卡| 99久久精品一区| 欧美酷刑日本凌虐凌虐| 欧美xxxxx牲另类人与| 亚洲欧美日韩人成在线播放| 三级成人在线视频| 成人黄色免费短视频| 337p亚洲精品色噜噜| 国产三级一区二区三区| 亚洲国产一区视频| 国产成人久久精品77777最新版本 国产成人鲁色资源国产91色综 | 国产一区二区在线观看视频| 91农村精品一区二区在线| 日韩精品中文字幕一区二区三区 | 精品电影一区二区| 亚洲日本一区二区| 黑人巨大精品欧美黑白配亚洲| 91亚洲大成网污www| 欧美tickle裸体挠脚心vk| 亚洲色图欧美在线| 国产一区免费电影| 6080国产精品一区二区| 综合av第一页| 狠狠色丁香婷婷综合| 欧美日韩国产电影| 国产精品国模大尺度视频| 久久se精品一区精品二区| 在线亚洲免费视频| 国产精品美女久久久久高潮| 激情欧美日韩一区二区| 欧美日韩国产成人在线免费| 日韩美女啊v在线免费观看| 久久精品国产精品亚洲综合| 欧美三片在线视频观看| 亚洲图片你懂的| 国产精品1区2区| 精品欧美一区二区在线观看| 亚洲高清不卡在线| 在线视频国内一区二区| 中文字幕制服丝袜成人av | 欧美日韩在线播放三区四区| 综合色中文字幕| 成人免费视频国产在线观看| 久久一日本道色综合| 青青草一区二区三区| 欧美日本一道本在线视频| 玉米视频成人免费看| eeuss鲁片一区二区三区在线观看 eeuss鲁片一区二区三区在线看 | 99麻豆久久久国产精品免费优播| 26uuu久久综合| 精品一区二区三区香蕉蜜桃| 日韩欧美中文一区| 奇米777欧美一区二区| 欧美日本国产视频| 日韩电影一区二区三区| 91麻豆精品国产91久久久久久久久 | 久久精品一二三| 国产一区二区三区久久久| 精品日韩99亚洲| 国产制服丝袜一区| 国产清纯美女被跳蛋高潮一区二区久久w | 欧美韩日一区二区三区四区| 国产精品一区二区免费不卡| 精品久久久久久久一区二区蜜臀| 免费观看久久久4p| 日韩精品中文字幕一区| 国产在线视频一区二区| 久久一留热品黄| 国产成人在线色| 国产精品成人免费| 欧洲精品视频在线观看| 丝袜美腿亚洲一区二区图片| 欧美丰满美乳xxx高潮www| 视频一区二区欧美| 精品久久人人做人人爰| 国产精品1区2区3区| 国产精品久久久久影院亚瑟| 99re66热这里只有精品3直播 | 亚洲一区在线电影| 欧美精品xxxxbbbb| 精品一区二区免费在线观看| 国产亚洲视频系列| 99久久久久久99| 亚洲国产另类av| 欧美一卡二卡在线| 国产大陆亚洲精品国产| 亚洲欧美影音先锋| 欧美性xxxxx极品少妇| 美女www一区二区| 国产午夜久久久久| 色婷婷国产精品久久包臀| 婷婷综合另类小说色区| 日韩精品一区二区三区四区| 粉嫩欧美一区二区三区高清影视| 亚洲视频免费在线观看| 欧美日韩二区三区| 国产在线视频不卡二| 国产精品国产三级国产三级人妇 | 夫妻av一区二区| 亚洲区小说区图片区qvod| 欧美福利视频一区| 国产福利电影一区二区三区| 亚洲毛片av在线| 欧美成人a在线| 91色在线porny| 美女爽到高潮91| 综合色天天鬼久久鬼色| 日韩精品最新网址| 色嗨嗨av一区二区三区| 精品一区二区影视| 亚洲综合色区另类av| 久久综合九色综合欧美亚洲| 一本大道久久a久久精品综合| 日本不卡123| 亚洲欧美福利一区二区| 日韩精品在线网站| 在线观看亚洲专区| 国产精品91一区二区| 视频在线在亚洲| 亚洲欧洲成人自拍| 精品久久久久香蕉网| 欧美视频三区在线播放| 成人丝袜高跟foot| 毛片av一区二区三区| 依依成人综合视频| 久久亚洲一区二区三区四区| 欧美日韩在线综合| 99在线精品观看| 国产精品91一区二区| 麻豆传媒一区二区三区| 亚洲综合色噜噜狠狠| 国产精品人人做人人爽人人添| 欧美一区二区三区播放老司机| 色综合色狠狠天天综合色| 欧美三级乱人伦电影| 成人在线综合网| 麻豆国产欧美一区二区三区| 亚洲高清免费视频| 亚洲三级免费观看| 中文幕一区二区三区久久蜜桃| 日韩精品一区二区三区视频在线观看 | 在线成人小视频| 色欲综合视频天天天| 国产suv精品一区二区883| 免费观看一级特黄欧美大片| 午夜视黄欧洲亚洲| 亚洲电影视频在线| 亚洲欧美韩国综合色| 中文字幕一区二区三中文字幕| 久久蜜桃一区二区| 日韩欧美亚洲国产另类| 91精品国产综合久久国产大片| 精品婷婷伊人一区三区三| 色综合咪咪久久| www.日本不卡| 成人午夜免费电影| 成人丝袜视频网|