📄 df.c
字号:
else
DF_CS3 = 0;
}
/* select new page */
Spi_write_data(DF_RD_MAIN); /* read main */
Spi_ack_write();
Spi_write_data((((Byte*)&gl_ptr_mem)[1] << DF_SHFT_B1) | (((Byte*)&gl_ptr_mem)[2] >> DF_SHFT_B2));
Spi_ack_write();
Spi_write_data((((Byte*)&gl_ptr_mem)[2] & ~DF_PAGE_MASK) << DF_SHFT_B1);
Spi_ack_write();
Spi_write_data(0x00); /* address 00 of the page */
Spi_ack_write();
Spi_write_data(0xFF); /* 4 dummy writes for reading delay */
Spi_ack_write();
Spi_write_data(0xFF);
Spi_ack_write();
Spi_write_data(0xFF);
Spi_ack_write();
Spi_write_data(0xFF);
Spi_ack_write();
Spi_ack_write(); /* clear SPI flag */
}
gl_ptr_mem++;
Spi_write_data(0xFF); /* dummy write to read data */
Spi_ack_read();
return Spi_read_data(); /* read current data */
}
/*F**************************************************************************
* NAME: df_read_sector
*----------------------------------------------------------------------------
* PARAMS:
* nb_sector: number of contiguous sector to read
* global: gl_ptr_mem
*
* return:
* OK read done
*----------------------------------------------------------------------------
* PURPOSE:
* This function is an optimized function that writes nb-sector * 512 bytes
* from DataFlash memory to USB controller
*----------------------------------------------------------------------------
* EXAMPLE:
*----------------------------------------------------------------------------
* NOTE:
* - First call must be preceded by a call to df_read_open function
* - As 512 is always a sub-multiple of page size, there is no need to check
* page end for each bytes
* - Interrupts are disabled during transfer to avoid timer interrupt
* - nb_sector always >= 1, can not be zero
*----------------------------------------------------------------------------
* REQUIREMENTS:
*****************************************************************************/
bit df_read_sector (Uint16 nb_sector)
{
Byte i;
bit begin_ping_pong;
begin_ping_pong = TRUE;
do
{
/* check if end of page */
if ((((Byte*)&gl_ptr_mem)[3] == 0x00) && ((((Byte*)&gl_ptr_mem)[2] & DF_PAGE_MASK) == 0x00))
{
DF_CS |= DF_DESEL_ALL; /* deselect all memories */
/* select right memory */
if ((((Byte*)&gl_ptr_mem)[DF_MEM_BYTEH] & DF_MEM_MASKH) == 0)
{
if ((((Byte*)&gl_ptr_mem)[DF_MEM_BYTEL] & DF_MEM_MASKL) == 0)
DF_CS0 = 0;
else
DF_CS1 = 0;
}
else
{
if ((((Byte*)&gl_ptr_mem)[DF_MEM_BYTEL] & DF_MEM_MASKL) == 0)
DF_CS2 = 0;
else
DF_CS3 = 0;
}
/* select new page */
Spi_write_data(DF_RD_MAIN); /* read main */
Spi_ack_write();
Spi_write_data((((Byte*)&gl_ptr_mem)[1] << DF_SHFT_B1) | (((Byte*)&gl_ptr_mem)[2] >> DF_SHFT_B2));
Spi_ack_write();
Spi_write_data((((Byte*)&gl_ptr_mem)[2] & ~DF_PAGE_MASK) << DF_SHFT_B1);
Spi_ack_write();
Spi_write_data(0x00); /* address 00 of the page */
Spi_ack_write();
Spi_write_data(0xFF); /* 4 dummy writes for reading delay */
Spi_ack_write();
Spi_write_data(0xFF);
Spi_ack_write();
Spi_write_data(0xFF);
Spi_ack_write();
Spi_write_data(0xFF);
Spi_ack_write();
Spi_ack_write(); /* clear SPI flag */
}
for (i = 8; i != 0; i--) /* read 8x64b = 512b */
{
Disable_interrupt(); /* global disable */
Spi_write_data(0xFF); Spi_ack_read();
/* read 1st data while receiving the 2nd DO NOT MODIFY */
Spi_write_dummy(); ACC = SPSTA; Usb_write_byte(Spi_read_data());
Spi_write_dummy(); ACC = SPSTA; Usb_write_byte(Spi_read_data());
Spi_write_dummy(); ACC = SPSTA; Usb_write_byte(Spi_read_data());
Spi_write_dummy(); ACC = SPSTA; Usb_write_byte(Spi_read_data());
Spi_write_dummy(); ACC = SPSTA; Usb_write_byte(Spi_read_data());
Spi_write_dummy(); ACC = SPSTA; Usb_write_byte(Spi_read_data());
Spi_write_dummy(); ACC = SPSTA; Usb_write_byte(Spi_read_data());
Spi_write_dummy(); ACC = SPSTA; Usb_write_byte(Spi_read_data());
Spi_write_dummy(); ACC = SPSTA; Usb_write_byte(Spi_read_data());
Spi_write_dummy(); ACC = SPSTA; Usb_write_byte(Spi_read_data());
Spi_write_dummy(); ACC = SPSTA; Usb_write_byte(Spi_read_data());
Spi_write_dummy(); ACC = SPSTA; Usb_write_byte(Spi_read_data());
Spi_write_dummy(); ACC = SPSTA; Usb_write_byte(Spi_read_data());
Spi_write_dummy(); ACC = SPSTA; Usb_write_byte(Spi_read_data());
Spi_write_dummy(); ACC = SPSTA; Usb_write_byte(Spi_read_data());
Spi_write_dummy(); ACC = SPSTA; Usb_write_byte(Spi_read_data());
Spi_write_dummy(); ACC = SPSTA; Usb_write_byte(Spi_read_data());
Spi_write_dummy(); ACC = SPSTA; Usb_write_byte(Spi_read_data());
Spi_write_dummy(); ACC = SPSTA; Usb_write_byte(Spi_read_data());
Spi_write_dummy(); ACC = SPSTA; Usb_write_byte(Spi_read_data());
Spi_write_dummy(); ACC = SPSTA; Usb_write_byte(Spi_read_data());
Spi_write_dummy(); ACC = SPSTA; Usb_write_byte(Spi_read_data());
Spi_write_dummy(); ACC = SPSTA; Usb_write_byte(Spi_read_data());
Spi_write_dummy(); ACC = SPSTA; Usb_write_byte(Spi_read_data());
Spi_write_dummy(); ACC = SPSTA; Usb_write_byte(Spi_read_data());
Spi_write_dummy(); ACC = SPSTA; Usb_write_byte(Spi_read_data());
Spi_write_dummy(); ACC = SPSTA; Usb_write_byte(Spi_read_data());
Spi_write_dummy(); ACC = SPSTA; Usb_write_byte(Spi_read_data());
Spi_write_dummy(); ACC = SPSTA; Usb_write_byte(Spi_read_data());
Spi_write_dummy(); ACC = SPSTA; Usb_write_byte(Spi_read_data());
Spi_write_dummy(); ACC = SPSTA; Usb_write_byte(Spi_read_data());
Spi_write_dummy(); ACC = SPSTA; Usb_write_byte(Spi_read_data());
Spi_write_dummy(); ACC = SPSTA; Usb_write_byte(Spi_read_data());
Spi_write_dummy(); ACC = SPSTA; Usb_write_byte(Spi_read_data());
Spi_write_dummy(); ACC = SPSTA; Usb_write_byte(Spi_read_data());
Spi_write_dummy(); ACC = SPSTA; Usb_write_byte(Spi_read_data());
Spi_write_dummy(); ACC = SPSTA; Usb_write_byte(Spi_read_data());
Spi_write_dummy(); ACC = SPSTA; Usb_write_byte(Spi_read_data());
Spi_write_dummy(); ACC = SPSTA; Usb_write_byte(Spi_read_data());
Spi_write_dummy(); ACC = SPSTA; Usb_write_byte(Spi_read_data());
Spi_write_dummy(); ACC = SPSTA; Usb_write_byte(Spi_read_data());
Spi_write_dummy(); ACC = SPSTA; Usb_write_byte(Spi_read_data());
Spi_write_dummy(); ACC = SPSTA; Usb_write_byte(Spi_read_data());
Spi_write_dummy(); ACC = SPSTA; Usb_write_byte(Spi_read_data());
Spi_write_dummy(); ACC = SPSTA; Usb_write_byte(Spi_read_data());
Spi_write_dummy(); ACC = SPSTA; Usb_write_byte(Spi_read_data());
Spi_write_dummy(); ACC = SPSTA; Usb_write_byte(Spi_read_data());
Spi_write_dummy(); ACC = SPSTA; Usb_write_byte(Spi_read_data());
Spi_write_dummy(); ACC = SPSTA; Usb_write_byte(Spi_read_data());
Spi_write_dummy(); ACC = SPSTA; Usb_write_byte(Spi_read_data());
Spi_write_dummy(); ACC = SPSTA; Usb_write_byte(Spi_read_data());
Spi_write_dummy(); ACC = SPSTA; Usb_write_byte(Spi_read_data());
Spi_write_dummy(); ACC = SPSTA; Usb_write_byte(Spi_read_data());
Spi_write_dummy(); ACC = SPSTA; Usb_write_byte(Spi_read_data());
Spi_write_dummy(); ACC = SPSTA; Usb_write_byte(Spi_read_data());
Spi_write_dummy(); ACC = SPSTA; Usb_write_byte(Spi_read_data());
Spi_write_dummy(); ACC = SPSTA; Usb_write_byte(Spi_read_data());
Spi_write_dummy(); ACC = SPSTA; Usb_write_byte(Spi_read_data());
Spi_write_dummy(); ACC = SPSTA; Usb_write_byte(Spi_read_data());
Spi_write_dummy(); ACC = SPSTA; Usb_write_byte(Spi_read_data());
Spi_write_dummy(); ACC = SPSTA; Usb_write_byte(Spi_read_data());
Spi_write_dummy(); ACC = SPSTA; Usb_write_byte(Spi_read_data());
Spi_write_dummy(); ACC = SPSTA; Usb_write_byte(Spi_read_data());
ACC = SPSTA; Usb_write_byte(Spi_read_data());
Enable_interrupt(); /* global re-enable */
if (begin_ping_pong)
{
begin_ping_pong = FALSE;
}
else
{
while (!Usb_tx_complete()); /* wait end of transfer */
Usb_clear_TXCMPL(); /* ack transfer */
}
Usb_set_TXRDY(); /* start usb transfer */
}
gl_ptr_mem += 512;
nb_sector--; /* 1 more sector read */
}
while (nb_sector != 0);
while (!Usb_tx_complete()); /* wait end of last transfer */
Usb_clear_TXCMPL(); /* ack transfer */
return OK; /* read done */
}
/*F**************************************************************************
* NAME: df_write_open
*----------------------------------------------------------------------------
* PARAMS:
* pos: next write operation address
*
* return:
* status: TRUE: open done
* FALSE: open not done: memory is still busy
*----------------------------------------------------------------------------
* PURPOSE:
* Open memory in write mode
*----------------------------------------------------------------------------
* EXAMPLE:
*----------------------------------------------------------------------------
* NOTE:
* If page buffer > 512 bytes, page content is first loaded in buffer to be
* partially updated by write_byte or write64 functions
*----------------------------------------------------------------------------
* REQUIREMENTS:
*****************************************************************************/
bit df_write_open (Uint32 pos)
{
gl_ptr_mem = pos << 9; /* gl_ptr_mem = pos * 512 */
if (df_mem_busy)
{
df_mem_busy = FALSE;
df_busy(); /* wait end of programming */
}
#if DF_PAGE_SIZE > 512
/* select right memory */
if ((((Byte*)&gl_ptr_mem)[DF_MEM_BYTEH] & DF_MEM_MASKH) == 0)
{
if ((((Byte*)&gl_ptr_mem)[DF_MEM_BYTEL] & DF_MEM_MASKL) == 0)
DF_CS0 = 0;
else
DF_CS1 = 0;
}
else
{
if ((((Byte*)&gl_ptr_mem)[DF_MEM_BYTEL] & DF_MEM_MASKL) == 0)
DF_CS2 = 0;
else
DF_CS3 = 0;
}
/* get page content in buffer */
Spi_write_data(DF_TF_BUF_1); /* main to buffer 1 transfer */
Spi_ack_write();
Spi_write_data((((Byte*)&gl_ptr_mem)[1] << DF_SHFT_B1) | (((Byte*)&gl_ptr_mem)[2] >> DF_SHFT_B2));
Spi_ack_write();
Spi_write_data(((Byte*)&gl_ptr_mem)[2] << DF_SHFT_B1);
Spi_ack_write();
Spi_write_data(0xFF); /* dummy byte */
Spi_ack_write();
DF_CS |= DF_DESEL_ALL; /* deselect memory */
df_busy(); /* wait end of page transfer */
#endif
/* select right memory */
if ((((Byte*)&gl_ptr_mem)[DF_MEM_BYTEH] & DF_MEM_MASKH) == 0)
{
if ((((Byte*)&gl_ptr_mem)[DF_MEM_BYTEL] & DF_MEM_MASKL) == 0)
DF_CS0 = 0;
else
DF_CS1 = 0;
}
else
{
if ((((Byte*)&gl_ptr_mem)[DF_MEM_BYTEL] & DF_MEM_MASKL) == 0)
DF_CS2 = 0;
else
DF_CS3 = 0;
}
/* prepare the memory in write mode */
Spi_write_data(DF_PG_BUF_1); /* main program through buffer 1 */
Spi_ack_write();
Spi_write_data((((Byte*)&gl_ptr_mem)[1] << DF_SHFT_B1) | (((Byte*)&gl_ptr_mem)[2] >> DF_SHFT_B2));
Spi_ack_write();
Spi_write_data(((((Byte*)&gl_ptr_mem)[2] & ~DF_PAGE_MASK) << DF_SHFT_B1) | (((Byte*)&gl_ptr_mem)[2] & DF_PAGE_MASK));
Spi_ack_write();
Spi_write_data(((Byte*)&gl_ptr_mem)[3]);
Spi_ack_write();
return OK;
}
/*F**************************************************************************
* NAME: df_write_close
*----------------------------------------------------------------------------
* PARAMS:
*
* return:
*----------------------------------------------------------------------------
* PURPOSE:
* This function fills the end of the logical sector (512b) and launch page
* programming
*----------------------------------------------------------------------------
* EXAMPLE:
*----------------------------------------------------------------------------
* NOTE:
*----------------------------------------------------------------------------
* REQUIREMENTS:
*****************************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -