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

📄 sl811_host.c

📁 用SL811做USB主机的源码
💻 C
字号:
//ICC-AVR application builder : 2004-1-4 16:51:43
// Target : M128
// Crystal: 16.000Mhz

#include <iom128v.h>
#include <macros.h>
#include <stdio.h>
#include "comm_def.h"
#include "delay.h"
#include "Udisk.h"
#include "fat.h"
/*
void port_init(void)
{
 PORTA = 0xFF;
 DDRA  = 0xFF;
 PORTB = 0xFF;
 DDRB  = 0x00;
 PORTC = 0xFF; //m103 output only
 DDRC  = 0xFF;
 PORTD = 0xFF;
 DDRD  = 0xF0;
 PORTE = 0xFF;
 DDRE  = 0x00;
 PORTF = 0xFF;
 DDRF  = 0x00;
 PORTG = 0x1F;
 DDRG  = 0x18;
}

//UART0 initialisation
// desired baud rate: 9600
// actual: baud rate:9615 (0.2%)
// char size: 8 bit
// parity: Disabled

void uart0_init(void)
{
 UCSR0B = 0x00; //disable while setting baud rate
 UCSR0A = 0x00;
 UCSR0C = 0x06;
 UBRR0L = 0x67; //set baud rate lo
 UBRR0H = 0x00; //set baud rate hi
 UCSR0B = 0x18;
}

//call this routine to initialise all peripherals
void init_devices(void)
{
 //stop errant interrupts until set up
 CLI(); //disable all interrupts
 XDIV  = 0x00; //xtal divider
 XMCRA = 0x4E; //external memory
 port_init();
 uart0_init();

 MCUCR = 0xC0; // 0xc0
 EICRA = 0x00; //extended ext ints
 EICRB = 0x00; //extended ext ints
 EIMSK = 0x01;
 TIMSK = 0x00; //timer interrupt sources 0x04
 ETIMSK = 0x00; //extended timer interrupt sources
 //all peripherals are now initialised
}
*/
uint16 Counter1ms = 0;

#pragma interrupt_handler int0_isr:2
void int0_isr(void)
{
 uint8 Interrupt;

 SL811_ADDR = SL811_Interrupt_Status;
 Interrupt = SL811_COMM;
 if(permit_print)printf("Interrupt status is %x\n",Interrupt);  
 
 if(Interrupt & 0x20)
 {
    if(Interrupt & 0x80)
    {
      puts("FS device ready!");
	  UDisk_Present = 1;
    }
    else if((Interrupt & 0x40) == 0)
    {
      puts("LS device ready!");  
    }
	else
	{
	  puts("Device removed!");   
	}
 	SL811_ADDR = SL811_Interrupt_Status;
 	SL811_COMM = Interrupt; 		  //Clear interrupt flag 	
	return;	
 } //End of if(Interrupt & 0x20)
 
 if(Interrupt & 0x10)
 {
    Counter1ms++;
    if(Counter1ms == 5000) PORTG = 0x07;
 }
 
 if(Interrupt & 0x01)	   			  //USBA interrupt
 {
    SL811_ADDR = SL811_USBA_PIDDEoUS;
	USBA_Status = SL811_COMM;
	if(permit_print)printf("USBA Int Status is %x\n",USBA_Status);
 }
 
 if(Interrupt & 0x02)	   			  //USBB interrupt
 {
    SL811_ADDR = SL811_USBB_PIDDEoUS;
	USBB_Status = SL811_COMM; 
 }
 
 SL811_ADDR = SL811_Interrupt_Status;
 SL811_COMM = Interrupt; 		      //Clear interrupt flag 
 return;
}


uint16 CalculateTime(uint8 Hr,uint8 Min,uint8 Sec)
{
 return (Hr*2048+Min*32+Sec+2);
}

uint16 CalculateDate(uint16 Year,uint8 Mon,uint8 Date)
{
 return ((Year-1980)*512+Mon*32+Date);
}

uint8 filecontent[32];
//
void lg_main(void)
{
 uint8 temp;
 uint16 i;
 FILE_INFO fileinfo;
 uint8 filenumber;
 
 //init_devices();
 //insert your functional code here...



/*
 puts("Begin to run!");
 init_sl811_master();
 SEI();
*/
 //while(!UDisk_Present);
 if (UDisk_Present)
 {
 puts("Begin to test!");

 temp = SL811_ConfigUDisk();	  	   		  // return 0 if success
 printf("Config func return %x\n",temp);
 if(YES_UDisk) puts("MassStorage connected!\n");
 while(temp);
 
 //BusResetSlave(); 		 				  //Test pass 	

 Fat_Initial();

 puts("\nContent from file AUTOEXEC.BAT is:");	 //Test pass 	
 ReadFile4Print("AUTOEXECBAT");		  			 //Test pass 	
 //while(1);
 }
}/*
 //DeleteFile("AUTOEXECBAT");						 //Test pass 	
 //puts("Finish Delete File!");						 //Test pass 	
 
 //DeleteAllFiles();   								 //Test pass 			
 //puts("Finish delete all files!");				 //Need sevral minutes
 
 fileinfo.FileName[0] = 'A';
 fileinfo.FileName[1] = 'A';
 fileinfo.FileName[2] = 'A';
 fileinfo.FileName[3] = 'A';  
 fileinfo.FileName[4] = 'A';
 fileinfo.FileName[5] = 'A';
 fileinfo.FileName[6] = 'A';
 fileinfo.FileName[7] = 'A';  
 
 fileinfo.FileExtName[0] = 'D';
 fileinfo.FileExtName[1] = 'A';
 fileinfo.FileExtName[2] = 'T';  
 fileinfo.Attribute = 0;
 fileinfo.FileNewModifyTime = CalculateTime(20,14,27);
 fileinfo.FileNewModifyDate = CalculateDate(2004,4,11);
 
 filenumber = CreatFile(&fileinfo, 1);
 if(filenumber == 0xFF) puts("Create file error!");
 else puts("Create file success!");
 
 for(i=0;i<32;i++) filecontent[i] = i;
 WriteFile(filenumber,filecontent,32);
 printf("CloseFile return %x\n",CloseFile(filenumber));

 while(1);
}


// uint8 ReadFileDirectly(uint8* FileName, uint8* pBuffer, uint32 num);
// ReadFile4Print(uint8* FileName);
// DetectFile(uint8* FileName);
// OpenFile(uint8* FileName);
// ReadFile(uint8 filenum, uint32 allocate, uint8* pBuffer, uint32 num);
// DeleteFile(uint8* FileName);
// DeleteAllFiles(void);
// CreatFile(FILE_INFO* pfileinfo, uint8 Delete);
// WriteFile(uint8 filenum,uint8* pBuffer,uint32 length);
// uint8 WriteFileDirectly(FILE_INFO* pfileinfo, uint8 Delete, uint8* pBuffer, uint32 length);
// CloseFile(uint8 filenum);

//uint16 CalculateTime(uint8 Hr,uint8 Min,uint8 Sec);
//uint16 CalculateDate(uint16 Year,uint8 Mon,uint8 Date);

/*
typedef struct
{
  uint8	   FileName[8]; 		//文件正名 
  uint8    FileExtName[3]; 		//文件扩展名
  uint8	   Attribute; 			//文件属性
  uint8	   Nouse0[2]; 			//仅长文件名目录项用,用来存储其对应的短文件名目录项的文件名字节校验和等。 
  uint16   FileTime; 			//16位二进制的文件建立时间,其中的高5位为小时,次6位为分钟。 
  uint16   FileDate;			//16位二进制的文件建立日期,其中的高7位为相对于1980年的年份值,次4位为月份,后5位为月内日期。
  uint16   FileNewAccessDate;   //16位二进制的文件访问日期,其中的高7位为相对于1980年的年份值,次4位为月份,后5位为月内日期。
  uint16   High16;			    //起始簇号的高16位。	
  uint16   FileNewModifyTime;   //16位二进制的文件最新修改时间,其中的高5位为小时,次6位为分钟,后5位的二倍为秒数。
  uint16   FileNewModifyDate;   //16位二进制的文件最新修改日期		
  uint16   Low16;			    //起始簇号的低16位。 
  uint32   FileLength; 			//32位的文件字节长度。																	 
}FILE_INFO;
*/

⌨️ 快捷键说明

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