📄 test.lst
字号:
C51 COMPILER V8.01 TEST 09/12/2007 16:46:41 PAGE 1
C51 COMPILER V8.01, COMPILATION OF MODULE TEST
OBJECT MODULE PLACED IN D:\HEX\TEST.obj
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE TEST.C BROWSE DEBUG OBJECTEXTEND OBJECT(D:\HEX\TEST.obj)
line level source
1 /*
2 ; CH375/CH372 Bulk Data Test
3 ; U2(AT89C51) Program
4 ; 本程序测试数据传输的正确性,可以用于长时间连续测试,对应的计算机端的测试程序为TEST.EXE
5 ; 方法: 下传随机长度的随机数据包,被单片机接收并将数据按位取反后返回,最终由计算机程序接收后比较数据是否正确
6 ;
7 ; Website: http://winchiphead.com
8 ; Email: tech@winchiphead.com
9 ; Author: W.ch 2003.09
10 */
11
12 /* MCS-51单片机C语言的示例程序,用于其它单片机时一般只要修改前面几个接口子程序及硬件定义 */
13
14 #pragma NOAREGS
15 #include <reg52.h>
16 #include <string.h>
17 #include "CH375INC.H" /* 头文件,在网上下载的CH372或者CH375评估板资料中有 */
18
19 unsigned char volatile xdata CH375_CMD_PORT _at_ 0x8801; /* CH375命令端口的I/O地址 */
20 unsigned char volatile xdata CH375_DAT_PORT _at_ 0x8800; /* CH375数据端口的I/O地址 */
21
22 /* 延时2微秒,不精确 */
23 void delay2us( )
24 {
25 1 unsigned char i;
26 1 for ( i = 2; i != 0; i -- ); /* 根据单片机的时钟选择初值 */
27 1 }
28
29 /* 延时1微秒,不精确,因为MCS51单片机较慢所以实际上无需延时 */
30 //void delay1us( )
31 //{
32 // unsigned char i;
33 // for ( i = 1; i != 0; i -- );
34 //}
35
36 /* 基本操作 */
37
38 void CH375_WR_CMD_PORT( unsigned char cmd ) { /* 向CH375的命令端口写入命令,周期不小于4uS,如果单片机较快则
-延时 */
39 1 delay2us();
40 1 CH375_CMD_PORT=cmd;
41 1 /* ******************** 注释中是用普通I/O引脚模拟8位并口的时序,CH375_CS引脚是可选的,可以一直接GND强制片选
42 1 CH375_D0_D7 = cmd;
43 1 CH375_A0 = 1; 选择CH375的命令口
44 1 // CH375_D0_D7_DIR = output; 对于标准双向I/O,请在此设置为输出方向
45 1 CH375_RD = 1; 如果I/O默认电平是高电平,那么这是可选操作
46 1 CH375_CS = 0;
47 1 CH375_WR = 0;
48 1 // CH375_CS = 0; 对于高速单片机,该指令用于延时,以便向CH375_WR产生宽度至少为80nS的低电平脉冲
49 1 CH375_WR = 1;
50 1 CH375_CS = 1;
51 1 CH375_A0 = 0;
52 1 // CH375_D0_D7_DIR = input; 对于标准双向I/O,请在此设置为输入方向
53 1 CH375_D0_D7 = 0xFF; 对于准双向I/O,请在此设置输出全高电平
54 1 ******************** */
C51 COMPILER V8.01 TEST 09/12/2007 16:46:41 PAGE 2
55 1 delay2us();
56 1 }
57
58 void CH375_WR_DAT_PORT( unsigned char dat ) { /* 向CH375的数据端口写入数据,周期不小于1.5uS,如果单片机较快
-则延时 */
59 1 CH375_DAT_PORT=dat;
60 1 /* ******************** 注释中是用普通I/O引脚模拟8位并口的时序
61 1 CH375_D0_D7 = dat;
62 1 // CH375_D0_D7_DIR = output; 对于标准双向I/O,请在此设置为输出方向
63 1 CH375_CS = 0;
64 1 CH375_WR = 0;
65 1 // CH375_CS = 0; 对于高速单片机,该指令用于延时,以便向CH375_WR产生宽度至少为80nS的低电平脉冲
66 1 CH375_WR = 1;
67 1 CH375_CS = 1;
68 1 // CH375_D0_D7_DIR = input; 对于标准双向I/O,请在此设置为输入方向
69 1 CH375_D0_D7 = 0xFF; 对于准双向I/O,请在此设置输出全高电平
70 1 ******************** */
71 1 // delay1us(); /* 因为MCS51单片机较慢所以实际上无需延时 */
72 1 }
73
74 unsigned char CH375_RD_DAT_PORT( void ) { /* 从CH375的数据端口读出数据,周期不小于1.5uS,如果单片机较快则延
-时 */
75 1 // delay1us(); /* 因为MCS51单片机较慢所以实际上无需延时 */
76 1 /* ******************** 注释中是用普通I/O引脚模拟8位并口的时序
77 1 // CH375_D0_D7_DIR = input; 对于标准双向I/O,请在此设置为输入方向
78 1 CH375_D0_D7 = 0xFF; 对于准双向I/O,请在此设置输出全高电平,便于输入
79 1 CH375_CS = 0;
80 1 CH375_RD = 0;
81 1 // CH375_CS = 0; 对于高速单片机,该指令用于延时,以便向CH375_RD产生宽度至少为80nS的低电平脉冲
82 1 unsigned char dat = CH375_D0_D7;
83 1 CH375_RD = 1;
84 1 CH375_CS = 1;
85 1 CH375_D0_D7 = 0xFF; 对于准双向I/O,请在此设置输出全高电平
86 1 return( dat );
87 1 ******************** */
88 1 return( CH375_DAT_PORT );
89 1 }
90
91 /* 延时50毫秒,不精确 */
92 void Delay50ms( )
93 {
94 1 unsigned char i, j;
95 1 for ( i=200; i!=0; i-- ) for ( j=250; j!=0; j-- );
96 1 }
97
98 /* CH375初始化子程序 */
99 void CH375_Init( )
100 {
101 1 unsigned char i;
102 1 /* 测试CH375是否正常工作,可选操作,通常不需要 */
103 1 CH375_WR_CMD_PORT( CMD_CHECK_EXIST ); /* 测试CH375是否正常工作 */
104 1 CH375_WR_DAT_PORT( 0x55 ); /* 写入测试数据 */
105 1 i = ~ 0x55; /* 返回数据应该是测试数据取反 */
106 1 if ( CH375_RD_DAT_PORT( ) != i ) { /* CH375不正常 */
107 2 for ( i=80; i!=0; i-- ) {
108 3 CH375_WR_CMD_PORT( CMD_RESET_ALL ); /* 多次重复发命令,执行硬件复位 */
109 3 CH375_RD_DAT_PORT( );
110 3 }
111 2 CH375_WR_CMD_PORT( 0 );
112 2 Delay50ms( ); /* 延时50ms */
113 2 }
114 1 /* 设置USB工作模式, 必要操作 */
C51 COMPILER V8.01 TEST 09/12/2007 16:46:41 PAGE 3
115 1 CH375_WR_CMD_PORT( CMD_SET_USB_MODE );
116 1 CH375_WR_DAT_PORT( 2 ); /* 设置为使用内置固件的USB设备方式 */
117 1 for ( i=100; i!=0; i-- ) { /* 等待操作成功,通常需要等待10uS-20uS */
118 2 if ( CH375_RD_DAT_PORT( ) == CMD_RET_SUCCESS ) break;
119 2 }
120 1 /* if ( i==0 ) { CH372/CH375存在硬件错误 }; */
121 1 /* 下述启用中断,假定CH375连接在INT0 */
122 1 IT1 = 0; /* 置外部信号为低电平触发 */
123 1 IE1 = 0; /* 清中断标志 */
124 1 EX1 = 1; /* 允许CH375中断 */
125 1 }
126
127 /* CH375中断服务程序,使用寄存器组1 */
128 void mCh375Interrupt( ) interrupt 2 using 1
129 {
130 1 unsigned char InterruptStatus;
131 1 unsigned char i, length;
132 1 unsigned char data buffer[ 64 ];
133 1 CH375_WR_CMD_PORT( CMD_GET_STATUS ); /* 获取中断状态并取消中断请求 */
134 1 InterruptStatus = CH375_RD_DAT_PORT( ); /* 获取中断状态 */
135 1 switch ( InterruptStatus ) { /* 分析中断状态处理 */
136 2 case USB_INT_EP2_OUT: { /* 批量端点下传成功 */
137 3 CH375_WR_CMD_PORT( CMD_RD_USB_DATA ); /* 从当前USB中断的端点缓冲区读取数据块,并释放缓冲区 */
138 3 length = CH375_RD_DAT_PORT( ); /* 首先读取后续数据长度 */
139 3 for ( i = 0; i < length; i ++ ) buffer[ i ] = CH375_RD_DAT_PORT( ); /* 接收数据包 */
140 3 /* 测试数据正确性,将接收到的命令包数据取反后返回给PC机 */
141 3 CH375_WR_CMD_PORT( CMD_WR_USB_DATA7 ); /* 向USB端点2的发送缓冲区写入数据块 */
142 3 CH375_WR_DAT_PORT( length ); /* 首先写入后续数据长度,回传刚接收到的数据长度 */
143 3 for ( i = 0; i < length; i ++ ) CH375_WR_DAT_PORT( ~ buffer[ i ] ); /* 数据取反后返回,由计算机应用程序
-测试数据是否正确 */
144 3 break;
145 3 }
146 2 case USB_INT_EP2_IN: { /* 批量数据发送成功 */
147 3 CH375_WR_CMD_PORT( CMD_UNLOCK_USB ); /* 释放当前USB缓冲区 */
148 3 break;
149 3 }
150 2 default: { /* 其它中断,未用到,解锁后退出即可 */
151 3 CH375_WR_CMD_PORT( CMD_UNLOCK_USB ); /* 释放当前USB缓冲区 */
152 3 break;
153 3 }
154 2 }
155 1 }
156
157 main( ) {
158 1 Delay50ms( ); /* 延时等待CH375初始化完成,如果单片机由CH375提供复位信号则不必延时 */
159 1 CH375_Init( ); /* 初始化CH375 */
160 1 EA = 1; /* 允许中断 */
161 1 while ( 1 ); /* 以下指令开始工作循环,等待PC机命令进行操作 */
162 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 219 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = ---- 64
IDATA SIZE = ---- ----
BIT SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -