?? main.c
字號:
else {WriteEpBulk(1, sizeof(B_Mode_Sense_ZERO), B_Mode_Sense_ZERO);}
}
///////////////////////////////////////////////////////////////////////////
void SCSI_Read_Format_Capacities()
{
if(bulk_CBW.CBWCB[7]==0 && bulk_CBW.CBWCB[8]==0)return;
WriteEpBulk(1, sizeof(B_Read_Format_capacities), B_Read_Format_capacities);
}
/////////////////////////////////////////////////////////////////////////
void SCSI_Read10()//FLASH讀處理函數
{
unsigned char data i;
unsigned char Addr[4];
unsigned char length;
/*讀操作的起始地址*/
Addr[2] = bulk_CBW.CBWCB[4];
Addr[3] = bulk_CBW.CBWCB[5];
/*讀操作的扇區長度*/
length = bulk_CBW.CBWCB[8];
while(length>0)
{
P5 = COMMAND;
io_port1 = 0x00;//FLASH讀命令碼
P5 = ADDRESS;
io_port1 = 0;
io_port1 = Addr[3];
io_port1 = Addr[2];
P5 = D_DATA;
UEPNUM=0x01;
UEPSTAX|=DIR;
while(!(P5 & RB));
/*讀取一個扇區的數據*/
for(i=0;i<8;i++)
{
ReadFlash();
UEPSTAX|=TXRDY;
while(!(UEPSTAX&TXCMP));
UEPSTAX&=(~(TXCMP)); }
io_port1 = INACTIVE;
length--;
Addr[3]++;
if(Addr[3]==255)
{
Addr[3]=0;
Addr[2]++;
}
}
TransmitCSW();
}
/////////////////////////////////////////
void delay()
{
unsigned char data i=100;
while(i-->0);
}
/////////////////////////////////////////////
void SCSI_Write10() //FLASH寫操作
{
unsigned char addr[4];
unsigned char data i=0,length=0,nBeginPage=0;
/*開辟一個數據緩沖區*/
P5 = COMMAND;
io_port1 = 0x60;
P5 = ADDRESS;
io_port1 = BuffBlock;
io_port1 = 0xff;
P5 = COMMAND;
io_port1 = 0xd0;
P5 = D_DATA;
delay();
while(!(P5 & RB));
/*得到寫操作的參數--起始扇區號、扇區長度*/
addr[2] = bulk_CBW.CBWCB[4];
addr[3] = bulk_CBW.CBWCB[5];
length = bulk_CBW.CBWCB[8];
nBeginPage = addr[3]&0x1f;
/*把寫操作扇區對應的塊的數據COPY到緩沖區*/
UEPNUM = 0x02;
delay();
while(!(P5 & RB));
if(nBeginPage>0)
{
for(i=0;i<nBeginPage;i++)
{
P5 = COMMAND;
io_port1 = 0x00;
P5 = ADDRESS;
io_port1 = 0; //A0-A7
io_port1 = (addr[3]&0xe0)|i; //A9-A16
io_port1 = addr[2]; //A17-A24
P5 = D_DATA;
delay();
while(!(P5 & RB));
P5 = COMMAND;
io_port1 = 0x8a;
P5 = ADDRESS;
io_port1 = 0;
io_port1 = BuffBlock|i;
io_port1 = 0xff;
P5 = D_DATA;
delay();
while(!(P5 & RB));
}
nBeginPage=0;
}
/*數據先寫到緩沖區*/
while(length>0)
{
P5 = COMMAND;
io_port1 = 0x80;//PAGE寫操作碼
P5 = ADDRESS;
io_port1 = 0; //A0-A7
io_port1 = (addr[3]&0x1f)|BuffBlock;
io_port1 = 0xff; //A17-A24
P5 = D_DATA;
for(i=0;i<8;i++)
{
while (!(UEPINT & EP2));
WriteFlash();
UEPSTAX &= 0xB9;
}
P5 = COMMAND;
io_port1 = 0x10;
P5 = D_DATA;
length--;
delay();
while(!(P5 & RB));
if(((addr[3]&0x1f)==0x1f)||(length==0))
{
/*保存數據到緩沖區*/
for(i=((addr[3]&0x1f)+1);i<32;i++)
{
P5 = COMMAND;
io_port1 = 0x00;
P5 = ADDRESS;
io_port1 = 0; //A0-A7
io_port1 = (addr[3]&0xe0)|i; //A9-A16
io_port1 = addr[2]; //A17-A24
P5 = D_DATA;
delay();
while(!(P5 & RB));
P5 = COMMAND;
io_port1 = 0x8a;
P5 = ADDRESS;
io_port1 = 0; //A0-A7
io_port1 = BuffBlock|i;
io_port1 = 0xff; //A17-A24
P5 = D_DATA;
delay();
while(!(P5 & RB));
}
/*擦除要寫的數據塊*/
P5 = COMMAND;
io_port1 = 0x60; //擦除當前block
P5 = ADDRESS;
io_port1 = addr[3]; //A9-A16
io_port1 = addr[2]; //A17-A24
P5 = COMMAND;
io_port1 = 0xd0;
P5 = D_DATA;
delay();
while(!(P5 & RB)); //等待操作完成
/*把緩沖區的數據COPY到指定寫的扇區所在塊*/
for(i=0;i<32;i++)
{
P5 = COMMAND;
io_port1 = 0x00;
P5 = ADDRESS;
io_port1 = 0; //A0-A7
io_port1 = BuffBlock|i;
io_port1 = 0xff; //A17-A24
P5 = D_DATA;
delay();
while(!(P5 & RB));
P5 = COMMAND;
io_port1 = 0x8a;
P5 = ADDRESS;
io_port1 = 0; //A0-A7
io_port1 = (addr[3]&0xe0)|i; //A9-A16
io_port1 = addr[2]; //A17-A24
P5 = D_DATA;
delay();
while(!(P5 & RB));
}
if(length>0)
{
P5 = COMMAND;
io_port1 = 0x60;
P5 = ADDRESS;
io_port1 = BuffBlock;
io_port1 = 0xff; //A17-A24
P5 = COMMAND;
io_port1 = 0xD0;
P5 = D_DATA;
delay();
while(!(P5 & RB));
}
}
addr[3]++;
if(addr[3]==255)
{
addr[2]++;
}
}
TransmitCSW();
}
//////////////////////////////////
void Ep2()//端口2中斷處理函數
{
unsigned char data i;
unsigned char data Buf[64];
i = ReadEp(2,Buf);
bulk_CSW[4] = Buf[4]; bulk_CSW[5] = Buf[5]; bulk_CSW[6] = Buf[6]; bulk_CSW[7] = Buf[7];
for(i=0;i<12;i++) bulk_CBW.CBWCB[i] = Buf[i+15];
switch(bulk_CBW.CBWCB[0])
{
case Inquiry :WriteEpBulk(1,36,B_InquiryData);break;
case Mode_Sense :SCSI_Mode_Sense(); break;
case Read10 :SCSI_Read10(); break;
case Read_Capacity :WriteEpBulk(1, sizeof(B_Read_Capacity), B_Read_Capacity);break;
case Read_Format_Capacities :SCSI_Read_Format_Capacities(); break;
case Test_Unit_Ready :TransmitCSW(); break;
case Verify :TransmitCSW(); break;
case Write10 :SCSI_Write10(); break;
case Medium_Removal :TransmitCSW(); break;
}
}
/////////////////////////////////////
void Flash_Reset(void) //flash reset
{
unsigned int data i;
P5 = COMMAND;
io_port1 = 0xff; //reset command
for (i=0; i<3000; i++) ; //delay
}
////////////////////////////////////
void ReadFlash() //從FLASH讀取32個字節數據并保存在端口緩存
{
int i;
for(i=0;i<32;i++)
{
UEPDATX=io_port1;
}
}
///////////////////////////////////
void WriteFlash() //從端口得到32個字節的數據寫到FLASH
{
int i;
for(i=0;i<32;i++)
{
io_port1=UEPDATX;
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -