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

📄 udisk.lis

📁 AVR单片机平台Atmega32+CH375A芯片读写U盘代码
💻 LIS
📖 第 1 页 / 共 5 页
字号:
 0000           ; ***************************************************************************/
 0000           ; void xWriteCH375Cmd( UINT8 mCmd )     
 0000           ; {
 0000           ;       delay_us();
 0000           ;       delay_us();
 0000           ;       MCMD;                               //A0置高
 0000           ;       DATADIRO;                            //数据方向为输出
 0000           ;       DATAOUT=mCmd;                        //数据输出
 0000           ;       CSEN;                                //使能
 0000           ;       WRCTRL;                              //写信号
 0000           ;       WRCTRL;                              //延时
 0000           ;       CLRCTRL;                            //关写信号
 0000           ;       CSDIS;                              //使能禁止
 0000           ;       delay_us();
 0000           ;       delay_us();
 0000           ; }
 0000           ; 
 0000           ; /**************************************************************************
 0000           ; 外部定义的被CH375程序库调用的子程序,向CH375写数据,最小周期为1.5uS,
 0000           ; 否则之后延时1.5uS
 0000           ; ***************************************************************************/
 0000           ; void xWriteCH375Data( UINT8 mData )
 0000           ; {
 0000           ;       MDATA;                               //A0置高
 0000           ;       DATADIRO;                            //数据方向为输出
 0000           ;       DATAOUT=mData;                        //数据输出
 0000           ;       CSEN;                                //使能
 0000           ;       WRCTRL;                              //写信号
 0000           ;       WRCTRL;                               //延时
 0000           ;       CLRCTRL;                            //关写信号
 0000           ;       CSDIS;                              //使能禁止
 0000           ;       delay_us();
 0000           ;       delay_us();      
 0000           ; 
 0000           ; }
 0000           ; /**************************************************************************
 0000           ; 外部定义的被CH375程序库调用的子程序,从CH375读数据,最小周期为1.5uS,
 0000           ; 否则之前延时1.5uS
 0000           ; ***************************************************************************/
 0000           ; UINT8 xReadCH375Data( void )
 0000           ; {
 0000           ;       UINT8 inData;
 0000           ;       delay_us();
 0000           ;       MDATA;
 0000           ;       DATADIRI;
 0000           ;       CSEN;
 0000           ;       RDCTRL;
 0000           ;       RDCTRL;
 0000           ;       inData=DATAIN;
 0000           ;       CLRCTRL;
 0000           ;       CSDIS;
 0000           ;       return(inData);
 0000           ; }
 0000           ; 
 0000           ; /****************************************************************************
 0000           ; /动作执行完,返回结果,OperReturn为0则返回A_SUCCESS,非零则返回OperReturn值
 0000           ; ****************************************************************************/
 0000           ; void ReturnProResult( void )
 0000           ; {
 0000           ;       if(OperReturn)
 0000           ;       {
 0000           ;               nComBuff.AckData.Ack = OperReturn;
 0000           ;       }
 0000           ;       else
 0000           ;       {
 0000           ;               nComBuff.AckData.Ack = A_SUCCESS;
 0000           ;       }
 0000           ; }
 0000           ; 
 0000           ; /************************************************************************/
 0000           ; /* 发送错误码。自动组帧。
 0000           ; 入口参数:ErrorCode                                                     */
 0000           ; /************************************************************************/
 0000           ; void ReturnErrorCode(uchar ErrorCode)
 0000           ; {
 0000           ;       I2C_SEND_READY;
 0000           ;     nComBuff.AckData.Ack = ErrorCode;
 0000           ;       nComBuff.AckData.FrameLen = 3;
 0000           ; }
 0000           ; /************************************************************************/
 0000           ; /* 复制数据
 0000           ; 入口参数:
 0000           ; uchar destination *:目的地址
 0000           ; uchar source *:源地址
 0000           ; uint number:  字节数                                                     */
 0000           ; /************************************************************************/
 0000           ; void CopyBytes(uchar* destination,uchar* source,uint number)
 0000           ; {
 0000           ;       uint i;
 0000           ;       for(i=0;i<number;i++)
 0000           ;       {
 0000           ;               *(destination+i) = *(source+i);
 0000           ;       }
 0000           ; }
 0000           ; 
 0000           ; /************************************************************************/
 0000           ; /* 新建文件(文件夹)函数
 0000           ; 入口参数:directory,0=新建文件,!0=新建文件夹                          */
 0000           ; /************************************************************************/
 0000           ; void ModuleNewFile(uchar directory)
 0000           ; {
 0000           ;       nComBuff.ReqData.VeryData.FileName[MAX_PATH_LEN-1]=0;  //确保最后一个是“0”,作为字符串的尾部
 0000           ;       strcpy((char *)mCmdParam.Create.mPathName,(char *)nComBuff.ReqData.VeryData.FileName);
 0000           ;       OperReturn = CH375FileCreate( );    //新建文件
 0000           ;       
 0000           ;       if(OperReturn)
 0000           ;       {
 0000           ;               ReturnErrorCode(OperReturn);
 0000           ;               B_status = S_READY;
 0000           ;       }
 0000           ;       else if(directory)
 0000           ;       {
 0000           ;               mCmdParam.Modify.mFileAttr = ATTR_DIRECTORY;
 0000           ;               mCmdParam.Modify.mFileDate = 0xffff;
 0000           ;               mCmdParam.Modify.mFileSize = 0xffffffff;
 0000           ;               mCmdParam.Modify.mFileTime = 0xffff;
 0000           ;               OperReturn = CH375FileModify();
 0000           ;               directory = 0;                         //把此值清零防止再进入此分支
 0000           ;               if(OperReturn)
 0000           ;               {
 0000           ;                       ReturnErrorCode(OperReturn);
 0000           ;                       B_status = S_READY;
 0000           ;               }
 0000           ;               else
 0000           ;               {
 0000           ;                       mCmdParam.Close.mUpdateLen = 1;                    //自动更新文件长度
 0000           ;                       OperReturn = CH375FileClose( );
 0000           ;                       if(OperReturn)
 0000           ;                       {
 0000           ;                               ReturnErrorCode(OperReturn);
 0000           ;                 B_status = S_READY;
 0000           ;                       }
 0000           ;                       else
 0000           ;                       {
 0000           ;                               ReturnErrorCode(A_SUCCESS);
 0000           ;                               B_status = S_READY;
 0000           ;                       }
 0000           ;                                       
 0000           ;               }
 0000           ;       }
 0000           ;       else
 0000           ;       {
 0000           ; 
 0000           ;               ReturnErrorCode(A_SUCCESS);
 0000           ;               B_status=S_OPEN;
 0000           ;       }
 0000           ; 
 0000           ; }
 0000           ; 
 0000           ; /************************************************************************/
 0000           ; /* 如果优盘的状态是准备好,但未读写,进入的分支                         */
 0000           ; /************************************************************************/
 0000           ; void StatusReady(void)
 0000           ; {
 0000           ;       switch(nComBuff.ReqData.Com)
 0000           ;       {
 0000           ;               case R_OPEN_FILE:
 0000           ;                       nComBuff.ReqData.VeryData.FileName[MAX_PATH_LEN-1]=0;  //确保最后一个是“0”,作为字符串的尾部
 0000           ;                       strcpy((char *)mCmdParam.Open.mPathName,(char *)nComBuff.ReqData.VeryData.FileName);
 0000           ;                       OperReturn = CH375FileOpen( );
 0000           ;                       if(OperReturn)
 0000           ;                       {
 0000           ;                               ReturnErrorCode(OperReturn);
 0000           ;                               B_status = S_READY;                               
 0000           ;                       }
 0000           ;                       else
 0000           ;                       {
 0000           ;                               ReturnErrorCode(A_SUCCESS);
 0000           ;                               B_status=S_OPEN;
 0000           ;                       }                                       
 0000           ; 
 0000           ;                       break;
 0000           ;               case R_NEW_FILE:
 0000           ;                       ModuleNewFile(0);                          //新建文件
 0000           ;                       break;
 0000           ;               case R_DEL_FILE:
 0000           ;                       nComBuff.ReqData.VeryData.FileName[MAX_PATH_LEN-1]=0;  //确保最后一个是“0”,作为字符串的尾部
 0000           ;                       strcpy((char *)mCmdParam.Create.mPathName,(char *)nComBuff.ReqData.VeryData.FileName);
 0000           ;                       OperReturn = CH375FileErase( );  //删除文件并关闭
 0000           ;                       ReturnErrorCode(OperReturn);
 0000           ;                       B_status = S_READY;
 0000           ;                       break;
 0000           ;               case R_NEW_DIR:
 0000           ;                       ModuleNewFile(0xff);                      //新建文件夹
 0000           ;                       break;                  
 0000           ;               default:
 0000           ;                       ReturnErrorCode(A_NOTOPEN);
 0000           ;                       B_status = S_READY;
 0000           ;                       break;
 0000           ;       }
 0000           ; }
 0000           ; 
 0000           ; /************************************************************************/
 0000           ; /* 模块按字节读取文件
 0000           ; 需要准备的有: nComBuff.ReqData.VeryData.ReadBytes,字节数
 0000           ; 出口数据: nComBuff.AckData.VeryData.ReadDataVer.ReadBytes,读出的实际字节数
 0000           ;                                                                         */
 0000           ; /************************************************************************/
 0000           ; void ModuleByteRead(void)
 0000           ; {
 0000           ;     rdcount=nComBuff.ReqData.VeryData.ReadBytes;
 0000           ;     if(rdcount)
 0000           ;     {
 0000           ;               if(rdcount>MAX_BYTE_IO)
 0000           ;               {
 0000           ;                       mCmdParam.ByteRead.mByteCount = MAX_BYTE_IO;    //读的字节数就是最大值
 0000           ;                       goto readbyte1;
 0000           ;               }
 0000           ;               else
 0000           ;               {
 0000           ;                       mCmdParam.ByteRead.mByteCount = rdcount;
 0000           ; readbyte1:                    LIGHT_RD;                                        //读指示灯打开
 0000           ;                       OperReturn = CH375ByteRead();
 0000           ;                       OFF_RD;                                          //读指示灯熄灭
 0000           ;                       if(OperReturn)
 0000           ;                       {
 0000           ;                               ReturnErrorCode(OperReturn);
 0000           ;                       }
 0000           ;                       else
 0000           ;                       {
 0000           ;                           RETURN_SUCCESS;                             //返回成功
 0000           ;                               CopyBytes(nComBuff.AckData.VeryData.ReadDataVer.DataBuff,  //目的地址
 0000           ;                                       mCmdParam.ByteRead.mByteBuffer,       //源地址
 0000           ;                                       mCmdParam.ByteRead.mByteCount);    //实际读出的字节数
 0000           ;                 nComBuff.AckData.VeryData.ReadDataVer.ReadBytes = mCmdParam.ByteRead.mByteCount;
 0000           ;                 nComBuff.AckData.FrameLen = nComBuff.AckData.VeryData.ReadDataVer.ReadBytes+5;  //整个帧的长度
 0000           ;                               I2C_SEND_READY;                            //准备发送
 0000           ;                       }
 0000           ; 
 0000           ;               }
 0000           ;       }
 0000           ;       B_status = S_OPEN;
 0000           ; }
 0000           ; 
 0000           ; /************************************************************************/
 0000           ; /* 模块对文件属性的读取                                                 */
 0000           ; /************************************************************************/
 0000           ; void ModuleAttrRead(void)
 0000           ; {
 0000           ;       LIGHT_RD;                                           //亮灯
 0000           ;       OperReturn = CH375FileQuery( );
 0000           ;       OFF_RD;                                             //灭灯
 0000           ;       if(OperReturn)
 0000           ;       {
 0000           ;               ReturnErrorCode(OperReturn);
 0000           ;       }
 0000           ;       else
 0000           ;       {
 0000           ;               nComBuff.AckData.FrameLen = FILE_ATTRI_BYTES+3;
 0000           ;               RETURN_SUCCESS;
 0000           ;               CopyBytes((uchar *) &nComBuff.AckData.VeryData.ReadFileAttrVer,
 0000           ;                       (uchar *) &mCmdParam.Modify,
 0000           ;                       FILE_ATTRI_BYTES);
 0000           ;               I2C_SEND_READY;
 0000           ;       }
 0000           ;       B_status = S_OPEN;
 0000           ; }
 0000           ; 
 0000           ; /************************************************************************/
 0000           ; /* 模块对文件按字节方式写入                                             */
 0000           ; /************************************************************************/
 0000           ; void ModuleByteWrite(void)
 0000           ; {
 0000           ;       rdcount = nComBuff.ReqData.VeryData.WriteDataVer.Bytes;
 0000           ;       if(rdcount)
 0000           ;       {
 0000           ;               if(rdcount>MAX_BYTE_IO)
 0000           ;               {
 0000           ;                       mCmdParam.ByteWrite.mByteCount = MAX_BYTE_IO;
 0000           ;                       goto writebyte1;
 0000           ;               }
 0000           ;               else
 0000           ;               {
 0000           ;                       mCmdParam.ByteWrite.mByteCount = rdcount;
 0000           ; writebyte1:                   LIGHT_WR;
 0000           ;                       CopyBytes(mCmdParam.ByteWrite.mByteBuffer,                //将请求帧的数据内容拷贝到读写结构体当中
 0000           ;                               nComBuff.ReqData.VeryData.WriteDataVer.DataBuff,

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -