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

📄 udisk.lst

📁 AVR单片机平台Atmega32+CH375A芯片读写U盘代码
💻 LST
📖 第 1 页 / 共 5 页
字号:
(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 + -