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