?? main.c
字號:
// 單片機與CH375波特率100000,單片機與PC機波特率115200
//實測:向U盤寫1M字節數據用1分鐘,從U盤讀1M字節數據用14秒
#include "USB.h"
struct USBAtt USBAtt1;//定義存儲U盤基本信息的結構體
extern struct USBAtt USBAtt2;//返回U盤基本信息的結構體
unsigned char *mBufferPoint;
int uu,clu_end;
unsigned long filenam;
unsigned long f,clu_sta,kkkk;
unsigned int q3,q4,jj;
//unsigned char __flash ABC[3]={0x01,0x02,0x03};
/************************************************************************
給定簇號,轉換為該簇對應的起始LBA號
************************************************************************/
unsigned long CLUtoLBA(int iCluster)
{
unsigned long lba;
lba = USBAtt1.DiskStart + USBAtt1.RsvdSecCnt + USBAtt1.FATz16*2 + 32 + ((unsigned long)(iCluster - 2)) * USBAtt1.SecPerClus;
return lba;
}
/************************************************************************
給定扇區號,起始位置,結束位置,讀出其數據
************************************************************************/
void RLBAFroTo(unsigned long LBA,int Start,int End,unsigned char *mBufferPoint)
{
unsigned char rBuffer[512];
int i;
mReadSector( LBA, 1,rBuffer );
for(i=Start;i<End+1;i++)
{
*mBufferPoint = rBuffer[i]; /* 將數據讀出 */
mBufferPoint ++;
}
}
/************************************************************************
給定扇區號,起始位置,結束位置,將數據通過串口發送給計算機
************************************************************************/
void RLBAFroToPC(unsigned long LBA,int Start,int End)
{
unsigned char rBuffer[512];
int i;
mReadSector( LBA, 1,rBuffer );
for(i=Start;i<End+1;i++)
{
TXBUF1=rBuffer[i];
while((IFG2&UTXIFG1)==0);//判斷是否發送完畢
mBufferPoint ++;
}
}
/************************************************************************
給定起始扇區號,結束扇區號,將數據通過串口發送給計算機
************************************************************************/
void SeToSePC(unsigned long Start,unsigned long End)
{
unsigned long i;
int j;
unsigned char temp[512];
unsigned char *tP;
for(i=Start;i<=End;i++)
{
tP = temp; // 指向緩沖區起始地址
while(mReadSector(i,1,temp)!=0);
for(j=0;j<512;j++)
{
TXBUF1=temp[j];
while((IFG2&UTXIFG1)==0);//判斷是否發送完畢
}
}
}
/************************************************************************
給定簇號,將整簇數據通過串口發送給計算機
************************************************************************/
void CluToPC(int Clu)
{
unsigned long LBAStart;
unsigned long LBAEnd ;
LBAStart = CLUtoLBA(Clu);
LBAEnd = USBAtt1.SecPerClus + LBAStart - 1;
SeToSePC(LBAStart,LBAEnd);
}
/************************************************************************
給定簇號,返回其鏈接簇號
************************************************************************/
unsigned long LinkClu(int Clu)
{
int lk,h;
unsigned char d[512];
mReadSector((int)((Clu/256)+ USBAtt1.FAT1Start),1,d);
h = 2 * (int)(Clu % 256);
lk = d[h] | (d[h+1]<<8);
if(lk == 0) {return 65539;}//未分配
if(lk>=0xfff0 && lk<=0xfff6) {return 65538;}//保留
if(lk>=0x01 && lk<=0xffef) {return lk;}//正常
if(lk==0xfff7) {return 65537;}//壞簇
if(lk>=0xfff8 && lk<=0xffff) return 65536;//文件結束簇
}
/************************************************************************
在FAT表中找到第一個空簇,返回其簇號
************************************************************************/
int FirstEmClu()
{
unsigned char rBuffer[512];
int i,j;
for(i = 1;i<=USBAtt1.FATz16;i++)
{
mReadSector( USBAtt1.FAT1Start+(i-1), 1,rBuffer );
for(j=0;j<512;j=j+2)
{
if(( rBuffer[j] | rBuffer[j+1]<<8 )==0) {return 256 * (i-1) + j/2;break;}
}
}
}
/************************************************************************
建立一個文件(大小1簇),文件屬性,
p 中存放文件屬性的32字節
************************************************************************/
void Create_NewFile(unsigned char *p)
{
int a,i,j,k,nft,nw,q;
unsigned char rBuffer[512];
unsigned char q1,q2;
unsigned long filename;
a=FirstEmClu();//在FAT表中找到第一個空簇,返回其簇號
q2 = (unsigned char)(a/100);
q1 = (unsigned char)(a - q2*100);
q =USBAtt1.PerByteSec * USBAtt1.SecPerClus;
q3 = (q>>8) | 0x00ff;
q4 = 0x00ff | q;
for(i=1;i<=USBAtt1.NumIndex * 32/512;i++)
{
mReadSector( USBAtt1.FDTStart+(i-1), 1,rBuffer );
for(j=0;j<512;j=j+32)
{
if(rBuffer[j] == 0 || rBuffer[j] == 0xE5)
{
for(k = j;k<=j+31;k++)
{
rBuffer[k] = *p;
*p++;
}
rBuffer[j + 26] = q1;
rBuffer[j + 27] = q2;
rBuffer[j + 28] = 0;
rBuffer[j + 29] = 0x10;
rBuffer[j + 30] = 0;
rBuffer[j + 31] = 0;
mWriteSector( USBAtt1.FDTStart + i -1, 1 ,rBuffer);
goto CB;
}
}
}
CB:
nft = (int)(a/256); nw = (int)(a%256);
mReadSector(USBAtt1.FAT1Start + nft,1,rBuffer);
rBuffer[2*nw] = 0xff;
rBuffer[2*nw+1] = 0xff;
mWriteSector(USBAtt1.FAT1Start + nft,1,rBuffer);
mWriteSector(USBAtt1.FAT2Start + nft,1,rBuffer);
}
/************************************************************************
得到指定文件名的首簇號及大小(以簇為單位)
返回long型數據,其中低2字節為首簇號,高2字節為大小(簇)
************************************************************************/
unsigned long Findfileatt(unsigned char *p)
{
int a,b,c,i,j,d;
float e;
unsigned long l,l1,l2;
unsigned char buff[512];
a=FirstEmClu();//得出第一個空簇號
for(i=1;i<=USBAtt1.NumIndex * 32/512;i++)
{
mReadSector( USBAtt1.FDTStart+i-1, 1,buff );
for(j=0;j<512;j=j+32)
{
if(buff[0+j]==*p && buff[1+j]==*(p+1) && buff[2+j]==*(p+2) && buff[3+j]==*(p+3)
&& buff[4+j]==*(p+4) && buff[5+j]==*(p+5) && buff[6+j]==*(p+6) && buff[7+j]==*(p+7)
&& buff[8+j]==*(p+8) && buff[9+j]==*(p+9) && buff[10+j]==*(p+10))
{
b = buff[26+j] | (buff[27+j]<<8);
d = (buff[28+j] | (buff[29+j]<<8) | (buff[30+j]<<16) | (buff[31+j]<<24))%(USBAtt1.PerByteSec * USBAtt1.SecPerClus);
e = (buff[28+j] | (buff[29+j]<<8) | (buff[30+j]<<16) | (buff[31+j]<<24))/(USBAtt1.PerByteSec * USBAtt1.SecPerClus);
if( d!= 0)
{
c=(int)e + 1;
}
else
c=(int)e;
l1 = (0x0000ffff & b);
l2 = (0x0000ffff & (unsigned long)c)<<16;
l = l1 + l2;
return l;
}
}
}
}
/************************************************************************
得到指定文件名的最后簇號
************************************************************************/
int FindFinalclu(unsigned char *p)
{
int a,b;
unsigned char buffer[512],c1,c2;
a = Findfileatt(p) & 0x0000ffff;
while(1)
{
mReadSector( USBAtt1.FAT1Start + (int)(a/256), 1 , buffer );
c1=buffer[2*(int)(a%256)];c2=buffer[2*(int)(a%256)+1];
b = c1 | c2<<8;
if(b == 0xffff)
{
return a;
break;
}
else
{
a = b;
break;
}
}
}
/************************************************************************
將指定文件的大小增加1簇
*p指向文件名的數組,11個元素
************************************************************************/
unsigned long AddoneClu(unsigned char *p,int finaclu)
{
int empclu,i,j;
unsigned char buffer[512];
unsigned long d,e;
// finaclu = FindFinalclu(p);
empclu =FirstEmClu();
mReadSector( USBAtt1.FAT1Start + (int)(empclu/256), 1 , buffer );
buffer[2*(int)(empclu % 256)] = 0xff;
buffer[2*(int)(empclu % 256)+1] = 0xff;
mWriteSector( USBAtt1.FAT1Start + (int)(empclu/256), 1 , buffer );//空簇寫入ffff
mWriteSector( USBAtt1.FAT2Start + (int)(empclu/256), 1 , buffer );//空簇寫入ffff
mReadSector( USBAtt1.FAT1Start + (int)(finaclu/256), 1 , buffer );
buffer[2*(int)(finaclu % 256)] = (unsigned char)(empclu & 0x00ff);
buffer[2*(int)(finaclu % 256)+1] = (unsigned char)((0xff00 & empclu) >> 8);
mWriteSector( USBAtt1.FAT1Start + (int)(finaclu/256), 1 , buffer );
mWriteSector( USBAtt1.FAT2Start + (int)(finaclu/256), 1 , buffer );
for(i=1;i<=USBAtt1.NumIndex * 32/512;i++)
{
mReadSector( USBAtt1.FDTStart+i-1, 1,buffer );
for(j=0;j<512;j=j+32)
{
if(buffer[0+j]==*p && buffer[1+j]==*(p+1) && buffer[2+j]==*(p+2) && buffer[3+j]==*(p+3)
&& buffer[4+j]==*(p+4) && buffer[5+j]==*(p+5) && buffer[6+j]==*(p+6) && buffer[7+j]==*(p+7)
&& buffer[8+j]==*(p+8) && buffer[9+j]==*(p+9) && buffer[10+j]==*(p+10))
{
d = (unsigned long)buffer[28+j] | (unsigned long)(buffer[29+j]<<8) | (unsigned long)(buffer[30+j]<<16) | (unsigned long)(buffer[31+j]<<24);
e = d + (USBAtt1.PerByteSec * USBAtt1.SecPerClus);
buffer[28+j] = (unsigned char)(e & 0x000000ff);
buffer[29+j] = (unsigned char)((e>>8) & 0x000000ff);
buffer[30+j] = (unsigned char)((e>>16) & 0x000000ff);
buffer[31+j] = (unsigned char)((e>>24) & 0x000000ff);
mWriteSector( USBAtt1.FDTStart+i-1, 1 ,buffer);
return 1;
}
}
}
}
/************************************************************************
主函數
************************************************************************/
void main(void)
{ //i i l e T X T 檔案位
unsigned char fileatt[32]={0x73,0x61,0x76 ,0x65 ,0x20 ,0x20 ,0x20, 0x20 ,0x54 ,0x58, 0x54 ,0x00 ,0x0 ,0x0 ,0x0 ,0x0, 0x0 ,0x0, 0x0, 0x0 ,0x0 ,0x0 ,0x96, 0x9d,0x21 ,0x31,0x01,0x50,0,0,0x10,0};
unsigned char filename[11] = {'S','A','V','E',0x20,0x20,0x20,0x20,'T','X','T'};
unsigned char DATA[512]={0xd6,0xf7,0xba,0xaf ,0xca ,0xfd ,0xcb, 0xb5 ,0xc3 ,0xf7};
unsigned int o,i;
P4DIR|=BIT0+BIT4;
P4OUT=0;
SysInit(); /**系統初始化**/
HardwareRst(); /**硬件復位CH375**/
Reset375(); /** 軟件復位CH375**/
while(Test375()==0) /** 測試CH375工作狀態,若不正常則LED3閃爍**/
{
LED3glitter();
}
Set375Band(); /**重新設置CH375的波特率10000**/
McuBChange(); /**單片機波特率改變10000**/
while(Test375()==0) /** 測試CH375工作狀態,若不正常則LED3閃爍**/
{
LED3glitter();
}
while(WRCD375(CMD_SET_USB_MODE,0x06)!=0x51) /**設置USB工作模式,若不正常則LED5閃爍**/
{
LED5glitter(); //LED5閃爍
}
mDelaymS(100);
while(ReadP10()==1) /* LED3\5交替閃爍,說明在等待U盤連接*/
{
LED53glitter(); //交替閃爍
}
while( WRC375(CMD_GET_STATUS) != USB_INT_CONNECT ) /* LED3\5同時閃爍則說明連接不成功*/
{
LED35glitter(); //同時閃爍
}
while(USBInit()==0) /*初始化U盤 ,若不成功,則LED3快閃*/
{
LED3kglitter(); //LED3快閃
}
USBAtt1 = AcquireAtt(); /*獲取U盤基本屬性*/
Create_NewFile(fileatt);
mWriteSector( USBAtt1.FDTStart,1,fileatt);
jj = Findfileatt(fileatt)&0xffff;//clu_sta 先找文件的首簇號
kkkk = CLUtoLBA(jj);//20481 轉化成起始扇區號
for(i=0;i<16;i++)
{
mWriteSector( kkkk, 128 ,DATA);
kkkk++;
}
while(1)
{
LED3355kglitter();
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -