📄 pdiusbd12.lst
字号:
C51 COMPILER V8.02 PDIUSBD12 06/17/2010 09:51:39 PAGE 1
C51 COMPILER V8.02, COMPILATION OF MODULE PDIUSBD12
OBJECT MODULE PLACED IN PDIUSBD12.OBJ
COMPILER INVOKED BY: D:\处理软件\keil\C51\BIN\C51.EXE PDIUSBD12.c BROWSE DEBUG OBJECTEXTEND
line level source
1 /******************************************************************
2 本程序只供学习使用,未经作者许可,不得用于其它任何用途
3
4 欢迎光临天祥电子 www.txmcu.cn
5
6 *******************************************************************/
7
8
9 #include <AT89x52.H>
10 #include "MyType.h"
11 #include "PDIUSBD12.H"
12 #include "config.h"
13 #include "UART.h"
14
15 //输入数据
16 unsigned char inportb(unsigned int Addr)
17 {
18 1 return *((unsigned char xdata *) Addr);
19 1 }
20 ////////////////////////End of function//////////////////////////////
21
22 /********************************************************************
23 函数功能:读D12的ID。
24 入口参数:无。
25 返 回:D12的ID。
26 备 注:无。
27 ********************************************************************/
28 uint16 D12ReadID(void)
29 {
30 1 uint16 i,j;
31 1 outportb(D12COMMAND, 0xFD);
32 1 i=inportb(D12DATA);
33 1 j=inportb(D12DATA);
34 1 i += (j<<8);
35 1 return i;
36 1 }
37 ////////////////////////End of function//////////////////////////////
38
39 //输出数据
40 void outportb(unsigned int Addr, unsigned char Data)
41 {
42 1 *((unsigned char xdata *) Addr) = Data;
43 1 }
44 ////////////////////////End of function//////////////////////////////
45
46 /********************************************************************
47 函数功能:读取D12最后传输状态寄存器的函数。
48 入口参数:Endp:端点号。
49 返 回:端点的最后传输状态。
50 备 注:该操作将清除该端点的中断标志位。
51 ********************************************************************/
52 uint8 D12ReadEndpointLastStatus(uint8 Endp)
53 {
54 1 outportb(D12COMMAND, 0x40+Endp);
55 1 return inportb(D12DATA);
C51 COMPILER V8.02 PDIUSBD12 06/17/2010 09:51:39 PAGE 2
56 1 }
57 ////////////////////////End of function//////////////////////////////
58
59 /********************************************************************
60 函数功能:选择端点的函数,选择一个端点后才能对它进行数据操作。
61 入口参数:Endp:端点号。
62 返 回:无。
63 备 注:无。
64 ********************************************************************/
65 void D12SelectEndpoint(uint8 Endp)
66 {
67 1 outportb(D12COMMAND, 0x00+Endp);
68 1 }
69 ////////////////////////End of function//////////////////////////////
70
71 /********************************************************************
72 函数功能:清除接收端点缓冲区的函数。
73 入口参数:无。
74 返 回:无。
75 备 注:只有使用该函数清除端点缓冲后,该接收端点才能接收新的数据包。
76 ********************************************************************/
77 void D12ClearBuffer(void)
78 {
79 1 outportb(D12COMMAND, D12_CLEAR_BUFFER);
80 1 }
81 ////////////////////////End of function//////////////////////////////
82
83 /********************************************************************
84 函数功能:应答建立包的函数。
85 入口参数:无。
86 返 回:无。
87 备 注:无。
88 ********************************************************************/
89 void D12AcknowledgeSetup(void)
90 {
91 1 D12SelectEndpoint(1); //选择端点0输入
92 1 outportb(D12COMMAND, D12_ACKNOWLEDGE_SETUP);
93 1 D12SelectEndpoint(0); //选择端点0输出
94 1 outportb(D12COMMAND, D12_ACKNOWLEDGE_SETUP);
95 1 }
96 ////////////////////////End of function//////////////////////////////
97
98 /********************************************************************
99 函数功能:读取端点缓冲区函数。
100 入口参数:Endp:端点号;Len:需要读取的长度;Buf:保存数据的缓冲区。
101 返 回:实际读到的数据长度。
102 备 注:无。
103 ********************************************************************/
104 uint8 D12ReadEndpointBuffer(uint8 Endp, uint8 Len, uint8 *Buf)
105 {
106 1 uint8 i,j;
107 1 D12SelectEndpoint(Endp); //选择要操作的端点缓冲
108 1 outportb(D12COMMAND, D12_READ_BUFFER);
109 1 inportb(D12DATA); //该字节数据是保留的,不用。
110 1 j=inportb(D12DATA); //这里才是实际的接收到的数据长度
111 1 if(j>Len) //如果要读的字节数比实际接收到的数据长
112 1 {
113 2 j=Len; //则只读指定的长度数据
114 2 }
115 1 #ifdef DEBUG1 //如果定义了DEBUG1,则需要显示调试信息
116 1 Prints("读端点");
117 1 PrintLongInt(Endp/2); //端点号。由于D12特殊的端点组织形式,
C51 COMPILER V8.02 PDIUSBD12 06/17/2010 09:51:39 PAGE 3
118 1 //这里的0和1分别表示端点0的输出和输入;
119 1 //而2、3分别表示端点1的输出和输入;
120 1 //3、4分别表示端点2的输出和输入。
121 1 //因此要除以2才显示对应的端点。
122 1 Prints("缓冲区");
123 1 PrintLongInt(j); //实际读取的字节数
124 1 Prints("字节。\r\n");
125 1 #endif
126 1 for(i=0;i<j;i++)
127 1 {
128 2 *(Buf+i)=inportb(D12DATA);
129 2 #ifdef DEBUG1
130 2 PrintHex(*(Buf+i)); //如果需要显示调试信息,则显示读到的数据
131 2 if(((i+1)%16)==0)Prints("\r\n"); //每16字节换行一次
132 2 #endif
133 2 }
134 1 #ifdef DEBUG1
135 1 if((j%16)!=0)Prints("\r\n"); //换行。
136 1 #endif
137 1 return j; //返回实际读取的字节数。
138 1 }
139 ////////////////////////End of function//////////////////////////////
140
141 /********************************************************************
142 函数功能:使能发送端点缓冲区数据有效的函数。
143 入口参数:无。
144 返 回:无。
145 备 注:只有使用该函数使能发送端点数据有效之后,数据才能发送出去。
146 ********************************************************************/
147 void D12ValidateBuffer(void)
148 {
149 1 outportb(D12COMMAND,D12_VALIDATE_BUFFER);
150 1 }
151 ////////////////////////End of function//////////////////////////////
152
153 /********************************************************************
154 函数功能:将数据写入端点缓冲区函数。
155 入口参数:Endp:端点号;Len:需要发送的长度;Buf:保存数据的缓冲区。
156 返 回:Len的值。
157 备 注:无。
158 ********************************************************************/
159 uint8 D12WriteEndpointBuffer(uint8 Endp,uint8 Len,uint8 * Buf)
160 {
161 1 uint8 i;
162 1 D12SelectEndpoint(Endp); //选择端点
163 1 outportb(D12COMMAND,D12_WRITE_BUFFER); //写Write Buffer命令
164 1 outportb(D12DATA, 0x00); //该字节必须写0
165 1 outportb(D12DATA, Len); //写需要发送数据的长度
166 1
167 1 #ifdef DEBUG1 //如果定义了DEBUG1,则需要显示调试信息
168 1 Prints("写端点");
169 1 PrintLongInt(Endp/2); //端点号。由于D12特殊的端点组织形式,
170 1 //这里的0和1分别表示端点0的输出和输入;
171 1 //而2、3分别表示端点1的输出和输入;
172 1 //3、4分别表示端点2的输出和输入。
173 1 //因此要除以2才显示对应的端点。
174 1 Prints("缓冲区");
175 1 PrintLongInt(Len); //写入的字节数
176 1 Prints("字节。\r\n");
177 1 #endif
178 1 D12SetPortOut(); //将数据口设置为输出状态(注意这里为空宏,移植时可能有用)
179 1 for(i=0;i<Len;i++)
C51 COMPILER V8.02 PDIUSBD12 06/17/2010 09:51:39 PAGE 4
180 1 {
181 2 outportb(D12DATA, *(Buf+i));
182 2 #ifdef DEBUG1
183 2 PrintHex(*(Buf+i)); //如果需要显示调试信息,则显示发送的数据
184 2 if(((i+1)%16)==0)Prints("\r\n"); //每16字节换行一次
185 2 #endif
186 2 }
187 1 #ifdef DEBUG1
188 1 if((Len%16)!=0)Prints("\r\n"); //换行
189 1 #endif
190 1 D12SetPortIn(); //数据口切换到输入状态
191 1 D12ValidateBuffer(); //使端点数据有效
192 1 return Len; //返回Len
193 1 }
194 ////////////////////////End of function//////////////////////////////
195
196 /********************************************************************
197 函数功能:设置地址函数。
198 入口参数:Addr:要设置的地址值。
199 返 回:无。
200 备 注:无。
201 ********************************************************************/
202 void D12SetAddress(uint8 Addr)
203 {
204 1 outportb(D12COMMAND, D12_SET_ADDRESS_ENABLE);//写设置地址命令
205 1 outportb(D12DATA, 0x80|Addr);//写一字节数据:使能及地址
206 1 }
207 ////////////////////////End of function//////////////////////////////
208
209 /********************************************************************
210 函数功能:使能端点函数。
211 入口参数:Enable: 是否使能。0值为不使能,非0值为使能。
212 返 回:无。
213 备 注:无。
214 ********************************************************************/
215 void D12SetEndpointEnable(uint8 Enable)
216 {
217 1 outportb(D12COMMAND, D12_SET_ENDPOINT_ENABLE);
218 1 if(Enable!=0)
219 1 {
220 2 outportb(D12DATA, 0x01); //D0为1使能端点
221 2 }
222 1 else
223 1 {
224 2 outportb(D12DATA,0x00);//不使能端点
225 2 }
226 1 }
227 ////////////////////////End of function//////////////////////////////
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 490 ----
CONSTANT SIZE = 33 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = ---- 12
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 + -