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

📄 obj_svcdataflash.c

📁 at91rm9200的一级bootloader
💻 C
📖 第 1 页 / 共 2 页
字号:
    pSvcDataFlash->DataFlashDesc.rx_data_size = sizeToRead;

    pSvcDataFlash->DataFlashDesc.tx_data_pt = dataBuffer;

    pSvcDataFlash->DataFlashDesc.tx_data_size = sizeToRead;



	/* Send the command to the dataflash */

	return(AT91F_DataFlashSendCommand (pSvcDataFlash, DB_CONTINUOUS_ARRAY_READ, 8, src));

}



//*-----------------------------------------------------------------------------

//* Function Name       : AT91F_DataFlashReadBuffer

//* Object              : Read the dataflash SRAM Buffer 1 or 2

//* Input Parameters    : DataFlash Service

//*						: <BufferCommand> = Buffer 1 or 2

//*                     : <*dataBuffer> = data buffer pointer

//*                     : <SizeToRead> = data buffer size

//* Return value		: State of the dataflash

//*-----------------------------------------------------------------------------

AT91S_SvcDataFlashStatus AT91F_DataFlashReadBuffer (

	AT91PS_SvcDataFlash pSvcDataFlash,

	u_char BufferCommand,

	u_int bufferAddress,

	u_char *dataBuffer,

	int sizeToRead )

{

	//* Test if the buffer command is legal

	if ((BufferCommand != DB_BUF1_READ) && (BufferCommand != DB_BUF2_READ))

		return DATAFLASH_BAD_COMMAND;

	

	//* buffer address must be lower than page size 

	if (bufferAddress > pSvcDataFlash->pDevice->pages_size)

		return DATAFLASH_BAD_ADDRESS;



	if ( (pSvcDataFlash->DataFlashDesc.state) != IDLE)

		return DATAFLASH_BUSY;

	

	/*Format the buffer read command  */	

	pSvcDataFlash->DataFlashDesc.command[0] = BufferCommand;

	pSvcDataFlash->DataFlashDesc.command[1] = 0;

    pSvcDataFlash->DataFlashDesc.command[2] = (u_char)(((u_int)(bufferAddress & pSvcDataFlash->pDevice->byte_mask)) >> 8) ;

    pSvcDataFlash->DataFlashDesc.command[3] = (u_char)((u_int)bufferAddress & 0x00FF) ;

	pSvcDataFlash->DataFlashDesc.command[4] = 0;

	

    pSvcDataFlash->DataFlashDesc.tx_cmd_pt 	 = pSvcDataFlash->DataFlashDesc.command ;

    pSvcDataFlash->DataFlashDesc.tx_cmd_size = 5 ;

    pSvcDataFlash->DataFlashDesc.rx_cmd_pt 	 = pSvcDataFlash->DataFlashDesc.command ;

    pSvcDataFlash->DataFlashDesc.rx_cmd_size = 5 ;



    pSvcDataFlash->DataFlashDesc.rx_data_pt	  = dataBuffer ;

    pSvcDataFlash->DataFlashDesc.tx_data_pt   = dataBuffer ;

    pSvcDataFlash->DataFlashDesc.rx_data_size = sizeToRead ;

    pSvcDataFlash->DataFlashDesc.tx_data_size = sizeToRead ;



    AT91F_SpiWrite(&(pSvcDataFlash->DataFlashDesc)) ;

		

	return DATAFLASH_OK;

}



//*-----------------------------------------------------------------------------

//* Function Name       : AT91F_MainMemoryToBufferTransfert

//* Object              : Read a page in the SRAM Buffer 1 or 2

//* Input Parameters    : DataFlash Service

//*                     : Page concerned

//*                     : 

//* Return value		: State of the dataflash

//*-----------------------------------------------------------------------------

AT91S_SvcDataFlashStatus AT91F_MainMemoryToBufferTransfert(	

	AT91PS_SvcDataFlash pSvcDataFlash,

	u_char BufferCommand,

	u_int page)

{ 

	//* Test if the buffer command is legal

	if ((BufferCommand != DB_PAGE_2_BUF1_TRF) && (BufferCommand != DB_PAGE_2_BUF2_TRF))

		return DATAFLASH_BAD_COMMAND;

	

	//* no data to transmit or receive

    pSvcDataFlash->DataFlashDesc.tx_data_size = 0;



	return(AT91F_DataFlashSendCommand (pSvcDataFlash, BufferCommand, 4, page*pSvcDataFlash->pDevice->pages_size));

}



///////////////////////////////////////////////////////////////////////////////////////////

//	Write Functions

///////////////////////////////////////////////////////////////////////////////////////////



//*-----------------------------------------------------------------------------

//* Function Name       : AT91F_DataFlashPagePgmBuf

//* Object              : Main memory page program through buffer 1 or buffer 2

//* Input Parameters    : DataFlash Service

//*						: <*src> = Source buffer

//*                     : <dest> = dataflash destination address

//*                     : <SizeToWrite> = data buffer size

//* Return value		: State of the dataflash

//*-----------------------------------------------------------------------------

AT91S_SvcDataFlashStatus AT91F_DataFlashPagePgmBuf(

	AT91PS_SvcDataFlash pSvcDataFlash,

	u_char BufferCommand,

	u_char *src,

	u_int dest,

	u_int SizeToWrite)

{

	//* Test if the buffer command is legal

	if ((BufferCommand != DB_PAGE_PGM_BUF1) && (BufferCommand != DB_PAGE_PGM_BUF2))

		return DATAFLASH_BAD_COMMAND;

		

    pSvcDataFlash->DataFlashDesc.tx_data_pt = src ;

    pSvcDataFlash->DataFlashDesc.tx_data_size = SizeToWrite ;

    pSvcDataFlash->DataFlashDesc.rx_data_pt = src;

    pSvcDataFlash->DataFlashDesc.rx_data_size = SizeToWrite;



	/* Send the command to the dataflash */

	return(AT91F_DataFlashSendCommand (pSvcDataFlash, BufferCommand, 4, dest));

}



//*-----------------------------------------------------------------------------

//* Function Name       : AT91F_DataFlashWriteBuffer

//* Object              : Write data to the internal sram buffer 1 or 2

//* Input Parameters    : DataFlash Service

//*						: <BufferCommand> = command to write buffer1 or buffer2

//*                     : <*dataBuffer> = data buffer to write

//*                     : <bufferAddress> = address in the internal buffer

//*                     : <SizeToWrite> = data buffer size

//* Return value		: State of the dataflash

//*-----------------------------------------------------------------------------

AT91S_SvcDataFlashStatus AT91F_DataFlashWriteBuffer (

	AT91PS_SvcDataFlash pSvcDataFlash,

	u_char BufferCommand,

	u_char *dataBuffer,

	u_int bufferAddress,

	int SizeToWrite )

{

	//* Test if the buffer command is legal

	if ((BufferCommand != DB_BUF1_WRITE) && (BufferCommand != DB_BUF2_WRITE))

		return DATAFLASH_BAD_COMMAND;

		

	//* buffer address must be lower than page size

	if (bufferAddress > pSvcDataFlash->pDevice->pages_size)

		return DATAFLASH_BAD_ADDRESS;



	if ( (pSvcDataFlash->DataFlashDesc.state)  != IDLE)

		return DATAFLASH_BUSY;

		

    //* Send first Write Command

    pSvcDataFlash->DataFlashDesc.command[0] = BufferCommand;

	pSvcDataFlash->DataFlashDesc.command[1] = 0;

    pSvcDataFlash->DataFlashDesc.command[2] = (u_char)(((u_int)(bufferAddress &  pSvcDataFlash->pDevice->byte_mask)) >> 8) ;

    pSvcDataFlash->DataFlashDesc.command[3] = (u_char)((u_int)bufferAddress  & 0x00FF) ;



    pSvcDataFlash->DataFlashDesc.tx_cmd_pt 	 = pSvcDataFlash->DataFlashDesc.command ;

    pSvcDataFlash->DataFlashDesc.tx_cmd_size = 4 ;

    pSvcDataFlash->DataFlashDesc.rx_cmd_pt 	 = pSvcDataFlash->DataFlashDesc.command ;

    pSvcDataFlash->DataFlashDesc.rx_cmd_size = 4 ;



    pSvcDataFlash->DataFlashDesc.rx_data_pt 	= dataBuffer ;

    pSvcDataFlash->DataFlashDesc.tx_data_pt 	= dataBuffer ;

    pSvcDataFlash->DataFlashDesc.rx_data_size 	= SizeToWrite ;

    pSvcDataFlash->DataFlashDesc.tx_data_size 	= SizeToWrite ;



    AT91F_SpiWrite( &pSvcDataFlash->DataFlashDesc );



	return DATAFLASH_OK;

}



//*-----------------------------------------------------------------------------

//* Function Name       : AT91F_WriteBufferToMain

//* Object              : Write buffer to the main memory

//* Input Parameters    : DataFlash Service

//*						: <BufferCommand> = command to send to buffer1 or buffer2

//*                     : <dest> = main memory address

//* Return value		: State of the dataflash

//*-----------------------------------------------------------------------------

AT91S_SvcDataFlashStatus AT91F_WriteBufferToMain (	

	AT91PS_SvcDataFlash pSvcDataFlash,

	u_char BufferCommand,

	u_int dest )

{

	//* Test if the buffer command is correct

	if ((BufferCommand != DB_BUF1_PAGE_PGM) &&

		(BufferCommand != DB_BUF1_PAGE_ERASE_PGM) &&

		(BufferCommand != DB_BUF2_PAGE_PGM) &&

		(BufferCommand != DB_BUF2_PAGE_ERASE_PGM) )

		return DATAFLASH_BAD_COMMAND;

		

	//* no data to transmit or receive

    pSvcDataFlash->DataFlashDesc.tx_data_size = 0;

	

	/* Send the command to the dataflash */

	return(AT91F_DataFlashSendCommand (pSvcDataFlash, BufferCommand, 4, dest));

}



///////////////////////////////////////////////////////////////////////////////////////////

//	Erase Functions

///////////////////////////////////////////////////////////////////////////////////////////



//*-----------------------------------------------------------------------------

//* Function Name       : AT91F_PageErase

//* Object              : Erase a page in dataflash

//* Input Parameters    : DataFlash Service

//*						: <PageNumber> = Number of the page to erase

//*                     : 

//* Return value		: State of the dataflash

//*-----------------------------------------------------------------------------

AT91S_SvcDataFlashStatus AT91F_PageErase (	

	AT91PS_SvcDataFlash pSvcDataFlash,

	u_int PageNumber)

{

    pSvcDataFlash->DataFlashDesc.tx_data_size = 0;

	

	/* Send the command to the dataflash */

	return(AT91F_DataFlashSendCommand (pSvcDataFlash, DB_PAGE_ERASE, 4, PageNumber*pSvcDataFlash->pDevice->pages_size));

}





//*-----------------------------------------------------------------------------

//* Function Name       : AT91F_BlockErase

//* Object              : Erase a block of 8 pages

//* Input Parameters    : DataFlash Service

//*						: <BlockNumber> = number of the block to erase

//*                     : 

//* Return value		: State of the dataflash

//*-----------------------------------------------------------------------------

AT91S_SvcDataFlashStatus AT91F_BlockErase (	

	AT91PS_SvcDataFlash pSvcDataFlash,

	u_int BlockNumber )

{

    pSvcDataFlash->DataFlashDesc.tx_data_size = 0;

	

	/* Send the command to the dataflash */

	return(AT91F_DataFlashSendCommand (pSvcDataFlash, DB_BLOCK_ERASE, 4, BlockNumber*8*pSvcDataFlash->pDevice->pages_size));

}



///////////////////////////////////////////////////////////////////////////////////////////

//	Compare Functions

///////////////////////////////////////////////////////////////////////////////////////////



//*-----------------------------------------------------------------------------

//* Function Name       : AT91F_MainMemoryToBufferCompare

//* Object              : Compare the contents of a page and one of the sram buffer

//* Input Parameters    : DataFlash Service

//*						: <BufferCommand> :specify the sram buffer to compare

//*                     : <page> : specify the page to compare

//*						: then after that operation, check the 6th bit of the status register

//* Return value		: State of the dataflash

//*-----------------------------------------------------------------------------

AT91S_SvcDataFlashStatus AT91F_MainMemoryToBufferCompare(	

	AT91PS_SvcDataFlash pSvcDataFlash,

	u_char BufferCommand,

	u_int page)

{

	//* Test if the buffer command is legal

	if ((BufferCommand != DB_PAGE_2_BUF1_CMP ) && (BufferCommand != DB_PAGE_2_BUF2_CMP ))

		return DATAFLASH_BAD_COMMAND;

		

	//* no data to transmit or receive

    pSvcDataFlash->DataFlashDesc.tx_data_size = 0;



	return(AT91F_DataFlashSendCommand (pSvcDataFlash, BufferCommand, 4, page*pSvcDataFlash->pDevice->pages_size));		

}

⌨️ 快捷键说明

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