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

📄 udisk.lis

📁 AVR单片机平台Atmega32+CH375A芯片读写U盘代码
💻 LIS
📖 第 1 页 / 共 5 页
字号:
                        .module udisk.c
                        .area text(rom, con, rel)
 0000                   .dbfile E:\xm\jxf\u盘读写模块\code\udisk_test0827/CH375HFB.h
 0000                   .dbfunc e CH375FileRead _CH375FileRead fc
                        .even
 0000           _CH375FileRead::
 0000                   .dbline -1
 0000                   .dbline 673
 0000           ; //此版本为测试375自带模块函数设计,
 0000           ; //测试读取文件,新建文件,写入文件,修改属性
 0000           ; 
 0000           ; 
 0000           ; #include <iom32v.h>
 0000           ; #include "macros.h"
 0000           ; #include <string.h>
 0000           ; #include <stdio.h>
 0000           ; #include "twi.h"
 0000           ; #include "UART.h"
 0000           ; #include "udisk.h"
 0000           ; 
 0000           ; 
 0000           ; #define uchar unsigned char
 0000           ; #define UINT8 unsigned char
 0000           ; #define ulong unsigned long
 0000           ; #define uint  unsigned int
 0000           ; //端口的定义,用I/O模拟总线方式
 0000           ; //LED定义
 0000           ; #define LEDPORT PORTD
 0000           ; #define ALLLED  0xF0
 0000           ; #define LEDRD   PD7
 0000           ; #define LEDWR   PD6
 0000           ; #define LEDBUSY PD5
 0000           ; #define LEDERR  PD4
 0000           ; //按键定义
 0000           ; #define KEYPORT PIND
 0000           ; #define S1      PD3
 0000           ; //模拟总线定义
 0000           ; #define DATAOUT PORTA                    //D0~D7在PA口
 0000           ; #define DATAIN  PINA
 0000           ; 
 0000           ; #define CTRLBUS PORTC
 0000           ; #define CTRLWR  PC7                      //WR信号线在PC7
 0000           ; #define CTRLRD  PC6                      //RD信号线在PC6
 0000           ; 
 0000           ; #define ADDRBUS PORTB
 0000           ; #define A0      PB0                      //A0地址线在PB0
 0000           ; 
 0000           ; #define CSPORT PORTB
 0000           ; #define CS      PB1                      //片选线在PB1
 0000           ; 
 0000           ; //一些总线控制宏定义
 0000           ; #define WRCTRL  CTRLBUS&= ~BIT(CTRLWR)   //写总线置低
 0000           ; #define RDCTRL  CTRLBUS&= ~BIT(CTRLRD)   //读总线置低
 0000           ; #define CLRCTRL CTRLBUS|= (BIT(CTRLWR)|BIT(CTRLRD))  //读写总线均置高
 0000           ; #define MCMD  ADDRBUS|= BIT(A0)                       //指令的读写模式,A0置高
 0000           ; #define MDATA  ADDRBUS&= ~BIT(A0)                       //数据的读写模式,A0置低
 0000           ; #define CSEN    ADDRBUS&= ~BIT(CS)                   //CS使能置低
 0000           ; #define CSDIS   ADDRBUS|= BIT(CS)                    //CS不使能置高
 0000           ; #define DATADIRI      DDRA=0                               //数据输入方式把DDRA置0
 0000           ; #define DATADIRO     DDRA=0xff                            //数据输出方式把DDAR置0xff
 0000           ; 
 0000           ; 
 0000           ; 
 0000           ; //点灯的宏定义
 0000           ; 
 0000           ; #define LIGHT_WR    LEDPORT&= ~BIT(LEDWR)
 0000           ; #define OFF_WR      LEDPORT|= BIT(LEDWR)
 0000           ; #define LIGHT_RD    LEDPORT&= ~BIT(LEDRD)
 0000           ; #define OFF_RD      LEDPORT|= BIT(LEDRD)
 0000           ; #define LIGHT_BUSY  LEDPORT&= ~BIT(LEDBUSY)
 0000           ; #define OFF_BUSY    LEDPORT|= BIT(LEDBUSY)
 0000           ; #define LIGHT_ERR   LEDPORT&= ~BIT(LEDERR)
 0000           ; #define OFF_ERR     LEDPORT|= BIT(LEDERR)
 0000           ; 
 0000           ; #define LIGHT_ALL   LEDPORT&= ~ALLLED
 0000           ; #define OFF_ALL LEDPORT|= ALLLED
 0000           ; 
 0000           ; #define I2C_SEND_READY DataPrepared = 0xff
 0000           ; #define CLR_COMFLAGE I2cComStatus = 0
 0000           ; 
 0000           ; #define FILE_ATTRI_BYTES 9
 0000           ; 
 0000           ; 
 0000           ; 
 0000           ; #define RETURN_SUCCESS nComBuff.AckData.Ack = A_SUCCESS
 0000           ; 
 0000           ; //决定是否使能应答
 0000           ; #define OPEN_ACK TWCR|= 1<<TWEA
 0000           ; #define CLOSE_ACK  TWCR&= ~(1<<TWEA)
 0000           ; 
 0000           ; 
 0000           ; 
 0000           ; /* 以下定义的详细说明请看CH375HF9.H文件 */
 0000           ; #define LIB_CFG_FILE_IO                       1               /* 文件读写的数据的复制方式,0为"外部子程序",1为"内部复制" */
 0000           ; #define LIB_CFG_INT_EN                        0               /* CH375的INT#引脚连接方式,0为"查询方式",1为"中断方式" */
 0000           ; 
 0000           ; /* 单片机的RAM有限,其中CH375子程序用512字节,剩余RAM部分可以用于文件读写缓冲 */
 0000           ; #define FILE_DATA_BUF_LEN             512     /* 外部RAM的文件数据缓冲区,缓冲区长度不小于一次读写的数据长度 */
 0000           ; 
 0000           ; #define CH375_INT_WIRE                        ( PIND & 0x04 ) /* PIND.2, CH375的中断线INT#引脚,连接CH375的INT#引脚,用于查询中断状态 */
 0000           ; 
 0000           ; #define NO_DEFAULT_CH375_F_ENUM               1               /* 未调用CH375FileEnumer程序故禁止以节约代码 */
 0000           ; //#define NO_DEFAULT_CH375_F_QUERY    1               /* 未调用CH375FileQuery程序故禁止以节约代码 */
 0000           ; #define LIB_CFG_FILE_IO_DEFAULT
 0000           ; #define NO_DEFAULT_DELAY_100US                 //用自己定义的延时100us函数实现延时
 0000           ; #define NO_DEFAULT_DELAY_WRITE                 //用自己定义的延时函数实现写入后的延时
 0000           ; #include "CH375HFB.h"
 0000           ; 
 0000           ; 
 0000           ; 
 0000           ; void init_devices(void );
 0000           ; void mDelaymS( UINT8 ms );
 0000           ; void xDelay100uS( void );
 0000           ; void xDelayAfterWrite( void );
 0000           ; 
 0000           ; void twi_process(void);
 0000           ; void transmit_process(void);
 0000           ; void receive_process(void);
 0000           ; void twisentbyte(unsigned char SentData);
 0000           ; void delay_us(void);
 0000           ; void xWriteCH375Cmd( UINT8 mCmd );
 0000           ; void xWriteCH375Data( UINT8 mData );
 0000           ; UINT8 xReadCH375Data( void );
 0000           ; void timer0_ovf_isr(void);
 0000           ; void timer0_init(void);
 0000           ; void twi_isr(void);
 0000           ; void variable(void);
 0000           ; void RecieveFrameProcess( void );
 0000           ; void ModuleSetOffset(uchar ModeLocate);
 0000           ; 
 0000           ; COM_BUFF nComBuff;
 0000           ; uchar  ys20ms;
 0000           ; 
 0000           ; uchar B_status;    //模块大状态变量
 0000           ; uchar temp[10];
 0000           ; 
 0000           ; uchar OperReturn;
 0000           ; uchar DataPrepared;       //数据是否准备好变量
 0000           ; uchar rdcount;
 0000           ; 
 0000           ; extern uint *SlaveSendLength;
 0000           ; extern uchar I2cComStatus;     //通信状态变量
 0000           ; 
 0000           ; /*Bit7        Bit6        Bit5    Bit4 Bit3 Bit2 Bit1 Bit0
 0000           ;   I2CRecCom   I2C_sendCom  
 0000           ;   I2C_RecCom--Recieve complete
 0000           ;   I2C_SendCom--Transmmit complete
 0000           ;  **********************************************************/
 0000           ; extern unsigned char *I2cReceiveData;    //I2c数据接收缓冲地址 
 0000           ; extern unsigned char *I2cSendData;      //I2c数据发送缓冲地址
 0000           ;                       
 0000           ; extern unsigned char *UartRx;          //存放接收数据的指针
 0000           ; extern unsigned int *RxLength;         //数据接收长度地址指针
 0000           ; extern unsigned char UartState;         //UART状态变量                
 0000           ;                       
 0000           ;                               
 0000           ;                       
 0000           ; 
 0000           ; void main(void)
 0000           ; {
 0000           ;       UINT8 i;
 0000           ;       uint j=200;
 0000           ; begin: variable( );              //变量的初始化
 0000           ;     i2cSetBitrate(100);
 0000           ;     i2cInit();
 0000           ;     i2cSetLocalDeviceAddr(0x60,1);
 0000           ;       init_USART(0);
 0000           ;     init_devices( );
 0000           ;     /*测试延时时间是否充足*/
 0000           ;       xDelay100uS( );
 0000           ;       delay_us( );
 0000           ;     put_s("Start\n");
 0000           ;     for(i=0;i<3;i++)           //闪烁三次
 0000           ;       {
 0000           ;               LIGHT_ALL;
 0000           ;         ys20ms=20;
 0000           ;               while(ys20ms);
 0000           ;               OFF_ALL;
 0000           ;               ys20ms=20;
 0000           ;               while(ys20ms);
 0000           ;               
 0000           ;       }
 0000           ; 
 0000           ;       OperReturn = CH375LibInit( );  // 初始化CH375程序库和CH375芯片,操作成功返回0 
 0000           ;       if(OperReturn)
 0000           ;       {
 0000           ;               goto begin;                 //重新启动程序
 0000           ;       }
 0000           ; 
 0000           ;       while( CH375DiskStatus != DISK_CONNECT ) xQueryInterrupt( );  // 查询CH375中断并更新中断状态,等待U盘插入 
 0000           ;       
 0000           ;       mDelaymS( 200 );  //延时,可选操作,有的USB存储器需要几十毫秒的延时 
 0000           ; 
 0000           ; /* 检查U盘是否准备好,有些U盘不需要这一步,但是某些U盘必须要执行这一步才能工作 */
 0000           ;       for ( i = 0; i < 10; i ++ ) 
 0000           ;       {                                       /* 有的U盘总是返回未准备好,不过可以被忽略 */
 0000           ;               mDelaymS( 100 );
 0000           ;               if ( CH375DiskReady( ) == ERR_SUCCESS ) 
 0000           ;         {
 0000           ;             B_status = S_READY;
 0000           ;             break;  /* 查询磁盘是否准备好 */
 0000           ;         }
 0000           ;         else
 0000           ;         {
 0000           ;             B_status = S_NOTREADY;
 0000           ;         }
 0000           ;       }
 0000           ;     put_s("Prepared\n");
 0000           ; 
 0000           ;       while(1)
 0000           ;       {
 0000           ; 
 0000           ;               if(I2cComStatus & BIT(I2C_RECCOM))
 0000           ;               {
 0000           ;             CLOSE_ACK;                //停止应答
 0000           ;             LIGHT_BUSY;
 0000           ;             puts("Command received\n");
 0000           ;             put_bytes(&nComBuff.ReqData.Com,1);
 0000           ;                       I2cComStatus&= ~BIT(I2C_RECCOM);
 0000           ;             if(nComBuff.ReqData.Com == R_RESET)
 0000           ;             {
 0000           ;                 nComBuff.ReqData.Com = 0;
 0000           ;                 goto begin;
 0000           ;             }
 0000           ;                       RecieveFrameProcess( );
 0000           ;             DataPrepared = 0xff;
 0000           ;               }
 0000           ;               if(DataPrepared)
 0000           ;               {
 0000           ;             DataPrepared = 0;
 0000           ;             put_bytes((char* )&nComBuff,MAX_BYTE_TRANS+5);
 0000           ;             OPEN_ACK;                 //进行应答
 0000           ;             OFF_BUSY;
 0000           ;               }
 0000           ;         
 0000           ;       }
 0000           ;       
 0000           ; }
 0000           ;       
 0000           ; 
 0000           ; 
 0000           ; /* 延时指定毫秒时间,根据单片机主频调整,不精确 */
 0000           ; void  mDelaymS( UINT8 ms )
 0000           ; {
 0000           ;       UINT16  i;
 0000           ;       while ( ms -- ) for ( i = 1325; i != 0; i -- );
 0000           ; }
 0000           ; 
 0000           ; 
 0000           ; /******************************************************************************
 0000           ; 延时1uS
 0000           ; *******************************************************************************/
 0000           ;       
 0000           ; void delay_us(void)
 0000           ;     {
 0000           ;          uchar j;
 0000           ;          j++;
 0000           ;       }
 0000           ; /*****************************************************************************
 0000           ; /函数库要调用的100us延时
 0000           ; *****************************************************************************/
 0000           ; void xDelay100uS( void )                              /* 延时100uS */
 0000           ; {
 0000           ;       UINT16  count;
 0000           ;       for ( count = 150; count != 0; count -- ); 
 0000           ; }
 0000           ; /****************************************************************************
 0000           ; /函数库要调用的写入后延时
 0000           ; ****************************************************************************/
 0000           ; void xDelayAfterWrite( void )                 /* 写操作后延时 */
 0000           ; {
 0000           ;       UINT16  count;
 0000           ;       for ( count = 300; count != 0; count -- );  /* 延时200uS左右 */
 0000           ; }
 0000           ; /**************************************************************************
 0000           ; 外部定义的被CH375程序库调用的子程序,向CH375写命令,最小周期为4uS,
 0000           ; 否则之前之后各延时2uS 

⌨️ 快捷键说明

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