📄 sl811.c
字号:
return COMPLETED;
}
/****************************************************************************************/
// WRITE_SECTOR Function
/****************************************************************************************/
unsigned char sl811_write_sector(unsigned long sector, void * buf0)
{
unsigned char tmp,i;
unsigned char *buf=buf0;
sl811_usb_ready();
while(sl811_usb_ready() !=0)pause_ms(20);
//Fill buffer
sl811_write(0x10, 'U');
sl811_write_next('S');
sl811_write_next('B');
sl811_write_next('C');
sl811_write_next('P');
sl811_write_next('I');
sl811_write_next('K');
sl811_write_next('A');
sl811_write_next(0x00);
sl811_write_next(0x02); //512 bytes
sl811_write_next(0x00);
sl811_write_next(0x00);
sl811_write_next(0x00);
sl811_write_next(0x00);
sl811_write_next(0x0C);
sl811_write_next(0x2A); //WRITE
sl811_write_next(0x00);
sl811_write_next(sector>>24);
sl811_write_next(sector>>16);
sl811_write_next(sector>>8);
sl811_write_next(sector);
sl811_write_next(0x00);
sl811_write_next(0x00);
sl811_write_next(0x01); //sector number
sl811_write_next(0x00);
sl811_write_next(0x00);
sl811_write_next(0x00);
sl811_write_next(0x00);
sl811_write_next(0x00);
sl811_write_next(0x00);
sl811_write_next(0x00);
tmp = 0;
while(tmp ==0)
{
sl811_write(0x01, 0x10);
sl811_write(0x02, 0x1F); //size
sl811_write(0x03, 0x10 + endp_out); //PID OUT ENDP1
sl811_write(0x04, adr); //device address
sl811_write(0x0D, 0x01);
if((data_toggle & 0x01) == 0)sl811_write(0x00, 0x27);
else sl811_write(0x00, 0x67);
for(tmp=255; tmp!= 0; tmp--)
{
asm("nop");
}
while((sl811_read(0x0D)&0x01) == 0);
if((sl811_read(0x03)&0x01) == 1)tmp =2;
}
data_toggle = data_toggle ^ 0x01;
//send 8 OUT packets of 64 bytes each
for(i=0; i!= 8; i++)
{
pause_ms(1);
tmp = 0;
while(tmp ==0)
{
sl811_write_buf(0x10, buf + (i*0x40), 0x40);
sl811_write(0x01, 0x10);
sl811_write(0x02, 0x40); //size 64
sl811_write(0x03, 0x10 + endp_out); //PID OUT ENDP1
sl811_write(0x04, adr); //device address
sl811_write(0x0D, 0x01);
if((data_toggle & 0x01) == 0)sl811_write(0x00, 0x27);
else sl811_write(0x00, 0x67);
for(tmp=255; tmp!= 0; tmp--)
{
asm("nop");
}
while((sl811_read(0x0D)&0x01) == 0);
if((sl811_read(0x03)&0x01) == 1)
{
tmp =2;
}
}
data_toggle = data_toggle ^ 0x01;
}
pause_ms(1);
ClearLcd();
//get CSW "USBS" to verify errors
tmp =0;
while(tmp == 0)
{
sl811_write(0x01, 0x10);
sl811_write(0x02, 0x0D); //size
sl811_write(0x03, 0x90 + endp_in); //PID IN
sl811_write(0x04, adr); //device address
sl811_write(0x0D, 0x01);
sl811_write(0x00, 0x23); //send cmd
for(tmp=255; tmp!= 0; tmp--)
{
asm("nop");
}
while((sl811_read(0x0D)&0x01) == 0);
if((sl811_read(0x03)&0x01) == 1)
{
tmp =2;
}
}
ClearLcd();
GotoXY(1,0);
Print("CSW OK");
pause_ms(80);
if(sl811_read(0x10+ 0x0C) != 0)return ERROR;
return COMPLETED;
}
/****************************************************************************************/
// USB_READY Function
/****************************************************************************************/
unsigned char sl811_usb_ready(void)
{
unsigned char tmp;
//fill buffer
sl811_write(0x10, 'U');
sl811_write_next('S');
sl811_write_next('B');
sl811_write_next('C');
sl811_write_next('P');
sl811_write_next('I');
sl811_write_next('K');
sl811_write_next('A');
sl811_write_next(0x00);
sl811_write_next(0x00);
sl811_write_next(0x00);
sl811_write_next(0x00);
sl811_write_next(0x00);
sl811_write_next(0x00);
sl811_write_next(0x0C);
sl811_write_next(0x00); //TEST UNIT READY
sl811_write_next(0x00);
sl811_write_next(0x00);
sl811_write_next(0x00);
sl811_write_next(0x00);
sl811_write_next(0x00);
sl811_write_next(0x00);
sl811_write_next(0x00);
sl811_write_next(0x00);
sl811_write_next(0x00);
sl811_write_next(0x00);
sl811_write_next(0x00);
sl811_write_next(0x00);
sl811_write_next(0x00);
sl811_write_next(0x00);
sl811_write_next(0x00);
tmp = 0;
while(tmp ==0)
{
sl811_write(0x01, 0x10);
sl811_write(0x02, 0x1F); //size
sl811_write(0x03, 0x10 + endp_out); //PID OUT + ENDP
sl811_write(0x04, adr); //device address
sl811_write(0x0D, 0x01);
if((data_toggle & 0x01) == 0)sl811_write(0x00, 0x27);
else sl811_write(0x00, 0x67);
data_toggle = data_toggle ^ 0x01;
for(tmp=255; tmp!= 0; tmp--)
{
asm("nop");
}
while((sl811_read(0x0D)&0x01) == 0);
if((sl811_read(0x03)&0x01) == 1)tmp =2;
}
pause_ms(1);
//get CSW "USBS" to verify errors
tmp =0;
while(tmp == 0)
{
sl811_write(0x01, 0x10);
sl811_write(0x02, 0x0D); //size
sl811_write(0x03, 0x90 + endp_in); //PID IN
sl811_write(0x04, adr); //device address
sl811_write(0x0D, 0x01);
sl811_write(0x00, 0x23); //send cmd
for(tmp=255; tmp!= 0; tmp--)
{
asm("nop");
}
while((sl811_read(0x0D)&0x01) == 0);
if((sl811_read(0x03)&0x01) == 1)tmp =2;
}
if((sl811_read(0x04) == 0) && (sl811_read(0x1C) == 0))return READY;
else return BUSY;
}
/***************************************************************************************/
//SL811_INIT Function
/****************************************************************************************/
void sl811_init(void) //设备插入之前初始化
{
// TRISB0=1;
TRISE0=0;
TRISE1=0;
TRISE2=0;
// TRISD=0xFF;
A0 = 0;
NRD = 1;
NWR = 1;
pause_ms(1);
sl811_write(0x06, 0x60);
sl811_write(0x0F, 0xae);
sl811_write(0x05, 0x08);
sl811_write(0x05, 0x00);
sl811_write(0x0F, 0xae);
sl811_write(0x05, 0x08);
pause_ms(10);
sl811_write(0x05, 0x00);
pause_ms(1);
sl811_write(0x0D, 0xFF);
}
/****************************************************************************************/
//SL811_START Function
/****************************************************************************************/
unsigned char sl811_start() //设备插入以后对设备初始化
{
unsigned char tmp;
unsigned char added_temp; //added
//adr=0x01;
data_toggle =0; //init toggle data_toggle 第一次出现,已赋值
pause_ms(10);
pause_ms(10);
tmp = 255;
while(tmp != 0) //wait device full speed
{
pause_ms(4);
/********wait device*********/
GotoXY(1,1);
Print("wait device.");
/********************/
if(!(sl811_read(0x0D)& 0x40))
{
tmp = 0; //read bit "device detected"
}
}
GotoXY(2,1);
Print("device ok!");
if((sl811_read(0x0D) & 0x80) == 0)
{
GotoXY(1,1);
Print("low speed!!");
pause_ms(10);
return NOT_FULL_SPEED; //return error if low speed device detected
}
else{
// RB1=0;
// pause_ms(50);
GotoXY(1,1);
Print("high speed!!");
pause_ms(100);
}
GotoXY(2,1);
Print("device initial..!!");
sl811_write(0x01, 0x10); //EP0Address
sl811_write(0x09, 0x50); //EP1Address
sl811_write(0x0F, 0xAE); //config host & frame generator prescaler cSOFcnt
sl811_write(0x0E, 0xE0); //cDATASet
sl811_write(0x05, 0x01); //CtrlReg
sl811_write(0x00, 0x01); //EP0Control
sl811_write(0x04, 0x00); //device address
pause_ms(50);
adr = 0;
sl811_write(0x05, 0x09); //reset usb device
pause_ms(20);
sl811_write(0x05, 0x01);
pause_ms(50); //wait 50 ms
adr = 1;
sl811_set_addr(); //Set Address : address will be 0x01 adr 第一次出现 adr 要先初始化,可为0x01
pause_ms(20);
sl811_get_device_desc(buffer); //buffer is here 第一次出现
pause_ms(20);
sl811_get_device_conf(buffer);
//check device class : 0x08 => MASS STORAGE CLASS
if(buffer[14] != 0x08 || buffer[9] != 0x09 || buffer[10] != 0x04)return NOT_MASS_STORAGE;
else{
/*****LCD显示:大容量设备******/
GotoXY(1,1);
Print("MASS Storage!!");
/*****************************/
pause_ms(100);
}
//get endpoint number
if((buffer[0x12] == 0x07) && (buffer[0x13] == 0x05))
{
if((buffer[0x14] & 0x80) != 0)endp_in = buffer[0x14] & 0x0F; //end_in is here, 第一次出现已赋值;
else endp_out = buffer[0x14] & 0x0F; //end_out is here,第一次出现,已赋值
if((buffer[0x19] == 0x07) && (buffer[0x1A] == 0x05))
{
if((buffer[0x1B] & 0x80) != 0)endp_in = buffer[0x1B] & 0x0F;
else endp_out = buffer[0x1B] & 0x0F;
}
}
pause_ms(20);
sl811_set_conf();
pause_ms(100);
sl811_usb_ready();
if(sl811_get_capacity(buffer) == STALL)
{
sl811_clear_feature();
}
pause_ms(250);
for(tmp = 10 ; tmp != 0 ; tmp--)
{
sl811_usb_ready();
}
/***********/
GotoXY(2,0);
Print("GET CAPACITY!!");
/*****************************/
pause_ms(200);
//get device capacity
sl811_get_capacity(buffer);
sl811_get_capacity(buffer);
added_temp=sl811_read_sector(0x00000000, buffer); //
added_temp=sl811_read_sector(0x00000000, buffer); //
added_temp=sl811_read_sector(0x00000000, buffer); //
if(added_temp==COMPLETED)
{
/***********/
GotoXY(2,0);
Print("READ LBA0 OK!!");
/*****************************/
pause_ms(200);
}
else
{
/***********/
GotoXY(2,0);
Print("ERROR!!");
/*****************************/
pause_ms(200);
}
pause_ms(200);
while(sl811_usb_ready() != 0)
{
/*******usb ready*********/
GotoXY(2,0);
Print("usb busy!!");
pause_ms(20);//==0.准备好
}
/*******usb ready*********/
GotoXY(2,0);
Print("usb ready!!");
/*****************************/
return COMPLETED;
}
/****************************************************************************************/
// Active wait, time in ms
/****************************************************************************************/
void pause_ms(unsigned char tps)
{
unsigned char i, j;
while(tps-- != 0)
{
for(i=9; i!= 0; i--)
{
for(j=11;j !=0; j--)
{
asm("nop");
}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -