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

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

?? mci_device.c

?? atmel 9200 外擴16C554的驅動測試程序
?? C
?? 第 1 頁 / 共 2 頁
字號:
//*----------------------------------------------------------------------------
//*         ATMEL Microcontroller Software Support  -  ROUSSET  -
//*----------------------------------------------------------------------------
//* The software is delivered "AS IS" without warranty or condition of any
//* kind, either express, implied or statutory. This includes without
//* limitation any warranty or condition with respect to merchantability or
//* fitness for any particular purpose, or against the infringements of
//* intellectual property rights of others.
//*----------------------------------------------------------------------------
//* File Name           : mci_device.c
//* Object              : TEST DataFlash Functions
//* Creation            : FB   26/11/2002
//*
//*----------------------------------------------------------------------------

#include "AT91C_MCI_Device.h"

//*----------------------------------------------------------------------------
//* \fn    AT91F_MCI_SendCommand
//* \brief Generic function to send a command to the MMC or SDCard
//*----------------------------------------------------------------------------
AT91S_MCIDeviceStatus AT91F_MCI_SendCommand (
	AT91PS_MciDevice pMCI_Device,
	unsigned int Cmd,
	unsigned int Arg)
{
	unsigned int	error,status;
	//unsigned int	tick=0;

    // Send the command
    AT91C_BASE_MCI->MCI_ARGR = Arg;
    AT91C_BASE_MCI->MCI_CMDR = Cmd;

	// wait for CMDRDY Status flag to read the response
	do
	{
		status = AT91C_BASE_MCI->MCI_SR;
		//tick++;
	}
	while( !(status & AT91C_MCI_CMDRDY) );//&& (tick<100) );

    // Test error  ==> if crc error and response R3 ==> don't check error
    error = (AT91C_BASE_MCI->MCI_SR) & AT91C_MCI_SR_ERROR;
	if(error != 0 )
	{
		// if the command is SEND_OP_COND the CRC error flag is always present (cf : R3 response)
		if ( (Cmd != AT91C_SDCARD_APP_OP_COND_CMD) && (Cmd != AT91C_MMC_SEND_OP_COND_CMD) )
			return ((AT91C_BASE_MCI->MCI_SR) & AT91C_MCI_SR_ERROR);
		else
		{
			if (error != AT91C_MCI_RCRCE)
				return ((AT91C_BASE_MCI->MCI_SR) & AT91C_MCI_SR_ERROR);
		}
	}
    return AT91C_CMD_SEND_OK;
}

//*----------------------------------------------------------------------------
//* \fn    AT91F_MCI_SDCard_SendAppCommand
//* \brief Specific function to send a specific command to the SDCard
//*----------------------------------------------------------------------------
AT91S_MCIDeviceStatus AT91F_MCI_SDCard_SendAppCommand (
	AT91PS_MciDevice pMCI_Device,
	unsigned int Cmd_App,
	unsigned int Arg	)
{
	unsigned int status;
	//unsigned int	tick=0;

	// Send the CMD55 for application specific command
    AT91C_BASE_MCI->MCI_ARGR = (pMCI_Device->pMCI_DeviceFeatures->Relative_Card_Address << 16 );
    AT91C_BASE_MCI->MCI_CMDR = AT91C_APP_CMD;

	// wait for CMDRDY Status flag to read the response
	do
	{
		status = AT91C_BASE_MCI->MCI_SR;
		//tick++;
	}
	while( !(status & AT91C_MCI_CMDRDY) );//&& (tick<100) );	

    // if an error occurs
    if (((AT91C_BASE_MCI->MCI_SR) & AT91C_MCI_SR_ERROR) != 0 )
		return ((AT91C_BASE_MCI->MCI_SR) & AT91C_MCI_SR_ERROR);

    // check if it is a specific command and then send the command
	if ( (Cmd_App && AT91C_SDCARD_APP_ALL_CMD) == 0)
		return AT91C_CMD_SEND_ERROR;

   return( AT91F_MCI_SendCommand(pMCI_Device,Cmd_App,Arg) );
}

//*----------------------------------------------------------------------------
//* \fn    AT91F_MCI_GetStatus
//* \brief Addressed card sends its status register
//*----------------------------------------------------------------------------
AT91S_MCIDeviceStatus AT91F_MCI_GetStatus(AT91PS_MciDevice pMCI_Device,unsigned int relative_card_address)
{
	if (AT91F_MCI_SendCommand(pMCI_Device,
								AT91C_SEND_STATUS_CMD,
								relative_card_address <<16) == AT91C_CMD_SEND_OK)
    	return (AT91C_BASE_MCI->MCI_RSPR[0]);

    return AT91C_CMD_SEND_ERROR;
}

//*----------------------------------------------------------------------------
//* \fn    AT91F_MCI_Device_Handler
//* \brief MCI C interrupt handler
//*----------------------------------------------------------------------------
void AT91F_MCI_Device_Handler(
	AT91PS_MciDevice pMCI_Device,
	unsigned int status)
{
	// If End of Tx Buffer Empty interrupt occurred
	if ( status & AT91C_MCI_TXBUFE )
    {
		AT91C_BASE_MCI->MCI_IDR = AT91C_MCI_TXBUFE;
 		AT91C_BASE_PDC_MCI->PDC_PTCR = AT91C_PDC_TXTDIS;
        	
		pMCI_Device->pMCI_DeviceDesc->state = AT91C_MCI_IDLE;
	}	// End of if AT91C_MCI_TXBUFF		
	
    // If End of Rx Buffer Full interrupt occurred
    if ( status & AT91C_MCI_RXBUFF )
    {        
       	AT91C_BASE_MCI->MCI_IDR = AT91C_MCI_RXBUFF;
 		AT91C_BASE_PDC_MCI->PDC_PTCR = AT91C_PDC_RXTDIS;
	
		pMCI_Device->pMCI_DeviceDesc->state = AT91C_MCI_IDLE;
	}	// End of if AT91C_MCI_RXBUFF

}

//*----------------------------------------------------------------------------
//* \fn    AT91F_MCI_ReadBlock
//* \brief Read an ENTIRE block or PARTIAL block
//*----------------------------------------------------------------------------
AT91S_MCIDeviceStatus AT91F_MCI_ReadBlock(
	AT91PS_MciDevice pMCI_Device,
	int src,
	unsigned int *dataBuffer,
	int sizeToRead )
{
    ////////////////////////////////////////////////////////////////////////////////////////////
    if(pMCI_Device->pMCI_DeviceDesc->state != AT91C_MCI_IDLE)
    	return AT91C_READ_ERROR;
    
    if( (AT91F_MCI_GetStatus(pMCI_Device,pMCI_Device->pMCI_DeviceFeatures->Relative_Card_Address) & AT91C_SR_READY_FOR_DATA) != AT91C_SR_READY_FOR_DATA)
    	return AT91C_READ_ERROR;
    	
    if ( (src + sizeToRead) > pMCI_Device->pMCI_DeviceFeatures->Memory_Capacity )
		return AT91C_READ_ERROR;

    // If source does not fit a begin of a block
	if ( (src % pMCI_Device->pMCI_DeviceFeatures->Max_Read_DataBlock_Length) != 0 )
		return AT91C_READ_ERROR;
   
     // Test if the MMC supports Partial Read Block
     // ALWAYS SUPPORTED IN SD Memory Card
     if( (sizeToRead < pMCI_Device->pMCI_DeviceFeatures->Max_Read_DataBlock_Length) 
    	&& (pMCI_Device->pMCI_DeviceFeatures->Read_Partial == 0x00) )
   		return AT91C_READ_ERROR;
   		
    if( sizeToRead > pMCI_Device->pMCI_DeviceFeatures->Max_Read_DataBlock_Length)
   		return AT91C_READ_ERROR;
    ////////////////////////////////////////////////////////////////////////////////////////////
      
    // Init Mode Register
	AT91C_BASE_MCI->MCI_MR |= ((pMCI_Device->pMCI_DeviceFeatures->Max_Read_DataBlock_Length << 16) | AT91C_MCI_PDCMODE);
	 
    if (sizeToRead %4)
		sizeToRead = (sizeToRead /4)+1;
	else
		sizeToRead = sizeToRead/4;

	AT91C_BASE_PDC_MCI->PDC_PTCR = (AT91C_PDC_TXTDIS | AT91C_PDC_RXTDIS);
    AT91C_BASE_PDC_MCI->PDC_RPR  = (unsigned int)dataBuffer;
    AT91C_BASE_PDC_MCI->PDC_RCR  = sizeToRead;

	// Send the Read single block command
    if ( AT91F_MCI_SendCommand(pMCI_Device, AT91C_READ_SINGLE_BLOCK_CMD, src) != AT91C_CMD_SEND_OK )
    	return AT91C_READ_ERROR;

	pMCI_Device->pMCI_DeviceDesc->state = AT91C_MCI_RX_SINGLE_BLOCK;

	// Enable AT91C_MCI_RXBUFF Interrupt
    AT91C_BASE_MCI->MCI_IER = AT91C_MCI_RXBUFF;

	// (PDC) Receiver Transfer Enable
	AT91C_BASE_PDC_MCI->PDC_PTCR = AT91C_PDC_RXTEN;
	
	return AT91C_READ_OK;
}

//*----------------------------------------------------------------------------
//* \fn    AT91F_MCI_WriteBlock
//* \brief  Write an ENTIRE block but not always PARTIAL block !!!
//*----------------------------------------------------------------------------
AT91S_MCIDeviceStatus AT91F_MCI_WriteBlock(
	AT91PS_MciDevice pMCI_Device,
	int dest,
	unsigned int *dataBuffer,
	int sizeToWrite )
{
    ////////////////////////////////////////////////////////////////////////////////////////////
	if( pMCI_Device->pMCI_DeviceDesc->state != AT91C_MCI_IDLE)
    	return AT91C_WRITE_ERROR;
    
    if( (AT91F_MCI_GetStatus(pMCI_Device,pMCI_Device->pMCI_DeviceFeatures->Relative_Card_Address) & AT91C_SR_READY_FOR_DATA) != AT91C_SR_READY_FOR_DATA)
    	return AT91C_WRITE_ERROR;
    	
    if ( (dest + sizeToWrite) > pMCI_Device->pMCI_DeviceFeatures->Memory_Capacity )
		return AT91C_WRITE_ERROR;

    // If source does not fit a begin of a block
	if ( (dest % pMCI_Device->pMCI_DeviceFeatures->Max_Read_DataBlock_Length) != 0 )
		return AT91C_WRITE_ERROR;
   
    // Test if the MMC supports Partial Write Block 
    if( (sizeToWrite < pMCI_Device->pMCI_DeviceFeatures->Max_Write_DataBlock_Length) 
    	&& (pMCI_Device->pMCI_DeviceFeatures->Write_Partial == 0x00) )
   		return AT91C_WRITE_ERROR;
   		
   	if( sizeToWrite > pMCI_Device->pMCI_DeviceFeatures->Max_Write_DataBlock_Length )
   		return AT91C_WRITE_ERROR;
    ////////////////////////////////////////////////////////////////////////////////////////////
  
    // Init Mode Register
	AT91C_BASE_MCI->MCI_MR |= ((pMCI_Device->pMCI_DeviceFeatures->Max_Write_DataBlock_Length << 16) | AT91C_MCI_PDCMODE);
	
	if (sizeToWrite %4)
		sizeToWrite = (sizeToWrite /4)+1;
	else
		sizeToWrite = sizeToWrite/4;

	// Init PDC for write sequence
    AT91C_BASE_PDC_MCI->PDC_PTCR = (AT91C_PDC_TXTDIS | AT91C_PDC_RXTDIS);
    AT91C_BASE_PDC_MCI->PDC_TPR = (unsigned int) dataBuffer;
    AT91C_BASE_PDC_MCI->PDC_TCR = sizeToWrite;

	// Send the write single block command
    if ( AT91F_MCI_SendCommand(pMCI_Device, AT91C_WRITE_BLOCK_CMD, dest) != AT91C_CMD_SEND_OK)
    	return AT91C_WRITE_ERROR;

	pMCI_Device->pMCI_DeviceDesc->state = AT91C_MCI_TX_SINGLE_BLOCK;

	// Enable AT91C_MCI_TXBUFE Interrupt
    AT91C_BASE_MCI->MCI_IER = AT91C_MCI_TXBUFE;
  
  	// Enables TX for PDC transfert requests
    AT91C_BASE_PDC_MCI->PDC_PTCR = AT91C_PDC_TXTEN;
  
	return AT91C_WRITE_OK;
}

//*------------------------------------------------------------------------------------------------------------
//* \fn    AT91F_MCI_MMC_SelectCard
//* \brief Toggles a card between the Stand_by and Transfer states or between Programming and Disconnect states
//*------------------------------------------------------------------------------------------------------------
AT91S_MCIDeviceStatus AT91F_MCI_MMC_SelectCard(AT91PS_MciDevice pMCI_Device, unsigned int relative_card_address)
{
    int status;
	
	//* Check if the MMC card chosen is already the selected one
	status = AT91F_MCI_GetStatus(pMCI_Device,relative_card_address);

	if (status < 0)
		return AT91C_CARD_SELECTED_ERROR;

	if ((status & AT91C_SR_CARD_SELECTED) == AT91C_SR_CARD_SELECTED)
		return AT91C_CARD_SELECTED_OK;

	//* Search for the MMC Card to be selected, status = the Corresponding Device Number
	status = 0;
	while( (pMCI_Device->pMCI_DeviceFeatures[status].Relative_Card_Address != relative_card_address)
		   && (status < AT91C_MAX_MCI_CARDS) )
		status++;

	if (status > AT91C_MAX_MCI_CARDS)
    	return AT91C_CARD_SELECTED_ERROR;

    if (AT91F_MCI_SendCommand( pMCI_Device,

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
91视频国产观看| 日韩欧美中文字幕制服| 欧美一区二区播放| 日韩一区欧美一区| 免费欧美高清视频| 色呦呦一区二区三区| 日本一区二区三区四区| 丝袜美腿亚洲一区| 色综合中文字幕国产 | 亚洲男人都懂的| 久久国产精品99精品国产| 色老汉av一区二区三区| 中文字幕不卡在线播放| 日本午夜精品视频在线观看| 99精品热视频| 国产欧美日本一区二区三区| 美女一区二区在线观看| 欧美日韩精品欧美日韩精品一 | 91丝袜美女网| 国产精品久久久久一区二区三区| 免费成人在线视频观看| 欧美自拍偷拍一区| 亚洲女同女同女同女同女同69| 国产在线看一区| 欧美xxxxx裸体时装秀| 五月综合激情日本mⅴ| 色94色欧美sute亚洲线路二| 国产精品视频麻豆| 国产精品一级二级三级| 精品福利一区二区三区| 久久狠狠亚洲综合| 日韩视频一区二区三区| 秋霞午夜av一区二区三区| 欧美精品vⅰdeose4hd| 亚洲午夜精品一区二区三区他趣| 91美女福利视频| 一区二区三区毛片| 欧美人动与zoxxxx乱| 一区二区三区 在线观看视频| 一本大道av一区二区在线播放| 国产精品久久看| 91免费精品国自产拍在线不卡| 亚洲色图清纯唯美| 色猫猫国产区一区二在线视频| 亚洲理论在线观看| 91精品国模一区二区三区| 男男视频亚洲欧美| 欧美成人乱码一区二区三区| 国产中文字幕一区| 国产精品天干天干在线综合| 97aⅴ精品视频一二三区| 亚洲久草在线视频| 在线成人小视频| 久久电影网站中文字幕| 国产欧美日韩在线看| 波多野结衣中文一区| 一区二区三区在线免费视频| 欧美精品日韩精品| 国产精品一区免费在线观看| 欧美国产综合一区二区| 色94色欧美sute亚洲线路一ni| 丝袜诱惑亚洲看片| 日本一区二区三区视频视频| 色999日韩国产欧美一区二区| 婷婷中文字幕综合| 国产欧美精品一区| 91亚洲精品一区二区乱码| 亚洲成av人综合在线观看| 91性感美女视频| 男女视频一区二区| 亚洲色图20p| 69堂国产成人免费视频| 波波电影院一区二区三区| 亚洲欧美成人一区二区三区| 日韩免费一区二区| 成人高清视频在线观看| 日本欧美一区二区在线观看| 久久精品综合网| 欧美精品黑人性xxxx| 国产精品一二三| 午夜精品久久久久久| 久久色在线观看| 欧美另类高清zo欧美| 韩国成人精品a∨在线观看| 亚洲色图欧洲色图婷婷| 日韩欧美国产成人一区二区| 色哟哟一区二区三区| 久久国产夜色精品鲁鲁99| 亚洲一区二区三区四区不卡| 国产精品色呦呦| 欧美一区二区三区人| 欧美视频一区二区在线观看| 激情六月婷婷久久| 日本伊人精品一区二区三区观看方式| 亚洲精品在线观看网站| 欧美日韩免费高清一区色橹橹| 国产中文字幕精品| 丝袜美腿一区二区三区| 午夜av区久久| 中文欧美字幕免费| 久久久久国产精品免费免费搜索| 色噜噜狠狠一区二区三区果冻| 成人动漫av在线| 国内外成人在线| 国产在线看一区| 免费在线视频一区| 蜜桃av一区二区| 亚洲成人免费视频| 亚洲观看高清完整版在线观看| 欧美激情综合五月色丁香小说| 国产片一区二区| 日韩三级中文字幕| 精品剧情在线观看| 91精品国产综合久久国产大片| 在线观看日韩国产| 在线视频亚洲一区| 色婷婷综合久久| 99久久精品国产麻豆演员表| 色综合视频一区二区三区高清| 国产一区不卡在线| 久久成人精品无人区| 国产精品一区二区无线| 精品亚洲欧美一区| 国产在线精品一区二区夜色| 日韩成人精品在线| 久久国产精品无码网站| 麻豆视频观看网址久久| 国产一区不卡在线| 国产精品91xxx| www.欧美色图| 国产91精品在线观看| 99久久99久久精品免费观看| 91黄色免费看| 欧美三级日韩三级| 欧美大片一区二区三区| 日韩欧美亚洲国产精品字幕久久久| 精品免费日韩av| 2020国产精品久久精品美国| 中文字幕精品一区二区精品绿巨人| 久久精品一区四区| 综合久久一区二区三区| 天天操天天干天天综合网| 久久国产综合精品| 99视频国产精品| 色欧美乱欧美15图片| 一区二区三区精品视频在线| 天堂va蜜桃一区二区三区| 美腿丝袜亚洲一区| 99久久婷婷国产| 91久久线看在观草草青青 | 亚洲一区二区三区四区的| 亚洲国产精品嫩草影院| 日韩成人精品在线| 成人毛片老司机大片| 97se亚洲国产综合自在线| 欧美一区二区精品| 欧美精品一区二区三区在线 | 欧美一区二区日韩| 久久久久综合网| 亚洲欧洲一区二区在线播放| 亚洲一区二区高清| 国产成人久久精品77777最新版本| 成人午夜伦理影院| 日韩三级视频在线观看| 一区二区三区四区中文字幕| 国产一区不卡视频| 欧美日韩一二三区| 国产精品成人一区二区三区夜夜夜| 亚洲精品成人少妇| 国产成人久久精品77777最新版本| 亚欧色一区w666天堂| www.欧美精品一二区| 亚洲精品一线二线三线无人区| 成人免费一区二区三区视频 | 精品国精品国产尤物美女| 亚洲精品国久久99热| 韩国欧美一区二区| 欧美一区二区三区四区在线观看 | 日韩精品一区二区三区在线观看 | 中文字幕亚洲视频| 久久精品国产77777蜜臀| 91久久精品一区二区| 国产精品欧美一区喷水| 亚洲v精品v日韩v欧美v专区| 99久久综合色| 2022国产精品视频| 奇米888四色在线精品| 欧美日韩二区三区| 一级精品视频在线观看宜春院| 北条麻妃一区二区三区| 26uuu色噜噜精品一区| 久久99精品久久只有精品| 成人av综合一区| 国产精品无遮挡| 不卡一区中文字幕| 国产午夜一区二区三区| 国产成人亚洲综合色影视| 欧美视频中文一区二区三区在线观看| 国产精品久久久久久久久免费丝袜| 亚洲午夜视频在线|