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

📄 df.c

📁 这是atmel公司的89C51SND1C的mp3源程序
💻 C
📖 第 1 页 / 共 3 页
字号:
      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 */
  }
  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:
*   global: gl_ptr_mem
*
* return:
*   OK read done
*----------------------------------------------------------------------------
* PURPOSE: 
*   This function is an optimized function that writes 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
*----------------------------------------------------------------------------
* REQUIREMENTS:
*****************************************************************************/
bit df_read_sector (void)
{
Byte i;

  /* 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 */

    Usb_set_TXRDY();                        /* start usb transfer */
    while (!Usb_tx_complete());             /* wait end of transfer */
    Usb_clear_TXCMPL();                     /* ack transfer */
  }
  gl_ptr_mem += 512;
  return OK;
}


/*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:
*****************************************************************************/
void df_write_close (void)
{
  while ((((Byte*)&gl_ptr_mem)[3] != 0x00) || ((((Byte*)&gl_ptr_mem)[2] & 0x01) != 0x00))
  {

⌨️ 快捷键说明

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