📄 df.c
字号:
// Final step to clear the SPIF bit will be done on the next write
// Send the three address Bytes made of:
// (.) the page-address(first xbits),
// (.) the Byte-address within the page(last ybits).
// (x and y depending on the DF type).
// NOTE: the bits of gl_ptr_mem above the 24bits are not useful for the local
// DF addressing. They are used for DF discrimination when there are several
// DFs.
Spi_write_data((MSB1(gl_ptr_mem) << DF_SHFT_B1) | (MSB2(gl_ptr_mem) >> DF_SHFT_B2));
Spi_write_data(((MSB2(gl_ptr_mem) & ~DF_PAGE_MASK) << DF_SHFT_B1) | (MSB2(gl_ptr_mem) & DF_PAGE_MASK));
Spi_write_data(MSB3(gl_ptr_mem));
Spi_ack_write(); // Final step to clear the SPIF bit.
return OK;
}
//!
//! @brief This function fills the end of the logical sector (512B) and launch
//! page programming.
//!
//! @warning Code:?? bytes (function code length)
//!
//! @param None
//!
//! @return None
//!/
void df_write_close (void)
{
//#
//# While end of logical sector (512B) not reached, zero-fill the remaining
//# memory Bytes.
//#
while ((MSB3(gl_ptr_mem) != 0x00) || ((MSB2(gl_ptr_mem) & 0x01) != 0x00))
{
Spi_write_data(0x00); // (.) Final step to clear the SPIF bit,
// (.) Write 0x00
// (.) first step to clear the SPIF bit.
gl_ptr_mem++;
}
Spi_ack_write(); // Final step to clear the SPIF bit.
Df_desel_all(); // Launch page programming (or simply unselect memory
// if the while loop was not performed).
df_set_busy(df_select); // Current memory is busy
}
//!
//! @brief This function is optimized and writes nb-sector * 512 Bytes from
//! USB controller to DataFlash memory
//!
//! DATA FLOW is: USB => DF
//!
//!
//! NOTE:
//! - First call must be preceded by a call to the df_write_open() function,
//! - As 512 is always a sub-multiple of page size, there is no need to check
//! page end for each Bytes,
//! - The USB EPOUT must have been previously selected,
//! - Interrupts are disabled during transfer to avoid timer interrupt,
//! - nb_sector always >= 1, cannot be zero.
//!
//! @warning code:?? bytes (function code length)
//!
//! @param nb_sector number of contiguous sectors to write [IN]
//!
//! @return bit
//! The write succeeded -> OK
//!/
bit df_write_sector (Uint16 nb_sector)
{
Byte i;
do
{
//# Write 8x64b = 512b from the USB FIFO OUT.
for (i = 8; i != 0; i--)
{
// Wait end of rx in USB EPOUT.
while(Is_usb_read_enabled()==FALSE);
Disable_interrupt(); // Global disable.
// SPI write principle: send a Byte then clear the SPIF flag.
// Spi_write_data(Usb_read_byte()): (.) Final step to clear the SPIF bit,
// (.) send a Byte read from USB,
// (.) 1st step to clear the SPIF bit.
Spi_write_data(Usb_read_byte());
Spi_write_data(Usb_read_byte());
Spi_write_data(Usb_read_byte());
Spi_write_data(Usb_read_byte());
Spi_write_data(Usb_read_byte());
Spi_write_data(Usb_read_byte());
Spi_write_data(Usb_read_byte());
Spi_write_data(Usb_read_byte());
Spi_write_data(Usb_read_byte());
Spi_write_data(Usb_read_byte());
Spi_write_data(Usb_read_byte());
Spi_write_data(Usb_read_byte());
Spi_write_data(Usb_read_byte());
Spi_write_data(Usb_read_byte());
Spi_write_data(Usb_read_byte());
Spi_write_data(Usb_read_byte());
Spi_write_data(Usb_read_byte());
Spi_write_data(Usb_read_byte());
Spi_write_data(Usb_read_byte());
Spi_write_data(Usb_read_byte());
Spi_write_data(Usb_read_byte());
Spi_write_data(Usb_read_byte());
Spi_write_data(Usb_read_byte());
Spi_write_data(Usb_read_byte());
Spi_write_data(Usb_read_byte());
Spi_write_data(Usb_read_byte());
Spi_write_data(Usb_read_byte());
Spi_write_data(Usb_read_byte());
Spi_write_data(Usb_read_byte());
Spi_write_data(Usb_read_byte());
Spi_write_data(Usb_read_byte());
Spi_write_data(Usb_read_byte());
Spi_write_data(Usb_read_byte());
Spi_write_data(Usb_read_byte());
Spi_write_data(Usb_read_byte());
Spi_write_data(Usb_read_byte());
Spi_write_data(Usb_read_byte());
Spi_write_data(Usb_read_byte());
Spi_write_data(Usb_read_byte());
Spi_write_data(Usb_read_byte());
Spi_write_data(Usb_read_byte());
Spi_write_data(Usb_read_byte());
Spi_write_data(Usb_read_byte());
Spi_write_data(Usb_read_byte());
Spi_write_data(Usb_read_byte());
Spi_write_data(Usb_read_byte());
Spi_write_data(Usb_read_byte());
Spi_write_data(Usb_read_byte());
Spi_write_data(Usb_read_byte());
Spi_write_data(Usb_read_byte());
Spi_write_data(Usb_read_byte());
Spi_write_data(Usb_read_byte());
Spi_write_data(Usb_read_byte());
Spi_write_data(Usb_read_byte());
Spi_write_data(Usb_read_byte());
Spi_write_data(Usb_read_byte());
Spi_write_data(Usb_read_byte());
Spi_write_data(Usb_read_byte());
Spi_write_data(Usb_read_byte());
Spi_write_data(Usb_read_byte());
Spi_write_data(Usb_read_byte());
Spi_write_data(Usb_read_byte());
Spi_write_data(Usb_read_byte());
Spi_write_data(Usb_read_byte());
Spi_ack_write(); // Final step to clear the SPIF bit.
Usb_ack_receive_out(); // USB EPOUT read acknowledgement.
Enable_interrupt(); // Global re-enable.
} // for (i = 8; i != 0; i--)
gl_ptr_mem += 512; // Update the memory pointer.
nb_sector--; // 1 more sector written
//# Launch page programming if end of page.
//#
#if DF_PAGE_SIZE > 512
// Check if end of 1024b page.
if ((MSB2(gl_ptr_mem) & DF_PAGE_MASK) == 0x00)
{
Df_desel_all(); // Launch page programming
df_set_busy(df_select); // memory is busy
#if (DF_NB_MEM == 1)
if (nb_sector != 0)
df_write_open(gl_ptr_mem>>9);
#endif
}
#else
// Always end of page.
Df_desel_all(); // Launch page programming
df_set_busy(df_select); // memory is busy
#if (DF_NB_MEM == 1)
if (nb_sector != 0)
df_write_open(gl_ptr_mem>>9);
#endif
#endif
}
while (nb_sector != 0);
return OK; // Write done
}
//!
//! @brief This function is optimized and writes nb-sector * 512 Bytes from
//! USB HOST controller to DataFlash memory
//!
//! DATA FLOW is: USB => DF
//!
//!
//! NOTE:
//! - This function should be used only when using the USB controller in HOST mode
//! - First call must be preceded by a call to the df_write_open() function,
//! - As 512 is always a sub-multiple of page size, there is no need to check
//! page end for each Bytes,
//! - The USB PIPE OUT must have been previously selected,
//! - Interrupts are disabled during transfer to avoid timer interrupt,
//! - nb_sector always >= 1, cannot be zero.
//!
//! @warning code:?? bytes (function code length)
//!
//! @param nb_sector number of contiguous sectors to write [IN]
//!
//! @return bit
//! The write succeeded -> OK
//!/
bit df_host_write_sector (Uint16 nb_sector)
{
Byte i;
do
{
//# Write 8x64b = 512b from the USB FIFO OUT.
for (i = 8; i != 0; i--)
{
// Wait end of rx in USB PIPE IN.
Host_unfreeze_pipe();
while(Is_host_read_enabled()==FALSE);
Disable_interrupt(); // Global disable.
// SPI write principle: send a Byte then clear the SPIF flag.
// Spi_write_data(Usb_read_byte()): (.) Final step to clear the SPIF bit,
// (.) send a Byte read from USB,
// (.) 1st step to clear the SPIF bit.
Spi_write_data(Usb_read_byte());
Spi_write_data(Usb_read_byte());
Spi_write_data(Usb_read_byte());
Spi_write_data(Usb_read_byte());
Spi_write_data(Usb_read_byte());
Spi_write_data(Usb_read_byte());
Spi_write_data(Usb_read_byte());
Spi_write_data(Usb_read_byte());
Spi_write_data(Usb_read_byte());
Spi_write_data(Usb_read_byte());
Spi_write_data(Usb_read_byte());
Spi_write_data(Usb_read_byte());
Spi_write_data(Usb_read_byte());
Spi_write_data(Usb_read_byte());
Spi_write_data(Usb_read_byte());
Spi_write_data(Usb_read_byte());
Spi_write_data(Usb_read_byte());
Spi_write_data(Usb_read_byte());
Spi_write_data(Usb_read_byte());
Spi_write_data(Usb_read_byte());
Spi_write_data(Usb_read_byte());
Spi_write_data(Usb_read_byte());
Spi_write_data(Usb_read_byte());
Spi_write_data(Usb_read_byte());
Spi_write_data(Usb_read_byte());
Spi_write_data(Usb_read_byte());
Spi_write_data(Usb_read_byte());
Spi_write_data(Usb_read_byte());
Spi_write_data(Usb_read_byte());
Spi_write_data(Usb_read_byte());
Spi_write_data(Usb_read_byte());
Spi_write_data(Usb_read_byte());
Spi_write_data(Usb_read_byte());
Spi_write_data(Usb_read_byte());
Spi_write_data(Usb_read_byte());
Spi_write_data(Usb_read_byte());
Spi_write_data(Usb_read_byte());
Spi_write_data(Usb_read_byte());
Spi_write_data(Usb_read_byte());
Spi_write_data(Usb_read_byte());
Spi_write_data(Usb_read_byte());
Spi_write_data(Usb_read_byte());
Spi_write_data(Usb_read_byte());
Spi_write_data(Usb_read_byte());
Spi_write_data(Usb_read_byte());
Spi_write_data(Usb_read_byte());
Spi_write_data(Usb_read_byte());
Spi_write_data(Usb_read_byte());
Spi_write_data(Usb_read_byte());
Spi_write_data(Usb_read_byte());
Spi_write_data(Usb_read_byte());
Spi_write_data(Usb_read_byte());
Spi_write_data(Usb_read_byte());
Spi_write_data(Usb_read_byte());
Spi_write_data(Usb_read_byte());
Spi_write_data(Usb_read_byte());
Spi_write_data(Usb_read_byte());
Spi_write_data(Usb_read_byte());
Spi_write_data(Usb_read_byte());
Spi_write_data(Usb_read_byte());
Spi_write_data(Usb_read_byte());
Spi_write_data(Usb_read_byte());
Spi_write_data(Usb_read_byte());
Spi_write_data(Usb_read_byte());
Spi_ack_write(); // Final step to clear the SPIF bit.
Host_ack_in_received(); // USB PIPE IN read acknowledgement.
Enable_interrupt(); // Global re-enable.
} // for (i = 8; i != 0; i--)
gl_ptr_mem += 512; // Update the memory pointer.
nb_sector--; // 1 more sector written
//# Launch page programming if end of page.
//#
#if DF_PAGE_SIZE > 512
// Check if end of 1024b page.
if ((MSB2(gl_ptr_mem) & DF_PAGE_MASK) == 0x00)
{
Df_desel_all(); // Launch page programming
df_set_busy(df_select); // memory is busy
#if (DF_NB_MEM == 1)
if (nb_sector != 0)
df_write_open(gl_ptr_mem>>9);
#endif
}
#else
// Always end of page.
Df_desel_all(); // Launch page programming
df_set_busy(df_select); // memory is busy
#if (DF_NB_MEM == 1)
if (nb_sector != 0)
df_write_open(gl_ptr_mem>>9);
#endif
#endif
}
while (nb_sector != 0);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -