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 + -
显示快捷键?