📄 sl811_host.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 + -