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

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

?? dataflash.c

?? 基于AT91SAM7SE512cpu的flash訪問例子
?? C
字號:
//  ----------------------------------------------------------------------------
//          ATMEL Microcontroller Software Support  -  ROUSSET  -
//  ----------------------------------------------------------------------------
//  DISCLAIMER:  THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR
//  IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
//  MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE
//  DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR ANY DIRECT, INDIRECT,
//  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
//  LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
//  OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
//  LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
//  NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
//  EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
//  ----------------------------------------------------------------------------

#include "project.h"
#include "dataflash.h"
#include <stdio.h>

#define AT91C_DF_PAGE_SIZE   1056/4

unsigned int Source [AT91C_DF_PAGE_SIZE];
unsigned int Data[AT91C_DF_PAGE_SIZE];

extern void AT91F_DBGU_Printk(	char *buffer);

//*----------------------------------------------------------------------------
//* \fn    AT91F_SpiInit
//* \brief
//*----------------------------------------------------------------------------
void AT91F_SpiInit(unsigned int uPCS)
{
	volatile unsigned int uDummy;

 	// Configure PIO
	AT91F_PIO_CfgPeriph(
		AT91C_BASE_PIOA, // PIO controller base address
                ((unsigned int) AT91C_PA13_MOSI) |
		((unsigned int) AT91C_PA12_MISO) |
		((unsigned int) AT91C_PA11_NPCS0) |
		((unsigned int) AT91C_PA14_SPCK), // Peripheral A
		0); // Peripheral B


    // Enables the SPI0 Clock
    AT91F_SPI_CfgPMC();

    // Reset SPI0
    AT91C_BASE_SPI->SPI_CR = AT91C_SPI_SWRST;

    // Configure SPI0 in Master Mode with No CS selected
    AT91C_BASE_SPI->SPI_MR = AT91C_SPI_MSTR | AT91C_SPI_MODFDIS | AT91C_SPI_PCS;

    // Configure CSx
    if (uPCS == AT91C_SPI_PCS0_DATAFLASH)
      *(AT91C_SPI_CSR + 0) = AT91C_SPI_CPOL | (AT91C_SPI_DLYBS & DATAFLASH_TCSS) | (AT91C_SPI_DLYBCT & DATAFLASH_TCHS) | ((AT91B_MASTER_CLOCK / AT91C_SPI_CLK) << 8);
    else // if (uPCS == AT91C_SPI_PCS1_DATAFLASH)
      *(AT91C_SPI_CSR + 1) = AT91C_SPI_CPOL | (AT91C_SPI_DLYBS & DATAFLASH_TCSS) | (AT91C_SPI_DLYBCT & DATAFLASH_TCHS) | ((AT91B_MASTER_CLOCK / AT91C_SPI_CLK) << 8);

    // Choose CSx
    AT91C_BASE_SPI->SPI_MR &= 0xFFF0FFFF;
    AT91C_BASE_SPI->SPI_MR |= ((uPCS << 16) & AT91C_SPI_PCS);

    // SPI_Enable
    AT91C_BASE_SPI->SPI_CR = AT91C_SPI_SPIEN;

   	for (uDummy=0; uDummy<100000; uDummy++);

	uDummy = AT91C_BASE_SPI->SPI_SR;
	uDummy = AT91C_BASE_SPI->SPI_RDR;
}

//*-----------------------------------------------------------------------------
//* \fn    : AT91F_DF_wait_ready
//* \brief
//*-----------------------------------------------------------------------------
char AT91F_DF_wait_ready(AT91PS_DF pDataFlash)
{
	unsigned int timeout = 0;

	while (timeout++ < AT91C_DF_TIMEOUT)
	{
		if (AT91F_DF_get_status(pDataFlash))
		{
			if (AT91F_DF_is_ready(pDataFlash))
				return 1;
		}
	}

	return 0;
}

//*----------------------------------------------------------------------------
//* \fn    AT91F_DataFlashSendCommand
//* \brief Generic function to send a command to the dataflash
//*----------------------------------------------------------------------------
char AT91F_DF_send_command (
	AT91PS_DF pDataFlash,
	unsigned char bCmd,      // Command value
	unsigned char bCmdSize,  // Command Size
	char         *pData,     // Data to be sent
	unsigned int  dDataSize, // Data Size
	unsigned int  dAddress)  // Dataflash Address
{
 	unsigned int dInternalAdr;
 	AT91PS_PDC pPdc;

 	// Try to get the dataflash semaphore
	if ( (pDataFlash->bSemaphore) != UNLOCKED)
		return (char) 0;
	pDataFlash->bSemaphore = LOCKED;

	// Compute command pattern
	dInternalAdr = ((dAddress / AT91C_PAGE_SIZE(pDataFlash)) << AT91C_PAGE_OFFSET(pDataFlash)) \
 		+ (dAddress % AT91C_PAGE_SIZE(pDataFlash));

 	if (AT91C_DF_NB_PAGE(pDataFlash) >= 16384)
	{
		pDataFlash->command[0] = (bCmd & 0x000000FF) | \
	                             ((dInternalAdr & 0x0F000000) >> 16) | \
	                             ((dInternalAdr & 0x00FF0000) >>  0) | \
	                             ((dInternalAdr & 0x0000FF00) << 16);
 		pDataFlash->command[1] =  (dInternalAdr & 0x000000FF);

		if ((bCmd != DB_CONTINUOUS_ARRAY_READ) && (bCmd != DB_PAGE_READ))
			bCmdSize++;
	}
	else
	{
		pDataFlash->command[0] = (bCmd & 0x000000FF) | \
	                             ((dInternalAdr & 0x00FF0000) >> 8) | \
	                             ((dInternalAdr & 0x0000FF00) << 8) | \
	                             ((dInternalAdr & 0x000000FF) << 24);
 		pDataFlash->command[1] = 0;
	}

 	// Send Command and data through the SPI
 	pPdc = (AT91PS_PDC) &(pDataFlash->pSpi->SPI_RPR);
 	AT91F_PDC_DisableRx(pPdc);
 	AT91F_PDC_SetRx(pPdc, (char *) &(pDataFlash->command), bCmdSize);
 	AT91F_PDC_SetNextRx(pPdc, pData, dDataSize);

	AT91F_PDC_DisableTx(pPdc);
	AT91F_PDC_SetTx(pPdc, (char *) &(pDataFlash->command), bCmdSize);
	AT91F_PDC_SetNextTx(pPdc, pData, dDataSize);

 	AT91F_PDC_EnableRx(pPdc);
	AT91F_PDC_EnableTx(pPdc);

    while (AT91F_DF_is_busy(pDataFlash) == LOCKED);

	return 1;
}
//*----------------------------------------------------------------------------
//* \fn    AT91F_DataFlashHandler
//* \brief SPI Fixed Peripheral C interrupt handler.
//*----------------------------------------------------------------------------
AT91S_DF_SEM AT91F_DF_is_busy(
	AT91PS_DF pDataFlash)
{
	AT91PS_PDC pPdc;
	AT91PS_SPI pSpi = pDataFlash->pSpi;
	unsigned int dStatus = pSpi->SPI_SR;

	//* If End of Receive Transfer interrupt occurred
 	if (( dStatus & AT91C_SPI_RXBUFF))
 	{
		pPdc = (AT91PS_PDC) &(pDataFlash->pSpi->SPI_RPR);
		AT91F_PDC_DisableTx(pPdc);
		AT91F_PDC_DisableRx(pPdc);

 		// Release the semaphore
		pDataFlash->bSemaphore = UNLOCKED;
		return UNLOCKED;
	}
	return  pDataFlash->bSemaphore;
}

//*----------------------------------------------------------------------------
//* \fn    AT91F_DataFlash_Write_Page
//* \brief Copy Flash content in First DataFlash page
//*----------------------------------------------------------------------------
void AT91F_DataFlash_Write_Page(AT91PS_DF pDf,char* psrc ,unsigned int dAddress)
{


    // Write a page
    AT91F_DF_write_buf1(pDf, psrc, AT91C_PAGE_SIZE(pDf), dAddress);
    AT91F_DF_wait_ready(pDf);
    AT91F_DF_page_erase(pDf, dAddress);
    AT91F_DF_wait_ready(pDf);
    AT91F_DF_pgm_buf1(pDf, psrc, AT91C_PAGE_SIZE(pDf), dAddress);
    AT91F_DF_wait_ready(pDf);
}

//*----------------------------------------------------------------------------
//* \fn    AT91F_DataFlash_Read_Page
//* \brief Read First DataFlash page
//*----------------------------------------------------------------------------
void AT91F_DataFlash_Read_Page(AT91PS_DF pDf, char *pData,unsigned int dAddress)
{
    AT91F_DF_continuous_read(pDf, pData, AT91C_PAGE_SIZE(pDf), dAddress);
    AT91F_DF_wait_ready(pDf);
}

//*----------------------------------------------------------------------------
//* \fn    AT91F_DataflashProbe
//* \brief Done
//*----------------------------------------------------------------------------
int AT91F_DataflashProbe(AT91PS_DF pDf)
{
    char *pResult = (char *)(pDf->command);

    AT91F_DF_get_status(pDf);
//$$$ JPP why   return (pResult[1] & 0x3C);
    return (pResult[1] & 0x3F);
;
}

//*------------------------------------------------------------------------------
//* Function Name       : AT91F_DataflashInit
//* \brief Done
//*------------------------------------------------------------------------------
int AT91F_DataflashInit (AT91PS_DF pDf)
{
	int dfcode = 0;
	int status = 1;
    char message[60];
	// Default: AT45DB321B
	pDf->dfDescription.pages_number = 8192;
	pDf->dfDescription.pages_size = 528;
	pDf->dfDescription.page_offset = 10;

	dfcode = AT91F_DataflashProbe (pDf);

	switch (dfcode)
	{
		case AT45DB011B:
			pDf->dfDescription.pages_number = 512;
			pDf->dfDescription.pages_size = 264;
			pDf->dfDescription.page_offset = 9;
			break;

		case AT45DB021B:
			pDf->dfDescription.pages_number = 1024;
			pDf->dfDescription.pages_size = 264;
			pDf->dfDescription.page_offset = 9;
			break;

		case AT45DB041B:
			pDf->dfDescription.pages_number = 2048;
			pDf->dfDescription.pages_size = 264;
			pDf->dfDescription.page_offset = 9;
			break;

		case AT45DB081B:
			pDf->dfDescription.pages_number = 4096;
			pDf->dfDescription.pages_size = 264;
			pDf->dfDescription.page_offset = 9;
			break;

		case AT45DB161B:
			pDf->dfDescription.pages_number = 4096;
			pDf->dfDescription.pages_size = 528;
			pDf->dfDescription.page_offset = 10;
			break;

		case AT45DB321B:
			pDf->dfDescription.pages_number = 8192;
			pDf->dfDescription.pages_size = 528;
			pDf->dfDescription.page_offset = 10;
			break;

		case AT45DB642:
			pDf->dfDescription.pages_number = 8192;
			pDf->dfDescription.pages_size = 1056;
			pDf->dfDescription.page_offset = 11;
			break;

		case AT45DB1282:
			pDf->dfDescription.pages_number = 16384;
			pDf->dfDescription.pages_size = 1056;
			pDf->dfDescription.page_offset = 11;
			break;

		case AT45DB2562:
			pDf->dfDescription.pages_number = 16384;
			pDf->dfDescription.pages_size = 2112;
			pDf->dfDescription.page_offset = 12;
			break;

		case AT45DB5122:
			pDf->dfDescription.pages_number = 32768;
			pDf->dfDescription.pages_size = 2112;
			pDf->dfDescription.page_offset = 12;
			break;

		default:
		        status = 0;
			break;
	}
        sprintf(message,"Dataflash code %X\n\r",dfcode);
        AT91F_DBGU_Printk(message);
        sprintf(message,"- Pages_number: %d\n\r",pDf->dfDescription.pages_number);
        AT91F_DBGU_Printk(message);
        sprintf(message,"- Pages_size:   %d\n\r",pDf->dfDescription.pages_size);
        AT91F_DBGU_Printk(message);
        sprintf(message,"- Page_offset:  %d\n\r",pDf->dfDescription.page_offset);
        AT91F_DBGU_Printk(message);
    return status;
}

//*----------------------------------------------------------------------------
//* \fn    AT91F_SPI_DataFlash_Erase_ALL
//* \brief Done
//*----------------------------------------------------------------------------
void AT91F_SPI_DataFlash_Erase_ALL(void)
{
    AT91S_DF sDF;
    AT91PS_DF pDf = (AT91PS_DF)&sDF;
    unsigned int i;
    pDf->pSpi = AT91C_BASE_SPI;
    pDf->bSemaphore = UNLOCKED;
    // get data Flash strcuture
    AT91F_DataflashInit(pDf);
    for (i = 0 ; i< pDf->dfDescription.pages_number; i++) {
		    AT91F_DF_page_erase(pDf, i);
		    AT91F_DF_wait_ready(pDf);
		    if ( i%256 ==0 ) AT91F_DBGU_Printk(".");
    }
}
//*----------------------------------------------------------------------------
//* \fn    AT91F_SPI_DataFlash_Erase_test
//* \brief Done
//*----------------------------------------------------------------------------
int AT91F_SPI_DataFlash_Erase_test()
{
    AT91S_DF sDF;
    AT91PS_DF pDf = (AT91PS_DF)&sDF;
    unsigned int pData[AT91C_DF_PAGE_SIZE];
    unsigned int i,j;

    pDf->pSpi = AT91C_BASE_SPI;
    pDf->bSemaphore = UNLOCKED;
    // get data Flash strcuture
    AT91F_DataflashInit(pDf);
    for (i = 0 ; i< pDf->dfDescription.pages_number; i++) {
		    AT91F_DataFlash_Read_Page(pDf, (char *)pData,i);
		    if ( i%256==0 ) AT91F_DBGU_Printk("-");
		    for (j=0 ; j < ((pDf->dfDescription.pages_size)/4) ;j++){
		      if  ( pData[j] != 0xFFFFFFFF)
                         return false ;
			}
		}
    return true;

}

//*----------------------------------------------------------------------------
//* \fn    AT91F_SPI_DataFlash_init
//* \brief Done
//*----------------------------------------------------------------------------
int AT91F_SPI_DataFlash_init(unsigned int uPCS)
{
    AT91S_DF sDF;
    AT91PS_DF pDf = (AT91PS_DF)&sDF;

    pDf->pSpi = AT91C_BASE_SPI;
    pDf->bSemaphore = UNLOCKED;

    AT91F_SpiInit(uPCS);
    if (!AT91F_DataflashInit(pDf))
        return false;
    return true;
}


//*----------------------------------------------------------------------------
//* \fn    AT91F_Test_SPI_DataFlash
//* \brief Done
//*----------------------------------------------------------------------------
int AT91F_Test_SPI_DataFlash(unsigned int uPCS)
{
    AT91S_DF sDF;
    AT91PS_DF pDf = (AT91PS_DF)&sDF;
    int i = 0;

    for (i=0;i<AT91C_DF_PAGE_SIZE;i++){
		Source[i]=i;
	}
    pDf->pSpi = AT91C_BASE_SPI;
    pDf->bSemaphore = UNLOCKED;

    AT91F_SpiInit(uPCS);
    if (!AT91F_DataflashInit(pDf))
        return -1;

    AT91F_DataFlash_Write_Page(pDf, (char*)Source, 0 );
    AT91F_DataFlash_Read_Page (pDf, (char*)Data, 0);

    // Compare Page
    while ((i<(pDf->dfDescription.pages_size/4)) && (Data[i] == Source[i]))
        i++;
    return (i<(pDf->dfDescription.pages_size/4)) ? -2 : 0;

  }

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
午夜精品一区二区三区电影天堂| 免费欧美日韩国产三级电影| 一区二区在线观看av| 亚洲激情欧美激情| 免费观看成人av| 成人福利视频网站| 欧美日韩一区中文字幕| 欧美一级国产精品| 日本一区二区高清| 亚洲一区中文在线| 国产精品白丝jk黑袜喷水| 91视频www| 欧美成人福利视频| 亚洲综合激情另类小说区| 久久成人免费网站| 91国产成人在线| 久久综合九色综合欧美98| 国产亚洲欧美日韩俺去了| 国产精品蜜臀在线观看| 午夜精品福利在线| 91视频免费播放| 国产亚洲精品免费| 蜜桃精品视频在线| 欧美色综合久久| 国产精品久久久久一区二区三区 | 国产成人午夜片在线观看高清观看| av在线一区二区| 欧美一区二区视频观看视频| 久久人人超碰精品| 婷婷久久综合九色国产成人| 99久久国产综合精品麻豆| 久久九九全国免费| 久久精品国产亚洲一区二区三区| 色呦呦网站一区| 国产精品久久久久久亚洲伦| 国产一区二区免费视频| 欧美日本乱大交xxxxx| 亚洲视频电影在线| 丁香婷婷综合五月| 国产亚洲精品7777| 激情丁香综合五月| 日韩三级精品电影久久久| 亚洲成人av中文| 欧美三级电影在线观看| 一区二区三区不卡视频在线观看 | 国产精品理论片在线观看| 麻豆国产欧美一区二区三区| 欧美色网站导航| 一个色综合网站| 在线影视一区二区三区| 亚洲精品成a人| 91看片淫黄大片一级| 亚洲区小说区图片区qvod| eeuss鲁片一区二区三区| 中文字幕在线视频一区| 高清日韩电视剧大全免费| 欧美xxxxx牲另类人与| 视频在线观看一区二区三区| 99国产精品99久久久久久| 中文字幕人成不卡一区| 91丨porny丨中文| 亚洲国产精品一区二区尤物区| 色呦呦国产精品| 尤物在线观看一区| 欧美人与z0zoxxxx视频| 亚洲国产美国国产综合一区二区| 欧美三级午夜理伦三级中视频| 亚洲免费观看高清完整版在线 | 久久成人久久爱| 久久久91精品国产一区二区精品 | 国产三级精品三级| 成人美女在线视频| 亚洲人成网站影音先锋播放| 色综合av在线| 日本麻豆一区二区三区视频| 欧美一级视频精品观看| 男男gaygay亚洲| 日本一区二区三区四区| 99久久99久久精品免费看蜜桃| 亚洲精品国产视频| 日韩午夜在线观看| 成人中文字幕合集| 亚洲高清免费一级二级三级| 精品区一区二区| aaa欧美大片| 奇米影视7777精品一区二区| 欧美国产综合一区二区| 在线欧美日韩国产| 久久99国产精品久久| 亚洲日本成人在线观看| 欧美一级xxx| 91麻豆精东视频| 久久国产精品第一页| 亚洲日本在线视频观看| 欧美大片在线观看一区| 国产精品66部| 亚洲激情第一区| 日韩美女视频一区二区在线观看| 国产98色在线|日韩| 日本最新不卡在线| 伊人夜夜躁av伊人久久| 久久精品网站免费观看| 91精品一区二区三区久久久久久| 成人免费高清在线观看| 久久精品久久久精品美女| 亚洲免费在线电影| 日本一区二区动态图| 日韩欧美色综合| 欧美日韩高清一区| 91同城在线观看| 国产精品1区2区3区在线观看| 亚洲香肠在线观看| 亚洲日韩欧美一区二区在线| 久久久久久久精| 日韩欧美一级精品久久| 在线亚洲高清视频| 99这里都是精品| 成人手机电影网| 国产一区二区三区免费看| 免费美女久久99| 日韩制服丝袜av| 亚洲国产另类av| 亚洲午夜电影网| 亚洲精品国产高清久久伦理二区| 国产丝袜欧美中文另类| 欧美日韩夫妻久久| 欧美亚洲图片小说| 成人综合在线观看| 国产专区欧美精品| 精品在线免费观看| 久久成人免费网站| 国产在线视频一区二区三区| 麻豆国产精品一区二区三区| 日本亚洲最大的色成网站www| 亚洲mv在线观看| 日韩不卡在线观看日韩不卡视频| 亚洲成人av中文| 日本午夜一本久久久综合| 免费成人性网站| 国产一区啦啦啦在线观看| 激情综合色综合久久综合| 精品在线一区二区| 国产精品18久久久久久久久久久久 | 精品剧情v国产在线观看在线| 欧美一区二区三区视频免费| 在线综合视频播放| 久久夜色精品一区| 久久久久青草大香线综合精品| 精品国产99国产精品| 精品免费一区二区三区| 精品久久99ma| 国产日韩欧美精品综合| |精品福利一区二区三区| 一区二区三区欧美日韩| 亚洲国产精品久久久久婷婷884 | 国产999精品久久| 99视频有精品| 欧美日韩在线一区二区| 欧美一区二区三区免费大片| 久久综合久色欧美综合狠狠| 国产女人18毛片水真多成人如厕 | 欧美最猛黑人xxxxx猛交| 91丝袜美腿高跟国产极品老师| 成人免费的视频| 欧美日韩三级一区二区| 精品国产电影一区二区| 国产精品二三区| 丝袜国产日韩另类美女| 岛国一区二区在线观看| 欧美日韩高清一区| 亚洲激情一二三区| 成人美女在线观看| 精品国产1区2区3区| 五月婷婷综合在线| 91丨porny丨首页| 中文字幕巨乱亚洲| 国产主播一区二区| 欧美一区二区在线不卡| 亚洲一卡二卡三卡四卡| 成人美女视频在线观看| 精品久久久网站| 日韩电影免费在线观看网站| 欧美亚一区二区| 亚洲精选一二三| 成人av第一页| 日本一区二区三区四区| 国产高清久久久久| 久久精品人人做人人爽人人| 蜜臀久久久99精品久久久久久| 欧美色图第一页| 夜夜爽夜夜爽精品视频| 日本高清免费不卡视频| 国产精品进线69影院| 国产福利一区在线| 国产日韩v精品一区二区| 国产成a人无v码亚洲福利| 国产性色一区二区| 成人免费毛片嘿嘿连载视频| 国产欧美日韩麻豆91| 成人av资源站|