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

📄 ch375.i

📁 AVR单片机系统开发经典实例部分源程序
💻 I
字号:
#line 1 "C:\AVR\OK\ch375.c"
#line 1 "C:\AVR\OK/ch375.h"


unsigned int WordSwap(unsigned int input);
unsigned int LSwapINT16(unsigned short dData1,unsigned short dData2);
unsigned long LSwapINT32(unsigned long dData1,unsigned long dData2,unsigned long dData3,unsigned long dData4);
unsigned char ch375_init( unsigned char mode);
unsigned char set_usb_mode( unsigned char mode );
unsigned char get_ver(void);
void usb_send_data(unsigned char *pbuff,unsigned int len);
void m_nop(unsigned char m);
unsigned char EnumMassDev(void);
unsigned char InitDisk(void);
unsigned char  ReadSector(unsigned long iLbaStart, unsigned char iSectorCount,unsigned char *oDataBuffer);
unsigned char  WriteSector(unsigned long iLbaStart, unsigned char iSectorCount,unsigned char *oDataBuffer);
extern unsigned char diskbuff[512*2];






































































































































































































































#line 2 "C:\AVR\OK\ch375.c"

unsigned char usb_rec_buff[64];
unsigned char usb_rec_buflen;
unsigned char diskbuff[512*2];


void m_nop(unsigned char m)
{
  while(m--)
  _NOP();
  _NOP();
}

unsigned char set_usb_mode( unsigned char mode )
{
				   unsigned char i;
				   unsigned char RD_Data;

(*(volatile unsigned char *)0xa001)= 0x15;
				   nop();
				   nop();
				   nop();
				   nop();
(*(volatile unsigned char *)0xa000)=mode;
                   nop();
				   for( i=100; i!=0; i-- )
				   		{
						RD_Data=(*(volatile unsigned char *)0xa000);
						if( RD_Data == 0x51 )
						return 1;
						}
						return 0;
}

unsigned char ch375_init(unsigned char mode)
{
	 unsigned char i, k;
	 unsigned char RD_Data;
	 EIMSK|=0x10;

	for( k=100; k!=0; k-- )
	   {
(*(volatile unsigned char *)0xa001)= 0x06 ;
		nop();
		nop();
		nop();
		nop();
		nop();

(*(volatile unsigned char *)0xa000)=0x0f;

		 nop();
		i=(*(volatile unsigned char *)0xa000);
	    if ( 0xf0!= i)
	    {
		    for ( i=5; i!=0; i-- )
(*(volatile unsigned char *)0xa001)= 0x05;
			 delay_ms(50);
	    }
		else
    	  break;
	   }
	  if( k==0 )
	   return 0;







	return set_usb_mode(mode);
}

unsigned char get_ver(void)
{  unsigned char ver;
(*(volatile unsigned char *)0xa001)=0x01;
	ver=(*(volatile unsigned char *)0xa000);
    return ver;
}



void _usb_send(unsigned char *pbuff,unsigned char len)
{
     unsigned char i,status;
(*(volatile unsigned char *)0xa001)= 0x2B;
	 nop();
	 nop();
	 nop();
(*(volatile unsigned char *)0xa000)=len;

	 nop();
     for(i=0;i<len;i++)
	 {
(*(volatile unsigned char *)0xa000)=pbuff[i];
		nop();
	 }
	while(status!= 0x0A)
	{
(*(volatile unsigned char *)0xa001)= 0x22;
	nop();
	nop();
	nop();
    status=(*(volatile unsigned char *)0xa000);
	nop();
	nop();
	nop();
	}
}
void usb_send_data(unsigned char *pbuff,unsigned int len)
{
     unsigned char i,status,r,n;
     EIMSK&=~0x10;
	  r=len/64;
	  n=len%64;
	  for(i=0;i<r;i++)
	  _usb_send((pbuff+i*64),64);
	  _usb_send((pbuff+i*64),n);

(*(volatile unsigned char *)0xa001)= 0x23;
	 nop();
     EIMSK|=0x10;

}




unsigned char waitint(void)
{
  while(PINE&0x10);
(*(volatile unsigned char *)0xa001)= 0x22;
  m_nop(10);
  return(*(volatile unsigned char *)0xa000);

}
unsigned char InitDisk(void)
{
   unsigned char status;
(*(volatile unsigned char *)0xa001)= 0x22;
   m_nop(10);
   status=(*(volatile unsigned char *)0xa000);
   if (status== 0x16) return status;
(*(volatile unsigned char *)0xa001)= 0x51;
   status=waitint();
   if (status!= 0x14) return status;
(*(volatile unsigned char *)0xa001)= 0x53;
   status=waitint();
   if (status!= 0x14)
   {
      delay_ms(250);
(*(volatile unsigned char *)0xa001)= 0x53;
      status=waitint();
   }
    if (status!= 0x14) return status;
	return 1;
}

unsigned char  ReadSector(unsigned long iLbaStart, unsigned char iSectorCount,unsigned char *oDataBuffer)
{
  unsigned int  mBlockCount;
  unsigned char  c;
(*(volatile unsigned char *)0xa001)= 0x54;
  m_nop(10);
(*(volatile unsigned char *)0xa000)=(unsigned char)iLbaStart;
  m_nop(2);
(*(volatile unsigned char *)0xa000)=(unsigned char)(iLbaStart >> 8);
  m_nop(2);
(*(volatile unsigned char *)0xa000)=(unsigned char)(iLbaStart>> 16);
  m_nop(2);
(*(volatile unsigned char *)0xa000)=(unsigned char)(iLbaStart>> 24);
  m_nop(2);
(*(volatile unsigned char *)0xa000)=iSectorCount ;
  for ( mBlockCount = iSectorCount * 8; mBlockCount != 0; mBlockCount -- )
  {
       c = waitint();
     if ( c == 0x1D )
    	 {
(*(volatile unsigned char *)0xa001)= 0x28;
	     m_nop(10);
         c =(*(volatile unsigned char *)0xa000);
	     m_nop(2);
         while ( c -- )
     	  {
	     *oDataBuffer++ =(*(volatile unsigned char *)0xa000);
	      m_nop(2);
	      }
(*(volatile unsigned char *)0xa001)= 0x55;
       }
    else break;
  }
  if ( mBlockCount == 0 )
  {
    c = waitint();
    if ( c== 0x14 ) return( 1 );
  }
  return( c );
}

unsigned char  WriteSector(unsigned long iLbaStart, unsigned char iSectorCount,unsigned char *oDataBuffer)
{
  unsigned int  mBlockCount;
  unsigned char  c;
(*(volatile unsigned char *)0xa001)= 0x56;
  m_nop(10);
(*(volatile unsigned char *)0xa000)=(unsigned char)iLbaStart;
  m_nop(2);
(*(volatile unsigned char *)0xa000)=(unsigned char)(iLbaStart >> 8);
  m_nop(2);
(*(volatile unsigned char *)0xa000)=(unsigned char)(iLbaStart>> 16);
  m_nop(2);
(*(volatile unsigned char *)0xa000)=(unsigned char)(iLbaStart>> 24);
  m_nop(2);
(*(volatile unsigned char *)0xa000) =iSectorCount;
  for ( mBlockCount = iSectorCount * 8; mBlockCount != 0; mBlockCount -- )
  {
       c = waitint();
     if ( c == 0x1E )
    	 {
(*(volatile unsigned char *)0xa001)= 0x2B;
	     m_nop(10);
		 c=64;
(*(volatile unsigned char *)0xa000) =c;
	     m_nop(2);
         while ( c -- )
     	  {
(*(volatile unsigned char *)0xa000)= *oDataBuffer++ ;
	      m_nop(2);
	      }
(*(volatile unsigned char *)0xa001)= 0x57;
       }
    else break;
  }
  if ( mBlockCount == 0 )
  {
    c = waitint();
    if ( c== 0x14 ) return( 1 );
  }
  return( c );
}

unsigned int WordSwap(unsigned int input)
{
	return(((input&0x00FF)<<8)|((input&0xFF00)>>8));
}



unsigned int LSwapINT16(unsigned short dData1,unsigned short dData2)
{
    unsigned int  dData;
    dData = ((dData2<<8)&0xff00)|(dData1&0x00ff);
	return dData;
}

unsigned long LSwapINT32(unsigned long dData1,unsigned long dData2,unsigned long dData3,unsigned long dData4)
{
    unsigned long  dData;
    dData = ((dData4<<24)&0xff000000)|((dData3<<16)&0xff0000)|((dData2<<8)&0xff00)|(dData1&0xff);
	return dData;
}
unsigned char EnumMassDev(void)
{   unsigned char c;
	unsigned int ReservedSectorsNum;


#line 280 "C:\AVR\OK\ch375.c"


	DeviceInfo.BPB_BytesPerSec=512;


#line 290 "C:\AVR\OK\ch375.c"

	c=ReadSector(0x0,1,diskbuff);
	if(c!=1) return c;

	if(diskbuff[0]==0xeb||diskbuff[0]==0xe9)
		{
		DeviceInfo.StartSector=0;
		}
	else
		{
		DeviceInfo.StartSector=LSwapINT32(diskbuff[454],diskbuff[455],diskbuff[456],diskbuff[457]);
		c=ReadSector(DeviceInfo.StartSector,1,diskbuff);
	    if(c!=1) return c;
		}



	DeviceInfo.BPB_BytesPerSec=LSwapINT16(diskbuff[11],diskbuff[12]);
	DeviceInfo.BPB_SecPerClus=diskbuff[13];
	ReservedSectorsNum=LSwapINT16(diskbuff[14],diskbuff[15]);
	DeviceInfo.BPB_NumFATs=diskbuff[16];

	if(diskbuff[82]=='F'&&diskbuff[83]=='A'&&diskbuff[84]=='T'&&diskbuff[85]=='3'&&diskbuff[86]=='2')
		{
		DeviceInfo.BPB_TotSec32=LSwapINT32(diskbuff[32],diskbuff[33],diskbuff[34],diskbuff[35]);
		DeviceInfo.BPB_FATSz32=LSwapINT32(diskbuff[36],diskbuff[37],diskbuff[38],diskbuff[39]);
		DeviceInfo.RootStartCluster=LSwapINT32(diskbuff[44],diskbuff[45],diskbuff[46],diskbuff[47]);
		DeviceInfo.FatStartSector=DeviceInfo.StartSector+ReservedSectorsNum;
		DeviceInfo.FirstDataSector=DeviceInfo.FatStartSector+DeviceInfo.BPB_NumFATs*DeviceInfo.BPB_FATSz32;
		DeviceInfo.TotCluster=(DeviceInfo.BPB_TotSec32-DeviceInfo.FirstDataSector+1)/DeviceInfo.BPB_SecPerClus+1;

		DeviceInfo.FAT=1;
		}
	else
		{
		DeviceInfo.BPB_RootEntCnt=LSwapINT16(diskbuff[17],diskbuff[18]);
		DeviceInfo.BPB_RootEntCnt=(DeviceInfo.BPB_RootEntCnt)*32/DeviceInfo.BPB_BytesPerSec;
		DeviceInfo.BPB_TotSec16=LSwapINT16(diskbuff[19],diskbuff[20]);
		DeviceInfo.BPB_FATSz16=LSwapINT16(diskbuff[22],diskbuff[23]);
		DeviceInfo.FatStartSector=DeviceInfo.StartSector+ReservedSectorsNum;
		DeviceInfo.RootStartSector=DeviceInfo.StartSector+DeviceInfo.BPB_NumFATs*DeviceInfo.BPB_FATSz16+ReservedSectorsNum;
		DeviceInfo.FirstDataSector=DeviceInfo.FatStartSector+DeviceInfo.BPB_NumFATs*DeviceInfo.BPB_FATSz16+DeviceInfo.BPB_RootEntCnt;
		DeviceInfo.FAT=0;
		}



	return 1;
}


#pragma interrupt_handler usb_int:iv_INT4
void usb_int(void)
{
    unsigned char status,len,i;
(*(volatile unsigned char *)0xa001)= 0x22;
	 nop();
     nop();
	 nop();
	 nop();
	 nop();
	 nop();
    status=(*(volatile unsigned char *)0xa000);

    switch(status)
	{case 0x02 :
(*(volatile unsigned char *)0xa001)= 0x28;
		  nop();
		  nop();
		  nop();
		  nop();
		  nop();
		  nop();
		  usb_rec_buflen=(*(volatile unsigned char *)0xa000);
		  nop();


		  if (usb_rec_buflen!=0)
		  {
		     for(i=0;i<usb_rec_buflen;i++)
			 usb_rec_buff[i]=(*(volatile unsigned char *)0xa000);
			 nop();

		  }
		  break;



    case 0x15 :
	     EIMSK&=~0x10;
		 delay_ms(250);


		 return;
     default :
(*(volatile unsigned char *)0xa001)= 0x23;
		  nop();
		  nop();
		  nop();

	}

}

⌨️ 快捷键说明

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