📄 udisk.lis
字号:
.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 + -