ch375.lss

来自「atmega32对ch375的读写程序」· LSS 代码 · 共 1,719 行 · 第 1/5 页

LSS
1,719
字号
0000014c <xWriteToExtBuf>:
/* 如果指定枚举序号CH375vFileSize为0xFFFFFFFF后调用FileOpen,那么每搜索到一个文件FileOpen都会调用本回调程序,
   回调程序xFileNameEnumer返回后,FileOpen递减CH375vFileSize并继续枚举直到搜索不到文件或者目录。建议做法是,
   在调用FileOpen之前定义一个全局变量为0,当FileOpen回调本程序后,本程序由CH375vFdtOffset得到结构FAT_DIR_INFO,
   分析结构中的DIR_Attr以及DIR_Name判断是否为所需文件名或者目录名,记录相关信息,并将全局变量计数增量,
   当FileOpen返回后,判断返回值如果是ERR_MISS_FILE或ERR_FOUND_NAME都视为操作成功,全局变量为搜索到的有效文件数。
   如果在本回调程序xFileNameEnumer中将CH375vFileSize置为1,那么可以通知FileOpen提前结束搜索。以下是回调程序例子 */
#if 0
#ifdef FILE_DATA_BUF_LEN
	UINT8			i;
	UINT16			FileCount;
	P_FAT_DIR_INFO	pFileDir;
	PUINT8			NameBuf;
	pFileDir = (P_FAT_DIR_INFO)( (PUINT8)(&DISK_BASE_BUF[0]) + CH375vFdtOffset );  /* 当前FDT的起始地址 */
	FileCount = (UINT16)( 0xFFFFFFFF - CH375vFileSize );  /* 当前文件名的枚举序号,CH375vFileSize初值是0xFFFFFFFF,找到文件名后递减 */
	if ( FileCount < FILE_DATA_BUF_LEN / 12 ) {  /* 检查缓冲区是否足够存放,假定每个文件名需占用12个字节存放 */
		NameBuf = & FILE_DATA_BUF[ FileCount * 12 ];  /* 计算保存当前文件名的缓冲区地址 */
		for ( i = 0; i < 11; i ++ ) NameBuf[ i ] = pFileDir -> DIR_Name[ i ];  /* 复制文件名,长度为11个字符,未处理空格 */
		if ( pFileDir -> DIR_Attr & ATTR_DIRECTORY ) NameBuf[ i ] = 1;  /* 判断是目录名 */
		NameBuf[ i ] = 0;  /* 文件名结束符 */
	}
#endif
#endif
}
#endif

#ifdef EXT_BLK_INTERFACE
#if LIB_CFG_FILE_IO == 0				/* 文件读写的数据的复制方式为"外部子程序" */
#ifdef LIB_CFG_FILE_IO_DEFAULT			/* 如果应用程序中定义该值则使用默认"外部子程序",否则应该自行编写程序代替 */
unsigned char *current_buffer;	/* 保存文件数据读写时的缓冲区的当前指针,由应用程序在调用CH375FileReadX和CH375FileWriteX子程序前设置初值 */
void xWriteToExtBuf( UINT8 mLength )	/* 该子程序由CH375的子程序库调用,用于从CH375读取文件数据到外部缓冲区,被CH375FileReadX调用 */
{
/*	if ( (UINT32)current_buffer + mLength >= (UINT32)&FILE_DATA_BUF + sizeof( FILE_DATA_BUF ) ) return;*/  /* 防止缓冲区溢出 */
	if ( mLength ) {
		do {  /* 根据长度读取数据,实际上长度总是CH375_MAX_DATA_LEN,也就是64 */
			*current_buffer = xReadCH375Data( );  /* 读出数据并保存,可以用这种方式将文件数据保存到单片机的各种串行存储器中 */
			current_buffer ++;
		} while ( -- mLength );
	}  /* 复制上述数据的总时间不得超过2mS */
	else {  /* 重试,恢复缓冲区起址,如果将文件数据读写的缓冲区的当前指针放在mCmdParam.ReadX.mDataBuffer中则会被自动恢复,无需下面的两行程序 */
		current_buffer += (UINT16)mCmdParam.ReadX.mDataBuffer;  /* mDataBuffer中为负值 */
		mCmdParam.ReadX.mDataBuffer = 0;  /* 为了支持重试,在调用CH375FileReadX之前也应该清0 */
	}
}
#ifdef EN_DISK_WRITE
void xReadFromExtBuf( UINT8 mLength )	/* 该子程序由CH375的子程序库调用,用于从外部缓冲区读取文件数据到CH375,被CH375FileWriteX调用 */
{
	if ( mLength ) {
		do {  /* 根据长度写入数据,实际上长度总是CH375_MAX_DATA_LEN,也就是64 */
			xWriteCH375Data( *current_buffer );  /* 将数据写入,可以用这种方式从单片机的各种串行存储器中取出文件数据 */
			current_buffer ++;
		} while ( -- mLength );
	}  /* 复制上述数据的总时间不得超过2mS */
	else {  /* 重试,恢复缓冲区起址,如果将文件数据读写的缓冲区的当前指针放在mCmdParam.WriteX.mDataBuffer中则会被自动恢复,无需下面的两行程序 */
		current_buffer += (UINT16)mCmdParam.WriteX.mDataBuffer;  /* mDataBuffer中为负值 */
		mCmdParam.WriteX.mDataBuffer = 0;  /* 为了支持重试,在调用CH375FileWriteX之前也应该清0 */
	}
}
#endif
#endif
#else									/* LIB_CFG_FILE_IO != 0,文件读写的数据的复制方式不是"外部子程序" */
#ifdef FILE_DATA_BUF_LEN
void xWriteToExtBuf( UINT8 mLength )	/* 不会调用该子程序 */
{
     14c:	08 95       	ret

0000014e <xReadFromExtBuf>:
	mLength --;  /* 该操作无意义,只是避免出现警告信息 */
}
#ifdef EN_DISK_WRITE
void xReadFromExtBuf( UINT8 mLength )	/* 不会调用该子程序 */
{
     14e:	08 95       	ret

00000150 <CH375LibInit>:
	mLength --;  /* 该操作无意义,只是避免出现警告信息 */
}
#endif
#endif
#endif
#endif

UINT8	CH375LibInit( void )  /* 初始化CH375程序库和CH375芯片,操作成功返回0 */
{
	CH375LibConfig = LIB_CFG_VALUE;  /* CH375程序库配置值 */
     150:	85 e0       	ldi	r24, 0x05	; 5
     152:	80 93 e0 06 	sts	0x06E0, r24
	DISK_BASE_BUF[0] = 0;  /* 该操作无意义,只是为了防止编译器优化时不产生DISK_BASE_BUF缓冲区 */
     156:	10 92 c2 02 	sts	0x02C2, r1
	if ( CH375GetVer( ) < CH375_LIB_VER ) return( 0xFF );  /* 获取当前子程序库的版本号,版本太低则返回错误 */
     15a:	0e 94 ef 03 	call	0x7de <CH375GetVer>
     15e:	80 33       	cpi	r24, 0x30	; 48
     160:	18 f4       	brcc	.+6      	; 0x168 <CH375LibInit+0x18>
     162:	8f ef       	ldi	r24, 0xFF	; 255
     164:	90 e0       	ldi	r25, 0x00	; 0
     166:	08 95       	ret
	return( CH375Init( ) );  /* 初始化CH375 */
     168:	0e 94 ba 04 	call	0x974 <CH375Init>
     16c:	99 27       	eor	r25, r25
}
     16e:	08 95       	ret

00000170 <mDelay1uS>:
#define CS_B        (PORTB|= 0X10)
#define LED_1        (PORTC|= 0X80)  
#define LED_0        (PORTC&= 0X7F) 
void mDelay1uS(void )  /* 至少延时1uS,根据单片机主频调整 */
{
     170:	08 95       	ret

00000172 <xReadCH375Data>:
	UINT8	i;
	for ( i = 5; i != 0; i -- );
}

void CH375_PORT_INIT(void )  /* 由于使用通用I/O模块并口读写时序,所以进行初始化 */
{
	DDRA = 0x00;  /* 设置8位并口为输入 */
	PORTD = 0x70;  /* 设置CS,WR,RD默认为高电平 */
	DDRD = 0xF0;  /* 设置CS,WR,RD,A0为输出,设置INT#为输入 */
}

void xWriteCH375Cmd( UINT8 mCmd )		/* 外部定义的被CH375程序库调用的子程序,向CH375写命令 */
{
	mDelay1uS( ); mDelay1uS( );  /* 至少延时1uS */
/*	*(volatile unsigned char *)CH375_CMD_PORT_ADDR = mCmd;  通过并口直接读写CH375而非普通I/O模拟 */
	PORTD |= 0x80;  /* 输出A0=1 */
	PORTA = mCmd;  /* 向CH375的并口输出数据 */
	DDRA = 0xFF;  /* 并口D0-D7输出 */
	PORTD &= 0x9F;  /* 输出有效写控制信号, 写CH375芯片的命令端口, A0=1; CS=0; WR=0; RD=1; */
	DDRA = 0xFF;  /* 该操作无意义,仅作延时,CH375要求读写脉冲宽度大于100nS */
	PORTD |= 0xF0;  /* 输出无效的控制信号, 完成操作CH375芯片, A0=1; CS=1; WR=1; RD=1; */
	DDRA = 0x00;  /* 禁止数据输出 */
	PORTD &= 0x7F;  /* 输出A0=0; 可选操作 */
	mDelay1uS( ); mDelay1uS( );  /* 至少延时2uS */
}

void xWriteCH375Data( UINT8 mData )		/* 外部定义的被CH375程序库调用的子程序,向CH375写数据 */
{
/*	*(volatile unsigned char *)CH375_DAT_PORT_ADDR = mData;  通过并口直接读写CH375而非普通I/O模拟 */
	PORTA = mData;  /* 向CH375的并口输出数据 */
	DDRA = 0xFF;  /* 并口D0-D7输出 */
	PORTD &= 0x1F;  /* 输出有效写控制信号, 写CH375芯片的数据端口, A0=0; CS=0; WR=0; RD=1; */
	DDRA = 0xFF;  /* 该操作无意义,仅作延时,CH375要求读写脉冲宽度大于100nS */
	PORTD |= 0x70;  /* 输出无效的控制信号, 完成操作CH375芯片, A0=0; CS=1; WR=1; RD=1; */
	DDRA = 0x00;  /* 禁止数据输出 */
	mDelay1uS( );  /* 至少延时1.2uS */
}

UINT8 xReadCH375Data( void )			/* 外部定义的被CH375程序库调用的子程序,从CH375读数据 */
{
	UINT8	mData;
/*	mData = *(volatile unsigned char *)CH375_DAT_PORT_ADDR;  通过并口直接读写CH375而非普通I/O模拟 */
	mDelay1uS( );  /* 至少延时1.2uS */
	DDRA = 0x00;  /* 数据输入 */
     172:	1a ba       	out	0x1a, r1	; 26
	PORTD &= 0x2F;  /* 输出有效读控制信号, 读CH375芯片的数据端口, A0=0; CS=0; WR=1; RD=0; */
     174:	82 b3       	in	r24, 0x12	; 18
     176:	8f 72       	andi	r24, 0x2F	; 47
     178:	82 bb       	out	0x12, r24	; 18
	DDRA = 0x00;  /* 该操作无意义,仅作延时,CH375要求读写脉冲宽度大于100nS */
     17a:	1a ba       	out	0x1a, r1	; 26
	mData = PINA;  /* 从CH375的并口PA输入数据 */
     17c:	99 b3       	in	r25, 0x19	; 25
	PORTD |= 0x70;  /* 输出无效的控制信号, 完成操作CH375芯片, A0=0; CS=1; WR=1; RD=1; */
     17e:	82 b3       	in	r24, 0x12	; 18
     180:	80 67       	ori	r24, 0x70	; 112
     182:	82 bb       	out	0x12, r24	; 18
	return( mData );
}
     184:	89 2f       	mov	r24, r25
     186:	99 27       	eor	r25, r25
     188:	08 95       	ret

0000018a <xWriteCH375Cmd>:
     18a:	97 9a       	sbi	0x12, 7	; 18
     18c:	8b bb       	out	0x1b, r24	; 27
     18e:	9f ef       	ldi	r25, 0xFF	; 255
     190:	9a bb       	out	0x1a, r25	; 26
     192:	82 b3       	in	r24, 0x12	; 18
     194:	8f 79       	andi	r24, 0x9F	; 159
     196:	82 bb       	out	0x12, r24	; 18
     198:	9a bb       	out	0x1a, r25	; 26
     19a:	82 b3       	in	r24, 0x12	; 18
     19c:	80 6f       	ori	r24, 0xF0	; 240
     19e:	82 bb       	out	0x12, r24	; 18
     1a0:	1a ba       	out	0x1a, r1	; 26
     1a2:	97 98       	cbi	0x12, 7	; 18
     1a4:	08 95       	ret

000001a6 <xQueryInterrupt>:
     1a6:	82 99       	sbic	0x10, 2	; 16
     1a8:	fe cf       	rjmp	.-4      	; 0x1a6 <xQueryInterrupt>
     1aa:	82 e2       	ldi	r24, 0x22	; 34
     1ac:	0e 94 c5 00 	call	0x18a <xWriteCH375Cmd>
     1b0:	0e 94 b9 00 	call	0x172 <xReadCH375Data>
     1b4:	80 93 ee 06 	sts	0x06EE, r24
     1b8:	80 91 ee 06 	lds	r24, 0x06EE
     1bc:	86 31       	cpi	r24, 0x16	; 22
     1be:	21 f4       	brne	.+8      	; 0x1c8 <xQueryInterrupt+0x22>
     1c0:	81 e0       	ldi	r24, 0x01	; 1
     1c2:	80 93 08 07 	sts	0x0708, r24
     1c6:	08 95       	ret
     1c8:	80 91 ee 06 	lds	r24, 0x06EE
     1cc:	85 31       	cpi	r24, 0x15	; 21
     1ce:	19 f4       	brne	.+6      	; 0x1d6 <xQueryInterrupt+0x30>
     1d0:	82 e0       	ldi	r24, 0x02	; 2
     1d2:	80 93 08 07 	sts	0x0708, r24
     1d6:	08 95       	ret

000001d8 <CH375_PORT_INIT>:
     1d8:	1a ba       	out	0x1a, r1	; 26
     1da:	80 e7       	ldi	r24, 0x70	; 112
     1dc:	82 bb       	out	0x12, r24	; 18
     1de:	80 ef       	ldi	r24, 0xF0	; 240
     1e0:	81 bb       	out	0x11, r24	; 17
     1e2:	08 95       	ret

000001e4 <xWriteCH375Data>:
     1e4:	8b bb       	out	0x1b, r24	; 27
     1e6:	9f ef       	ldi	r25, 0xFF	; 255
     1e8:	9a bb       	out	0x1a, r25	; 26
     1ea:	82 b3       	in	r24, 0x12	; 18
     1ec:	8f 71       	andi	r24, 0x1F	; 31
     1ee:	82 bb       	out	0x12, r24	; 18
     1f0:	9a bb       	out	0x1a, r25	; 26
     1f2:	82 b3       	in	r24, 0x12	; 18
     1f4:	80 67       	ori	r24, 0x70	; 112
     1f6:	82 bb       	out	0x12, r24	; 18
     1f8:	1a ba       	out	0x1a, r1	; 26
     1fa:	08 95       	ret

000001fc <mDelaymS>:


void	mDelaymS( UINT8 ms )
{
	UINT16	i;
	while ( ms -- ) for ( i = 2600; i != 0; i -- );
     1fc:	81 50       	subi	r24, 0x01	; 1
     1fe:	8f 3f       	cpi	r24, 0xFF	; 255
     200:	31 f0       	breq	.+12     	; 0x20e <mDelaymS+0x12>
     202:	28 e2       	ldi	r18, 0x28	; 40
     204:	3a e0       	ldi	r19, 0x0A	; 10
     206:	22 53       	subi	r18, 0x32	; 50
     208:	30 40       	sbci	r19, 0x00	; 0
     20a:	e9 f7       	brne	.-6      	; 0x206 <mDelaymS+0xa>
     20c:	f7 cf       	rjmp	.-18     	; 0x1fc <mDelaymS>
     20e:	08 95       	ret

00000210 <mStopIfError>:
}

/* 检查操作状态,如果错误则显示错误代码并停机 */
void	mStopIfError( UINT8 iError )
{
	if ( iError == ERR_SUCCESS ) return;  
     210:	81 11       	cpse	r24, r1
	
	while ( 1 ) {
     212:	ff cf       	rjmp	.-2      	; 0x212 <mStopIfError+0x2>
     214:	08 95       	ret

00000216 <delay50us>:

	}
}


//**********************短延时程序50us**************************// 
void delay50us(uint t) 
{ 
    uint j;       
    for(;t>0;t--)          
     216:	00 97       	sbiw	r24, 0x00	; 0
     218:	41 f0       	breq	.+16     	; 0x22a <delay50us+0x14>
     21a:	25 e4       	ldi	r18, 0x45	; 69
     21c:	30 e0       	ldi	r19, 0x00	; 0
        for(j=0;j<70;j++) ;   
     21e:	23 52       	subi	r18, 0x23	; 35
     220:	30 40       	sbci	r19, 0x00	; 0
     222:	37 ff       	sbrs	r19, 7
     224:	fc cf       	rjmp	.-8      	; 0x21e <delay50us+0x8>
     226:	01 97       	sbiw	r24, 0x01	; 1
     228:	f6 cf       	rjmp	.-20     	; 0x216 <delay50us>
     22a:	08 95       	ret

0000022c <delay5us>:
             
} 
//**********************短延时程序5us**************************// 
void delay5us(uint t) 
{ 
    uint j;       
    for(;t>0;t--)          
     22c:	00 97       	sbiw	r24, 0x00	; 0
     22e:	11 f0       	breq	.+4      	; 0x234 <delay5us+0x8>
     230:	01 97       	sbiw	r24, 0x01	; 1
     232:	fc cf       	rjmp	.-8      	; 0x22c <delay5us>
     234:	08 95       	ret

00000236 <__vector_13>:
        for(j=0;j<7;j++)    
            ; 
} 


SIGNAL(SIG_UART_RECV)
{	
     236:	1f 92       	push	r1
     238:	0f 92       	push	r0
     23a:	0f b6       	in	r0, 0x3f	; 63
     23c:	0f 92       	push	r0
     23e:	11 24       	eor	r1, r1
     240:	2f 93       	push	r18
     242:	8f 93       	push	r24
     244:	9f 93       	push	r25
     246:	ef 93       	push	r30
     248:	ff 93       	push	r31
	 if (write_times==5)cli();
     24a:	80 91 9a 00 	lds	r24, 0x009A
     24e:	90 91 9b 00 	lds	r25, 0x009B
     252:	05 97       	sbiw	r24, 0x05	; 5
     254:	09 f4       	brne	.+2      	; 0x258 <__vector_13+0x22>
     256:	f8 94       	cli
	 data[x]= UDR;
     258:	80 91 9e 00 	lds	r24, 0x009E
     25c:	90 91 9f 00 	lds	r25, 0x009F
     260:	e0 91 9e 00 	lds	r30, 0x009E
     264:	f0 91 9f 00 	lds	r31, 0x009F
     268:	ee 53       	subi	r30, 0x3E	; 62
     26a:	ff 4f       	sbci	r31, 0xFF	; 255
     26c:	8c b1       	in	r24, 0x0c	; 12
     26e:	80 83       	st	Z, r24
	 x++;
     270:	80 91 9e 00 	lds	r24, 0x009E
     274:	90 91 9f 00 	lds	r25, 0x009F
     278:	01 96       	adiw	r24, 0x01	; 1
     27a:	90 93 9f 00 	sts	0x009F, r25
     27e:	80 93 9e 00 	sts	0x009E, r24
	 if (x%2)LED_0;
     282:	80 91 9e 00 	lds	r24, 0x009E
     286:	90 91 9f 00 	lds	r25, 0x009F
     28a:	80 ff       	sbrs	r24, 0

⌨️ 快捷键说明

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