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

📄 df.c

📁 MP3播放器详细设计方案
💻 C
📖 第 1 页 / 共 3 页
字号:
void df_write_close (void)
{
  while ((((Byte*)&gl_ptr_mem)[3] != 0x00) || ((((Byte*)&gl_ptr_mem)[2] & 0x01) != 0x00))
  {
    Spi_write_data(0x00);
    Spi_ack_write();
    gl_ptr_mem++;
  }
  DF_CS |= DF_DESEL_ALL;                    /* launch page programming */
  df_mem_busy = TRUE;                       /* memory is busy */
}


/*F**************************************************************************
* NAME: df_write_byte
*----------------------------------------------------------------------------
* PARAMS:
*   b: byte to program
*
* return:
*   write status: OK: write done, KO: write not done
*----------------------------------------------------------------------------
* PURPOSE:
*   Low level memory write function
*----------------------------------------------------------------------------
* EXAMPLE:
*----------------------------------------------------------------------------
* NOTE:
*   There is no need to pre-load a new page in buffer as first write
*   will start at address 0 of the page. This considers file write
*   does not overwrite exixting file...
*----------------------------------------------------------------------------
* REQUIREMENTS:
*****************************************************************************/
bit df_write_byte (const Byte b)
{
  if (df_mem_busy)
  { /* memory busy */
    df_mem_busy = FALSE;                    /* memory is ready */
    df_busy();                              /* wait end of programming */
    /* 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);
    Spi_ack_write();
    Spi_write_data(0x00);                   /* address 00 of the page */
    Spi_ack_write();

    Spi_write_data(b);                      /* write current data */
    Spi_ack_write();
    gl_ptr_mem++;
    return OK;                              /* write done */
  }
  else
  { /* memory ready */
    Spi_write_data(b);                      /* write current data */
    Spi_ack_write();
    gl_ptr_mem++;

    /* 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;                /* launch page programming */
      df_mem_busy = TRUE;                   /* memory is busy */
    }
    return OK;                              /* write done */
  }
}


/*F**************************************************************************
* NAME: df_write_sector
*----------------------------------------------------------------------------
* PARAMS:
*   nb_sector:  number of contiguous sector to write 
*   global:     gl_ptr_mem
*
* return:
*   write status: OK: write done
*                 KO: write not done
*----------------------------------------------------------------------------
* PURPOSE: 
*   This function is an optimized function that writes nb-sector * 512 bytes
*   from USB controller to DataFlash memory
*----------------------------------------------------------------------------
* EXAMPLE:
*----------------------------------------------------------------------------
* NOTE:
*   - First call must be preceded by a call to 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.
*   - nb_sector always >= 1, can not be zero
*----------------------------------------------------------------------------
* REQUIREMENTS:
*****************************************************************************/
bit df_write_sector (Uint16 nb_sector)
{
Byte i;

  do
  {
    if (df_mem_busy)
    {
      df_mem_busy = FALSE;                    /* memory is ready */
      df_busy();                              /* wait end of programming */
  #if DF_PAGE_SIZE > 512
      /* load page in internal buffer */
      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;
      }
      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);
      Spi_ack_write();
      Spi_write_data(0x00);                   /* address 00 of the page */
      Spi_ack_write();
    }
    for (i = 8; i != 0; i--)                  /* write 8x64b = 512b */
    {
      while (!Usb_rx_complete());             /* wait end of reception */
      Spi_write_data(Usb_read_byte()); Spi_ack_write();
      Spi_write_data(Usb_read_byte()); Spi_ack_write();
      Spi_write_data(Usb_read_byte()); Spi_ack_write();
      Spi_write_data(Usb_read_byte()); Spi_ack_write();
      Spi_write_data(Usb_read_byte()); Spi_ack_write();
      Spi_write_data(Usb_read_byte()); Spi_ack_write();
      Spi_write_data(Usb_read_byte()); Spi_ack_write();
      Spi_write_data(Usb_read_byte()); Spi_ack_write();
      Spi_write_data(Usb_read_byte()); Spi_ack_write();
      Spi_write_data(Usb_read_byte()); Spi_ack_write();
      Spi_write_data(Usb_read_byte()); Spi_ack_write();
      Spi_write_data(Usb_read_byte()); Spi_ack_write();
      Spi_write_data(Usb_read_byte()); Spi_ack_write();
      Spi_write_data(Usb_read_byte()); Spi_ack_write();
      Spi_write_data(Usb_read_byte()); Spi_ack_write();
      Spi_write_data(Usb_read_byte()); Spi_ack_write();
      Spi_write_data(Usb_read_byte()); Spi_ack_write();
      Spi_write_data(Usb_read_byte()); Spi_ack_write();
      Spi_write_data(Usb_read_byte()); Spi_ack_write();
      Spi_write_data(Usb_read_byte()); Spi_ack_write();
      Spi_write_data(Usb_read_byte()); Spi_ack_write();
      Spi_write_data(Usb_read_byte()); Spi_ack_write();
      Spi_write_data(Usb_read_byte()); Spi_ack_write();
      Spi_write_data(Usb_read_byte()); Spi_ack_write();
      Spi_write_data(Usb_read_byte()); Spi_ack_write();
      Spi_write_data(Usb_read_byte()); Spi_ack_write();
      Spi_write_data(Usb_read_byte()); Spi_ack_write();
      Spi_write_data(Usb_read_byte()); Spi_ack_write();
      Spi_write_data(Usb_read_byte()); Spi_ack_write();
      Spi_write_data(Usb_read_byte()); Spi_ack_write();
      Spi_write_data(Usb_read_byte()); Spi_ack_write();
      Spi_write_data(Usb_read_byte()); Spi_ack_write();
      Spi_write_data(Usb_read_byte()); Spi_ack_write();
      Spi_write_data(Usb_read_byte()); Spi_ack_write();
      Spi_write_data(Usb_read_byte()); Spi_ack_write();
      Spi_write_data(Usb_read_byte()); Spi_ack_write();
      Spi_write_data(Usb_read_byte()); Spi_ack_write();
      Spi_write_data(Usb_read_byte()); Spi_ack_write();
      Spi_write_data(Usb_read_byte()); Spi_ack_write();
      Spi_write_data(Usb_read_byte()); Spi_ack_write();
      Spi_write_data(Usb_read_byte()); Spi_ack_write();
      Spi_write_data(Usb_read_byte()); Spi_ack_write();
      Spi_write_data(Usb_read_byte()); Spi_ack_write();
      Spi_write_data(Usb_read_byte()); Spi_ack_write();
      Spi_write_data(Usb_read_byte()); Spi_ack_write();
      Spi_write_data(Usb_read_byte()); Spi_ack_write();
      Spi_write_data(Usb_read_byte()); Spi_ack_write();
      Spi_write_data(Usb_read_byte()); Spi_ack_write();
      Spi_write_data(Usb_read_byte()); Spi_ack_write();
      Spi_write_data(Usb_read_byte()); Spi_ack_write();
      Spi_write_data(Usb_read_byte()); Spi_ack_write();
      Spi_write_data(Usb_read_byte()); Spi_ack_write();
      Spi_write_data(Usb_read_byte()); Spi_ack_write();
      Spi_write_data(Usb_read_byte()); Spi_ack_write();
      Spi_write_data(Usb_read_byte()); Spi_ack_write();
      Spi_write_data(Usb_read_byte()); Spi_ack_write();
      Spi_write_data(Usb_read_byte()); Spi_ack_write();
      Spi_write_data(Usb_read_byte()); Spi_ack_write();
      Spi_write_data(Usb_read_byte()); Spi_ack_write();
      Spi_write_data(Usb_read_byte()); Spi_ack_write();
      Spi_write_data(Usb_read_byte()); Spi_ack_write();
      Spi_write_data(Usb_read_byte()); Spi_ack_write();
      Spi_write_data(Usb_read_byte()); Spi_ack_write();
      Spi_write_data(Usb_read_byte()); Spi_ack_write();
      Usb_clear_RXOUT_PP();                      /* usb read acknowledgement */
    }
    gl_ptr_mem += 512;

  #if DF_PAGE_SIZE > 512
    /* check if end of page */
    if ((((Byte*)&gl_ptr_mem)[2] & DF_PAGE_MASK) == 0x00)
    {
      DF_CS |= DF_DESEL_ALL;                  /* launch page programming */
      df_mem_busy = TRUE;                     /* memory is busy */
    }
  #else
    /* always end of page */
    DF_CS |= DF_DESEL_ALL;                    /* launch page programming */
    df_mem_busy = TRUE;
  #endif
    nb_sector--;                            /* 1 more sector written */
  }
  while (nb_sector != 0);
  return OK;                                /* write done */
}


/*F**************************************************************************
* NAME: df_format
*----------------------------------------------------------------------------
* PARAMS:
*
* return:
*   Address of the format parameter structure in code
*----------------------------------------------------------------------------
* PURPOSE: 
*   This function is called by the fat_format function and returns a pointer
*   to a table containing the format parameters.
*----------------------------------------------------------------------------
* EXAMPLE:
*----------------------------------------------------------------------------
* NOTE:
*   DF FORMAT PARAMETERS
*   CAPACITY  LBAs      CYL   HDs   S/T   CLUSTs  S/C   S/F   FAT   HID
*   16MB      32640     510   4     16    4080    8     12    12    15
*   32MB      65280     510   8     16    4080    16    12    12    15
*----------------------------------------------------------------------------
* REQUIREMENTS:
*****************************************************************************/
s_format code * df_format (void)
{
code  s_format  df_tab_format[]=
  {
   /* nb_cylinder, nb_head, nb_sector, nb_hidden, nb_sector_per_cluster */
    { (Uint16)510, (Byte)4, (Byte)16,  (Byte)15,  (Byte)8 },
    { (Uint16)510, (Byte)8, (Byte)16,  (Byte)15,  (Byte)8 },
  };

  /* -- DF Type Selection -- */
  if (Df_disk_size() == DF_SIZE_16MB) return &df_tab_format[DF_16MB];
  if (Df_disk_size() == DF_SIZE_32MB) return &df_tab_format[DF_32MB];
}

⌨️ 快捷键说明

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