📄 pdiusbd12.lst
字号:
145
146 /********************************************************************
147 函数功能:读取端点缓冲区函数。
148 入口参数:Endp:端点号;Len:需要读取的长度;Buf:保存数据的缓冲区。
149 返 回:实际读到的数据长度。
150 备 注:无。
151 ********************************************************************/
152 uint8 D12ReadEndpointBuffer(uint8 Endp, uint8 Len, uint8 *Buf)
153 {
154 1 uint8 i,j;
155 1 D12SelectEndpoint(Endp); //选择要操作的端点缓冲
156 1 D12WriteCommand(D12_READ_BUFFER); //发送读缓冲区的命令
157 1 D12ReadByte(); //该字节数据是保留的,不用。
158 1 j=D12ReadByte(); //这里才是实际的接收到的数据长度
159 1 if(j>Len) //如果要读的字节数比实际接收到的数据长
160 1 {
161 2 j=Len; //则只读指定的长度数据
162 2 }
163 1 #ifdef DEBUG1 //如果定义了DEBUG1,则需要显示调试信息
164 1 Prints("读端点");
165 1 PrintLongInt(Endp/2); //端点号。由于D12特殊的端点组织形式,
166 1 //这里的0和1分别表示端点0的输出和输入;
167 1 //而2、3分别表示端点1的输出和输入;
168 1 //3、4分别表示端点2的输出和输入。
169 1 //因此要除以2才显示对应的端点。
170 1 Prints("缓冲区");
171 1 PrintLongInt(j); //实际读取的字节数
172 1 Prints("字节。\r\n");
173 1 #endif
174 1 for(i=0;i<j;i++)
175 1 {
176 2 //这里不直接调用读一字节的函数,而直接在这里模拟时序,可以节省时间
177 2 D12ClrRd(); //RD置低
178 2 *(Buf+i)=D12GetData(); //读一字节数据
179 2 D12SetRd(); //RD置高
C51 COMPILER V7.06 PDIUSBD12 11/16/2008 15:59:36 PAGE 4
180 2 #ifdef DEBUG1
181 2 PrintHex(*(Buf+i)); //如果需要显示调试信息,则显示读到的数据
182 2 if(((i+1)%16)==0)Prints("\r\n"); //每16字节换行一次
183 2 #endif
184 2 }
185 1 #ifdef DEBUG1
186 1 if((j%16)!=0)Prints("\r\n"); //换行。
187 1 #endif
188 1 return j; //返回实际读取的字节数。
189 1 }
190 ////////////////////////End of function//////////////////////////////
191
192 /********************************************************************
193 函数功能:使能发送端点缓冲区数据有效的函数。
194 入口参数:无。
195 返 回:无。
196 备 注:只有使用该函数使能发送端点数据有效之后,数据才能发送出去。
197 ********************************************************************/
198 void D12ValidateBuffer(void)
199 {
200 1 D12WriteCommand(D12_VALIDATE_BUFFER);
201 1 }
202 ////////////////////////End of function//////////////////////////////
203
204 /********************************************************************
205 函数功能:将数据写入端点缓冲区函数。
206 入口参数:Endp:端点号;Len:需要发送的长度;Buf:保存数据的缓冲区。
207 返 回:Len的值。
208 备 注:无。
209 ********************************************************************/
210 uint8 D12WriteEndpointBuffer(uint8 Endp,uint8 Len,uint8 * Buf)
211 {
212 1 uint8 i;
213 1 D12SelectEndpoint(Endp); //选择端点
214 1 D12WriteCommand(D12_WRITE_BUFFER); //写Write Buffer命令
215 1 D12WriteByte(0); //该字节必须写0
216 1 D12WriteByte(Len); //写需要发送数据的长度
217 1
218 1 #ifdef DEBUG1 //如果定义了DEBUG1,则需要显示调试信息
219 1 Prints("写端点");
220 1 PrintLongInt(Endp/2); //端点号。由于D12特殊的端点组织形式,
221 1 //这里的0和1分别表示端点0的输出和输入;
222 1 //而2、3分别表示端点1的输出和输入;
223 1 //3、4分别表示端点2的输出和输入。
224 1 //因此要除以2才显示对应的端点。
225 1 Prints("缓冲区");
226 1 PrintLongInt(Len); //写入的字节数
227 1 Prints("字节。\r\n");
228 1 #endif
229 1 D12SetPortOut(); //将数据口设置为输出状态(注意这里为空宏,移植时可能有用)
230 1 for(i=0;i<Len;i++)
231 1 {
232 2 //这里不直接调用写一字节的函数,而直接在这里模拟时序,可以节省时间
233 2 D12ClrWr(); //WR置低
234 2 D12SetData(*(Buf+i)); //将数据放到数据线上
235 2 D12SetWr(); //WR置高,完成一字节写
236 2 #ifdef DEBUG1
237 2 PrintHex(*(Buf+i)); //如果需要显示调试信息,则显示发送的数据
238 2 if(((i+1)%16)==0)Prints("\r\n"); //每16字节换行一次
239 2 #endif
240 2 }
241 1 #ifdef DEBUG1
C51 COMPILER V7.06 PDIUSBD12 11/16/2008 15:59:36 PAGE 5
242 1 if((Len%16)!=0)Prints("\r\n"); //换行
243 1 #endif
244 1 D12SetPortIn(); //数据口切换到输入状态
245 1 D12ValidateBuffer(); //使端点数据有效
246 1 return Len; //返回Len
247 1 }
248 ////////////////////////End of function//////////////////////////////
249
250 /********************************************************************
251 函数功能:设置地址函数。
252 入口参数:Addr:要设置的地址值。
253 返 回:无。
254 备 注:无。
255 ********************************************************************/
256 void D12SetAddress(uint8 Addr)
257 {
258 1 D12WriteCommand(D12_SET_ADDRESS_ENABLE); //写设置地址命令
259 1 D12WriteByte(0x80 | Addr); //写一字节数据:使能及地址
260 1 }
261 ////////////////////////End of function//////////////////////////////
262
263 /********************************************************************
264 函数功能:使能端点函数。
265 入口参数:Enable: 是否使能。0值为不使能,非0值为使能。
266 返 回:无。
267 备 注:无。
268 ********************************************************************/
269 void D12SetEndpointEnable(uint8 Enable)
270 {
271 1 D12WriteCommand(D12_SET_ENDPOINT_ENABLE);
272 1 if(Enable!=0)
273 1 {
274 2 D12WriteByte(0x01); //D0为1使能端点
275 2 }
276 1 else
277 1 {
278 2 D12WriteByte(0x00); //不使能端点
279 2 }
280 1 }
281 ////////////////////////End of function//////////////////////////////
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 445 ----
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 + -