📄 udisk.lst
字号:
(0005) #include <iom32v.h>
(0006) #include "macros.h"
(0007) #include <string.h>
(0008) #include <stdio.h>
(0009) #include "twi.h"
(0010) #include "UART.h"
(0011) #include "udisk.h"
(0012)
(0013)
(0014) #define uchar unsigned char
(0015) #define UINT8 unsigned char
(0016) #define ulong unsigned long
(0017) #define uint unsigned int
(0018) //端口的定义,用I/O模拟总线方式
(0019) //LED定义
(0020) #define LEDPORT PORTD
(0021) #define ALLLED 0xF0
(0022) #define LEDRD PD7
(0023) #define LEDWR PD6
(0024) #define LEDBUSY PD5
(0025) #define LEDERR PD4
(0026) //按键定义
(0027) #define KEYPORT PIND
(0028) #define S1 PD3
(0029) //模拟总线定义
(0030) #define DATAOUT PORTA //D0~D7在PA口
(0031) #define DATAIN PINA
(0032)
(0033) #define CTRLBUS PORTC
(0034) #define CTRLWR PC7 //WR信号线在PC7
(0035) #define CTRLRD PC6 //RD信号线在PC6
(0036)
(0037) #define ADDRBUS PORTB
(0038) #define A0 PB0 //A0地址线在PB0
(0039)
(0040) #define CSPORT PORTB
(0041) #define CS PB1 //片选线在PB1
(0042)
(0043) //一些总线控制宏定义
(0044) #define WRCTRL CTRLBUS&= ~BIT(CTRLWR) //写总线置低
(0045) #define RDCTRL CTRLBUS&= ~BIT(CTRLRD) //读总线置低
(0046) #define CLRCTRL CTRLBUS|= (BIT(CTRLWR)|BIT(CTRLRD)) //读写总线均置高
(0047) #define MCMD ADDRBUS|= BIT(A0) //指令的读写模式,A0置高
(0048) #define MDATA ADDRBUS&= ~BIT(A0) //数据的读写模式,A0置低
(0049) #define CSEN ADDRBUS&= ~BIT(CS) //CS使能置低
(0050) #define CSDIS ADDRBUS|= BIT(CS) //CS不使能置高
(0051) #define DATADIRI DDRA=0 //数据输入方式把DDRA置0
(0052) #define DATADIRO DDRA=0xff //数据输出方式把DDAR置0xff
(0053)
(0054)
(0055)
(0056) //点灯的宏定义
(0057)
(0058) #define LIGHT_WR LEDPORT&= ~BIT(LEDWR)
(0059) #define OFF_WR LEDPORT|= BIT(LEDWR)
(0060) #define LIGHT_RD LEDPORT&= ~BIT(LEDRD)
(0061) #define OFF_RD LEDPORT|= BIT(LEDRD)
(0062) #define LIGHT_BUSY LEDPORT&= ~BIT(LEDBUSY)
(0063) #define OFF_BUSY LEDPORT|= BIT(LEDBUSY)
(0064) #define LIGHT_ERR LEDPORT&= ~BIT(LEDERR)
(0065) #define OFF_ERR LEDPORT|= BIT(LEDERR)
(0066)
(0067) #define LIGHT_ALL LEDPORT&= ~ALLLED
(0068) #define OFF_ALL LEDPORT|= ALLLED
(0069)
(0070) #define I2C_SEND_READY DataPrepared = 0xff
(0071) #define CLR_COMFLAGE I2cComStatus = 0
(0072)
(0073) #define FILE_ATTRI_BYTES 9
(0074)
(0075)
(0076)
(0077) #define RETURN_SUCCESS nComBuff.AckData.Ack = A_SUCCESS
(0078)
(0079) //决定是否使能应答
(0080) #define OPEN_ACK TWCR|= 1<<TWEA
(0081) #define CLOSE_ACK TWCR&= ~(1<<TWEA)
(0082)
(0083)
(0084)
(0085) /* 以下定义的详细说明请看CH375HF9.H文件 */
(0086) #define LIB_CFG_FILE_IO 1 /* 文件读写的数据的复制方式,0为"外部子程序",1为"内部复制" */
(0087) #define LIB_CFG_INT_EN 0 /* CH375的INT#引脚连接方式,0为"查询方式",1为"中断方式" */
(0088)
(0089) /* 单片机的RAM有限,其中CH375子程序用512字节,剩余RAM部分可以用于文件读写缓冲 */
(0090) #define FILE_DATA_BUF_LEN 512 /* 外部RAM的文件数据缓冲区,缓冲区长度不小于一次读写的数据长度 */
(0091)
(0092) #define CH375_INT_WIRE ( PIND & 0x04 ) /* PIND.2, CH375的中断线INT#引脚,连接CH375的INT#引脚,用于查询中断状态 */
(0093)
(0094) #define NO_DEFAULT_CH375_F_ENUM 1 /* 未调用CH375FileEnumer程序故禁止以节约代码 */
(0095) //#define NO_DEFAULT_CH375_F_QUERY 1 /* 未调用CH375FileQuery程序故禁止以节约代码 */
(0096) #define LIB_CFG_FILE_IO_DEFAULT
(0097) #define NO_DEFAULT_DELAY_100US //用自己定义的延时100us函数实现延时
(0098) #define NO_DEFAULT_DELAY_WRITE //用自己定义的延时函数实现写入后的延时
(0099) #include "CH375HFB.h"
(0100)
(0101)
(0102)
(0103) void init_devices(void );
(0104) void mDelaymS( UINT8 ms );
(0105) void xDelay100uS( void );
(0106) void xDelayAfterWrite( void );
(0107)
(0108) void twi_process(void);
(0109) void transmit_process(void);
(0110) void receive_process(void);
(0111) void twisentbyte(unsigned char SentData);
(0112) void delay_us(void);
(0113) void xWriteCH375Cmd( UINT8 mCmd );
(0114) void xWriteCH375Data( UINT8 mData );
(0115) UINT8 xReadCH375Data( void );
(0116) void timer0_ovf_isr(void);
(0117) void timer0_init(void);
(0118) void twi_isr(void);
(0119) void variable(void);
(0120) void RecieveFrameProcess( void );
(0121) void ModuleSetOffset(uchar ModeLocate);
(0122)
(0123) COM_BUFF nComBuff;
(0124) uchar ys20ms;
(0125)
(0126) uchar B_status; //模块大状态变量
(0127) uchar temp[10];
(0128)
(0129) uchar OperReturn;
(0130) uchar DataPrepared; //数据是否准备好变量
(0131) uchar rdcount;
(0132)
(0133) extern uint *SlaveSendLength;
(0134) extern uchar I2cComStatus; //通信状态变量
(0135)
(0136) /*Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0
(0137) I2CRecCom I2C_sendCom
(0138) I2C_RecCom--Recieve complete
(0139) I2C_SendCom--Transmmit complete
(0140) **********************************************************/
(0141) extern unsigned char *I2cReceiveData; //I2c数据接收缓冲地址
(0142) extern unsigned char *I2cSendData; //I2c数据发送缓冲地址
(0143)
(0144) extern unsigned char *UartRx; //存放接收数据的指针
(0145) extern unsigned int *RxLength; //数据接收长度地址指针
(0146) extern unsigned char UartState; //UART状态变量
(0147)
(0148)
(0149)
(0150)
(0151) void main(void)
(0152) {
(0153) UINT8 i;
(0154) uint j=200;
_main:
j --> R20
i --> R20
00B1 EC48 LDI R20,0xC8
00B2 E050 LDI R21,0
(0155) begin: variable( ); //变量的初始化
00B3 D416 RCALL _variable
(0156) i2cSetBitrate(100);
00B4 E604 LDI R16,0x64
00B5 E010 LDI R17,0
00B6 940E0527 CALL _i2cSetBitrate
(0157) i2cInit();
00B8 940E0546 CALL _i2cInit
(0158) i2cSetLocalDeviceAddr(0x60,1);
00BA E021 LDI R18,1
00BB E600 LDI R16,0x60
00BC 940E0553 CALL _i2cSetLocalDeviceAddr
(0159) init_USART(0);
00BE 2700 CLR R16
00BF 940E08E0 CALL _init_USART
(0160) init_devices( );
00C1 D45A RCALL _init_devices
(0161) /*测试延时时间是否充足*/
(0162) xDelay100uS( );
00C2 D08D RCALL _xDelay100uS
(0163) delay_us( );
00C3 D08A RCALL _delay_us
(0164) put_s("Start\n");
00C4 E70C LDI R16,0x7C
00C5 E010 LDI R17,0
00C6 940E0880 CALL _put_s
(0165) for(i=0;i<3;i++) //闪烁三次
00C8 2744 CLR R20
00C9 C015 RJMP 0x00DF
(0166) {
(0167) LIGHT_ALL;
00CA B382 IN R24,0x12
00CB 708F ANDI R24,0xF
00CC BB82 OUT 0x12,R24
(0168) ys20ms=20;
00CD E184 LDI R24,0x14
00CE 9380009A STS ys20ms,R24
(0169) while(ys20ms);
00D0 9020009A LDS R2,ys20ms
00D2 2022 TST R2
00D3 F7E1 BNE 0x00D0
(0170) OFF_ALL;
00D4 B382 IN R24,0x12
00D5 6F80 ORI R24,0xF0
00D6 BB82 OUT 0x12,R24
(0171) ys20ms=20;
00D7 E184 LDI R24,0x14
00D8 9380009A STS ys20ms,R24
(0172) while(ys20ms);
00DA 9020009A LDS R2,ys20ms
00DC 2022 TST R2
00DD F7E1 BNE 0x00DA
00DE 9543 INC R20
00DF 3043 CPI R20,3
00E0 F348 BCS 0x00CA
(0173)
(0174) }
(0175)
(0176) OperReturn = CH375LibInit( ); // 初始化CH375程序库和CH375芯片,操作成功返回0
00E1 DFC0 RCALL _CH375LibInit
00E2 9300008E STS OperReturn,R16
(0177) if(OperReturn)
00E4 2300 TST R16
00E5 F011 BEQ 0x00E8
(0178) {
(0179) goto begin; //重新启动程序
00E6 CFCC RJMP 0x00B3
(0180) }
(0181)
(0182) while( CH375DiskStatus != DISK_CONNECT ) xQueryInterrupt( ); // 查询CH375中断并更新中断状态,等待U盘插入
00E7 DF9E RCALL _xQueryInterrupt
00E8 918007FC LDS R24,CH375DiskStatus
00EA 3082 CPI R24,2
00EB F7D9 BNE 0x00E7
(0183)
(0184) mDelaymS( 200 ); //延时,可选操作,有的USB存储器需要几十毫秒的延时
00EC EC08 LDI R16,0xC8
00ED D04D RCALL _mDelaymS
(0185)
(0186) /* 检查U盘是否准备好,有些U盘不需要这一步,但是某些U盘必须要执行这一步才能工作 */
(0187) for ( i = 0; i < 10; i ++ )
00EE 2744 CLR R20
00EF C00E RJMP 0x00FE
(0188) { /* 有的U盘总是返回未准备好,不过可以被忽略 */
(0189) mDelay
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -