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

📄 usbmain.c

📁 台湾凌阳单片机SPCE061A单芯片做的一个带按健LCD显示
💻 C
字号:
#include "usbmain.h"
#include "D12CI.h"
#define  BadBlockIndexBase      0xfd00
#define  UsedBlockIndexBase     0xfe00
/////////// 说明:共能存储13*4=52个目录信息
#define  IndexStringNameBase0   0xf000
#define  IndexStringNameBase1   0xf100
#define  IndexStringNameBase2   0xf200
#define  IndexStringNameBase3   0xf300
#define  IndexStringNameBase4   0xf400
#define  IndexStringNameBase5   0xf500
#define  IndexStringNameBase6   0xf600
#define  IndexStringNameBase7   0xf700
#define  IndexStringNameBase8   0xf800
#define  IndexStringNameBase9   0xf900
#define  IndexStringNameBase10  0xfa00
#define  IndexStringNameBase11  0xfb00
#define  IndexStringNameBase12  0xfc00
////////////
extern void F_Interrupt_On(void); 
extern void F_System_Initial(void);
extern void F_Clear_WatchDog(void);
extern void F_Reconnect_USB(void);
extern void F_Control_Handler(void);
extern void badblock_check(void);
extern EPPFLAGS bEPPflags;                   //USB协议处理数据缓冲区
extern unsigned int  MainEpBuf[];            //64字节接受数据缓冲区
extern unsigned int  OneRecByteNum;          //接受到的字节数目
CONTROL_TRANSFERS ControlData;               //协议处理
extern unsigned char databuffer[528];        //外部闪存数据缓冲区
extern unsigned int badblock_table[21],key_code,play_flag;      //坏块信息表

struct _file_infor
{
   unsigned int index;
   long         size;
   unsigned int  type;
   unsigned int  year;
   unsigned int  month;
   unsigned int  date;
   unsigned int  name_length;
   unsigned char name[40];
}  file_infor;

unsigned int FileNameBuffer[4*64];
unsigned int *s,*d;
main() 
{  
    unsigned char data_page_count=0,length=0;  //传送数据次数
    unsigned int  real_write_page,real_write_byte,temp,i,k;
    unsigned int  block_used_table[50];    
    

    key_code=0;
    play_flag=1;
	F_System_Initial();
	F_Reconnect_USB();  //PDIUSBD12芯片的软连接
	F_Interrupt_On();
    F_Clear_WatchDog();
  	lcd_clr();
  	lcd_clr();
    s=(unsigned int *)BadBlockIndexBase;
    d=badblock_table;
	for(i=0;i<21;i++)  
      {		                             //读去坏块记录
	    *d++=F_FlashRead(s++); 
	  }
//   play(0);
//	F_FlashErase(0xfe00);                      // 写入已用块数
//	F_FlashWrite1Word(0xfe00+1,00);

	while( TRUE )
	{   
	    if (bEPPflags.bits.bus_reset)    //总线复位处理
		{
		 	bEPPflags.bits.bus_reset = 0;//清标志
		}   
		if (bEPPflags.bits.suspend)//总线挂起处理
	    {
		    bEPPflags.bits.suspend= 0;//清标志
		} 
		if (bEPPflags.bits.setup_packet)//协议处理
		{
			bEPPflags.bits.setup_packet = 0;//清标志
			F_Control_Handler();
		}
	    if(bEPPflags.bits.ep2_rxdone==1)
		{
			bEPPflags.bits.ep2_rxdone = 0;//清标志
			F_D12_WriteEndpoint(5,1,0x00);   //发送写完回应信号
		switch(MainEpBuf[63])
	           {  case 0x00:  
	                   s=MainEpBuf;
				       d=(unsigned int *)(&databuffer[data_page_count*60]);
	                   for(i=0;i<=47;i++)
	                      {
	                        *d++=(unsigned char)(*s++);
	                      }
	                   data_page_count=0;
						  
	                   real_write_page=((MainEpBuf[49]<<8)|0x00ff)&(MainEpBuf[48]|0xff00);
					  
	                  if(MainEpBuf[62]==0x00)    //文件末尾的处理
	                            { 
	                              
	                               s=(unsigned int *)UsedBlockIndexBase;
			                       d=block_used_table;
	                               for(i=0;i<50;i++)
	                              	{
	                                   *d++=F_FlashRead(s++);
	                              	}
								  
	                                temp=block_used_table[0];//得到语音段数
	                               
	                                block_used_table[temp+1]=(real_write_page/32);//write 本段语音末块数
	                                block_used_table[0]=temp+1;//MODIFY INDEX
	                                
	                                F_FlashErase(UsedBlockIndexBase); 
	                                for(i=0;i<50;i++)  
	                                   {         //察除内部FLASH的记录块
	                                      F_FlashWrite1Word(UsedBlockIndexBase+i,block_used_table[i]);//写入已用块数记录
	                                   }
                                      
										
	                             }
	                  real_write_page=logicaddr_to_phyaddr(real_write_page);
	                  
	                  if((real_write_page%32)==0) 
	                    { //整块开始标志
	                       block_erase(real_write_page/32); //察除块
	                    }  
	                  page_program(real_write_page);   //页写
	                  
	                  F_D12_WriteEndpoint(5,1,0x00);   //发送写完回应信号
	                  break;
	              case 0x01 :
				       s=MainEpBuf;
				       d=(unsigned int *)(&databuffer[data_page_count*60]);
	                   for(i=0;i<=59;i++)
	                      	{
	                                *d++=(unsigned char)(*s++);
	                      	}
	                    data_page_count++;
	                    break; 
	              case 0x02 :    // 得到已用块数
				  	
	                        temp=F_FlashRead(UsedBlockIndexBase);
	                        temp=F_FlashRead(UsedBlockIndexBase+temp);
	                        MainEpBuf[0]=(unsigned char)temp;
	                        MainEpBuf[1]=(unsigned char)(temp >>8);  
				            F_D12_WriteEndpoint(5,2,MainEpBuf);//send blocknum by user
			           break;
			    case  0x06:    //保存语音信息  
			                  //    
			                       s=(unsigned int *)UsedBlockIndexBase;
			                       temp=*s-1;//得到语音段数
	                              	 
	                                s=(unsigned int *)(IndexStringNameBase0+(temp/4)*0x0100); 
	                                d=(unsigned int *)FileNameBuffer;  
	                                for(i=0;i<((temp%4)*64);i++)
	                                  {
	                                     *d++=*s++;
	                                  }
	                                d=(unsigned int *)(IndexStringNameBase0+(temp/4)*0x0100); 
	                                s=(unsigned int *)FileNameBuffer; 
	                                F_FlashErase(IndexStringNameBase0+(temp/4)*0x0100); 
	                                                             
	                                for(i=0;i<((temp%4)*64);i++)
	                                  {
	                                    F_FlashWrite1Word(IndexStringNameBase0+(temp/4)*0x0100+i,FileNameBuffer[i]);
	                                  }
	                                for(k=0;k<64;k++)  
			                            {                          //保存坏块记录
	                                     F_FlashWrite1Word(IndexStringNameBase0+k+i,MainEpBuf[k]);  
	                   	                }
	                 break;
		        case  0x04:             // 发送语音信息的名
		        
		               s=(unsigned int *)UsedBlockIndexBase;
			          temp=*s;//得到语音段数
		    
		               s=(unsigned int *)IndexStringNameBase0;
					   if(temp!=0xffff)
					   {
		                 for(k=0;k<temp;k++)
		                   {
				             d=MainEpBuf;
				             for(i=0;i<64;i++)
                             	{
                                   *d++=*s++; 
                                }
                             MainEpBuf[63]=k;                //未完成标志      
                             F_D12_WriteEndpoint(5,64,MainEpBuf); 
		                   }
		                }
		                 MainEpBuf[63]=0xaa;                    //发送完成标志
                         F_D12_WriteEndpoint(5,64,MainEpBuf); 
			        break;
		      case  0x05 :           //  快速格式化

				      s=(unsigned int *)UsedBlockIndexBase;	
			          F_FlashErase(s); 
			          for(i=0;i<50;i++)           //察除内部FLASH的记录块
	                   	   {
	                           F_FlashWrite1Word(s++,0);//写入已用块数记录
	                   	   }
                      F_FlashErase(BadBlockIndexBase); 
	                  for(i=0;i<21;i++)  
			               {                          //保存坏块记录
	                         F_FlashWrite1Word(BadBlockIndexBase+i,badblock_table[i]);  
	                   	   }
	                   
	                   F_D12_WriteEndpoint(5,1,0);   //发送写完回应信号
				      break;
		      case   0x03 :           // 格式化  
				  	
				        s=(unsigned int *)UsedBlockIndexBase;	
			            F_FlashErase(s); 
			            for(i=0;i<50;i++)           //察除内部FLASH的记录块
	                   	   {
	                           F_FlashWrite1Word(s++,0);//写入已用块数记录
	                   	   }
						
	                     badblock_check();                //坏块检测
	                     F_FlashErase(BadBlockIndexBase); 
	                   for(i=0;i<21;i++)  
			                   {                          //保存坏块记录
	                             F_FlashWrite1Word(BadBlockIndexBase+i,badblock_table[i]);  
	                   	       }
	               break;
			     default: break;
			     }  //end case    
			          
		    }      //end if              //发送接收到的字节,OneRecByteNum<=64
		 
	//	add_key();
		F_Clear_WatchDog();
	} // End while

}


⌨️ 快捷键说明

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