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

📄 ideio.c

📁 8051实现的MP3播放程序,大家可以一起学习.
💻 C
📖 第 1 页 / 共 2 页
字号:
/*C**************************************************************************
* NAME:         ideio.c         
*----------------------------------------------------------------------------
* Copyright (c) 2003 Atmel.
*----------------------------------------------------------------------------
* RELEASE:      snd1c-refd-nf-4_0_3      
* REVISION:     1.21     
*----------------------------------------------------------------------------
* PURPOSE:
* 
*****************************************************************************/


/*_____ I N C L U D E S ____________________________________________________*/
#include "config.h"                         /* system configuration */
#include "ideio.h"
#include "..\usb\usb_drv.h"                 /* usb driver definition */
#include "lib_mcu\lcd\lcd_drv.h"                /* c51 driver definition */
//#include "lib_mcu\serial\serial.h"

#define Usb_clear_RXOUTB0()  {if(UEPSTAX & 0x42)  UEPSTAX &= 0xbd;}

extern  bdata bit     gl_hdd_buffer_flag;
extern  xdata Byte    gl_hdd_buffer[512];
extern  xdata Byte    fat_buf_sector[512];
extern  xdata uint    gl_hdd_buffer_ptr; //hdd_buffer[]的序列号
extern data   Uint32  dCBWDataTransferLength;
extern  data  Uint16  hdd_data_length;

data  Uint32          hdd_current_sector;

extern uchar   HDD_MANUFACTURER_ID[8];
extern uchar   HDD_PRODUCT_ID[16];
//extern uchar   HDD_REVITION[4];

extern  void usb_mass_storage_csw (void);


/**********************************************************
*函数名称:void DriveID(void)                              *
*用途:读硬盘ID                                            *
***********************************************************/ 
void DriveID(void) 
{
 uint i;

 do{ACC=FILE7;}while(BSY);
    FILE7=0xec;

 do{ACC=FILE7;}while(BSY|!DRQ);

    for (i = 0; i<512;)
      {
	    gl_hdd_buffer[i++]=FILE0;
        gl_hdd_buffer[i++]=DAT16H;
      }

  HDD_MANUFACTURER_ID[1] = gl_hdd_buffer[54];
  HDD_MANUFACTURER_ID[0] = gl_hdd_buffer[55];
  HDD_MANUFACTURER_ID[3] = gl_hdd_buffer[56];
  HDD_MANUFACTURER_ID[2] = gl_hdd_buffer[57];
  HDD_MANUFACTURER_ID[5] = gl_hdd_buffer[58];
  HDD_MANUFACTURER_ID[4] = gl_hdd_buffer[59];
  HDD_MANUFACTURER_ID[7] = gl_hdd_buffer[60];
  HDD_MANUFACTURER_ID[6] = gl_hdd_buffer[61];

  HDD_PRODUCT_ID[1] = gl_hdd_buffer[62];
  HDD_PRODUCT_ID[0] = gl_hdd_buffer[63];
  HDD_PRODUCT_ID[3] = gl_hdd_buffer[64];
  HDD_PRODUCT_ID[2] = gl_hdd_buffer[65];
  HDD_PRODUCT_ID[5] = gl_hdd_buffer[66];
  HDD_PRODUCT_ID[4] = gl_hdd_buffer[67];
  HDD_PRODUCT_ID[7] = gl_hdd_buffer[68];
  HDD_PRODUCT_ID[6] = gl_hdd_buffer[69];
  HDD_PRODUCT_ID[9] = gl_hdd_buffer[70];
  HDD_PRODUCT_ID[8] = gl_hdd_buffer[71];
  HDD_PRODUCT_ID[11] = gl_hdd_buffer[72];
  HDD_PRODUCT_ID[10] = gl_hdd_buffer[73];
  HDD_PRODUCT_ID[13] = gl_hdd_buffer[74];
  HDD_PRODUCT_ID[12] = gl_hdd_buffer[75];
  HDD_PRODUCT_ID[15] = gl_hdd_buffer[76];
  HDD_PRODUCT_ID[14] = gl_hdd_buffer[77];

}




/*********************************************************
*函数名称:WriteCommand(command)                          *
*函数用途:写命令                                         *
**********************************************************/
WriteCommand(command)
{
 do{ACC = FILE7;}while(BSY);
 FILE7 = command;
}

/**********************************************************
*函数名称:bit  ata_install(void)                          *
*用途:初始化硬盘                                          *
***********************************************************/
bit  ata_install(void)
{
 INTQ = 1;
 ARST = 0;

 ARST = 1;

 AUXR = 0x5c;         //设置EXT16=1,使能16-BIT传送模式

 do{FILE6 = 0xa0; ACC = FILE7;} while(!DRDY | BSY);
    FILE6 = 0x20;
    FILE2 = 64;
    FILE7 = 0x91;

 do{ACC = FILE7;} while(BSY);
    FILE7 = 0x10;

 do{ACC = FILE7;} while(BSY); 

 DriveID();

return OK;
}

/**********************************************************
*函数名称:HardDiskSleep(void)                             *
*用途:硬盘休眠                                            *
***********************************************************/
void HardDiskSleep(void)
{
 do{ACC = FILE7;} while(BSY); //wait for NO busy
 WriteCommand(0xe0);   //write command code
// do{ACC = FILE7;} while(BSY |! DRQ); //wait for noBUSY and data request
}
/**********************************************************
*函数名称:bit hdd_read_open(Uint32 hdd_sector)            *
*用途:读硬盘OPEN动作                                      *
***********************************************************/ 
bit hdd_read_open(Uint32 hdd_sector)
{   
   uint i = 0;
   uchar head,cylinderh,cylinderl,sector;
   hdd_current_sector = hdd_sector;
   head      = ((Byte*)&hdd_current_sector)[0];
   cylinderh = ((Byte*)&hdd_current_sector)[1];
   cylinderl = ((Byte*)&hdd_current_sector)[2];
   sector    = ((Byte*)&hdd_current_sector)[3];
   do{ACC = FILE7;} while(BSY); //wait for NO busy
     FILE6 = (0xe0 | (head & 0x0f)); 
     FILE5 = cylinderh;    //high 2-bit cylinder
     FILE4 = cylinderl;    //low 8-bit cylinder
     FILE3 = sector;       //start sector
     FILE2 = 0x01;         //sector counter
     WriteCommand(0x20);   //write command code
 
   do{ACC = FILE7;} while(BSY |! DRQ); //wait for noBUSY and data request

   ACC = FILE7;
   if (ERR)
     return KO;

   for (i = 0; i<512;)
      {
	    gl_hdd_buffer[i++]=FILE0;
        gl_hdd_buffer[i++]=DAT16H;
      }

      gl_hdd_buffer_ptr = 0;
	  gl_hdd_buffer_flag = 1;
	  return OK;

}


/**********************************************************
*函数名称:Byte hdd_read_byte(void)                        *
*用途:读硬盘缓存中的一个字节                              *
***********************************************************/ 
Byte hdd_read_byte(void)
{
 gl_hdd_buffer_ptr++;
 
 if (gl_hdd_buffer_ptr > 512)  
   {
    gl_hdd_buffer_ptr = 0;
    hdd_current_sector +=1;
    hdd_read_open(hdd_current_sector);
    gl_hdd_buffer_ptr++;
   }

 return (gl_hdd_buffer[gl_hdd_buffer_ptr - 1]);
}


/**********************************************************
*函数名称:bit hdd_read_close(void)                        *
*用途:读硬盘CLOSE动作                                     *
***********************************************************/ 
bit hdd_read_close(void)
{  
   gl_hdd_buffer_flag = 0;
   gl_hdd_buffer_ptr = 0;
   return OK;
}


/**********************************************************
*函数名称:bit hdd_read_one_sector(Uint32 hdd_sector)      *
*用途:将硬盘中一个扇区的数据送入USB接口                   *
***********************************************************/ 
bit hdd_read_one_sector(Uint32 hdd_sector)
{Byte i;

 if (hdd_read_open(hdd_sector) == OK)
 {
  for (i = 0; i < 8; i++)
     {
      Usb_select_ep(EP_IN);
                      /* read 64 bytes from card */
        Usb_write_byte(hdd_read_byte());        
        Usb_write_byte(hdd_read_byte());
        Usb_write_byte(hdd_read_byte());        
        Usb_write_byte(hdd_read_byte());
        Usb_write_byte(hdd_read_byte());        
        Usb_write_byte(hdd_read_byte());
        Usb_write_byte(hdd_read_byte());        
        Usb_write_byte(hdd_read_byte());
        Usb_write_byte(hdd_read_byte());        
        Usb_write_byte(hdd_read_byte());
        Usb_write_byte(hdd_read_byte());        

⌨️ 快捷键说明

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