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

📄 sl811_host.h

📁 用SL811做USB主机的源码
💻 H
字号:
//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"


uint16 Counter1ms = 0;

//#pragma interrupt_handler int0_isr:8
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!");   
	  UDisk_Present = 0;
	}
 	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);
}


void lg_main(void)
{
 uint8 temp;
 uint16 i;
 FILE_INFO fileinfo;
 uint8 filenumber;
 
 //while(!UDisk_Present);
 A17_A16_low
 
 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");
 		if (temp != 0) {UDisk_Present=0;return;}

 		Fat_Initial();
		List_Fat();
		page=1;

 		UDisk_Present=0;
 }
 return;
}


void wrfile(void)
{
 uint8 temp;
 uint16 i;
 FILE_INFO fileinfo;
 uint8 filenumber;
 uint8 filecontent[32];

 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 + -