⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 MSP430F1611U盘数据读写 通过调试
💻 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 + -