?? pdiusbd12.c
字號:
/******************************************************************
本程序只供學習使用,未經(jīng)作者許可,不得用于其它任何用途
歡迎訪問我的USB專區(qū):http://group.ednchina.com/93/
歡迎訪問我的blog: http://www.ednchina.com/blog/computer00
http://computer00.21ic.org
感謝PCB贊助商——電子園: http://bbs.cepark.com/
PDIUSBD12.C file
作者:電腦圈圈
建立日期: 2008.06.27
修改日期: 2008.07.10
版本:V1.1
版權(quán)所有,盜版必究。
Copyright(C) 電腦圈圈 2008-2018
All rights reserved
*******************************************************************/
#include <AT89x52.H>
#include "MyType.h"
#include "PDIUSBD12.H"
#include "config.h"
#include "UART.h"
/********************************************************************
函數(shù)功能:D12寫命令。
入口參數(shù):Command:一字節(jié)命令。
返 回:無。
備 注:無。
********************************************************************/
void D12WriteCommand(uint8 Command)
{
D12SetCommandAddr(); //設置為命令地址
D12ClrWr(); //WR置低
D12SetPortOut(); //將數(shù)據(jù)口設置為輸出狀態(tài)(注意這里為空宏,移植時可能有用)
D12SetData(Command); //輸出命令到數(shù)據(jù)口上
D12SetWr(); //WR置高
D12SetPortIn(); //將數(shù)據(jù)口設置為輸入狀態(tài),以備后面輸入使用
}
////////////////////////End of function//////////////////////////////
/********************************************************************
函數(shù)功能:讀一字節(jié)D12數(shù)據(jù)。
入口參數(shù):無。
返 回:讀回的一字節(jié)。
備 注:無。
********************************************************************/
uint8 D12ReadByte(void)
{
uint8 temp;
D12SetDataAddr(); //設置為數(shù)據(jù)地址
D12ClrRd(); //RD置低
temp=D12GetData(); //讀回數(shù)據(jù)
D12SetRd(); //RD置高
return temp; //返回讀到數(shù)據(jù)
}
////////////////////////End of function//////////////////////////////
/********************************************************************
函數(shù)功能:讀D12的ID。
入口參數(shù):無。
返 回:D12的ID。
備 注:無。
********************************************************************/
uint16 D12ReadID(void)
{
uint16 id;
D12WriteCommand(Read_ID); //寫讀ID命令
id=D12ReadByte(); //讀回ID號低字節(jié)
id|=((uint16)D12ReadByte())<<8; //讀回ID號高字節(jié)
return id;
}
////////////////////////End of function//////////////////////////////
/********************************************************************
函數(shù)功能:寫一字節(jié)D12數(shù)據(jù)。
入口參數(shù):Value:要寫的一字節(jié)數(shù)據(jù)。
返 回:無。
備 注:無。
********************************************************************/
void D12WriteByte(uint8 Value)
{
D12SetDataAddr(); //設置為數(shù)據(jù)地址
D12ClrWr(); //WR置低
D12SetPortOut(); //將數(shù)據(jù)口設置為輸出狀態(tài)(注意這里為空宏,移植時可能有用)
D12SetData(Value); //寫出數(shù)據(jù)
D12SetWr(); //WR置高
D12SetPortIn(); //將數(shù)據(jù)口設置為輸入狀態(tài),以備后面輸入使用
}
////////////////////////End of function//////////////////////////////
/********************************************************************
函數(shù)功能:讀取D12最后傳輸狀態(tài)寄存器的函數(shù)。
入口參數(shù):Endp:端點號。
返 回:端點的最后傳輸狀態(tài)。
備 注:該操作將清除該端點的中斷標志位。
********************************************************************/
uint8 D12ReadEndpointLastStatus(uint8 Endp)
{
D12WriteCommand(0x40+Endp); //讀取端點最后狀態(tài)的命令
return D12ReadByte();
}
////////////////////////End of function//////////////////////////////
/********************************************************************
函數(shù)功能:選擇端點的函數(shù),選擇一個端點后才能對它進行數(shù)據(jù)操作。
入口參數(shù):Endp:端點號。
返 回:無。
備 注:無。
********************************************************************/
void D12SelectEndpoint(uint8 Endp)
{
D12WriteCommand(0x00+Endp); //選擇端點的命令
}
////////////////////////End of function//////////////////////////////
/********************************************************************
函數(shù)功能:清除接收端點緩沖區(qū)的函數(shù)。
入口參數(shù):無。
返 回:無。
備 注:只有使用該函數(shù)清除端點緩沖后,該接收端點才能接收新的數(shù)據(jù)包。
********************************************************************/
void D12ClearBuffer(void)
{
D12WriteCommand(D12_CLEAR_BUFFER);
}
////////////////////////End of function//////////////////////////////
/********************************************************************
函數(shù)功能:應答建立包的函數(shù)。
入口參數(shù):無。
返 回:無。
備 注:無。
********************************************************************/
void D12AcknowledgeSetup(void)
{
D12SelectEndpoint(1); //選擇端點0輸入
D12WriteCommand(D12_ACKNOWLEDGE_SETUP); //發(fā)送應答設置到端點0輸入
D12SelectEndpoint(0); //選擇端點0輸出
D12WriteCommand(D12_ACKNOWLEDGE_SETUP); //發(fā)送應答設置到端點0輸出
}
////////////////////////End of function//////////////////////////////
/********************************************************************
函數(shù)功能:讀取端點緩沖區(qū)函數(shù)。
入口參數(shù):Endp:端點號;Len:需要讀取的長度;Buf:保存數(shù)據(jù)的緩沖區(qū)。
返 回:實際讀到的數(shù)據(jù)長度。
備 注:無。
********************************************************************/
uint8 D12ReadEndpointBuffer(uint8 Endp, uint8 Len, uint8 *Buf)
{
uint8 i,j;
D12SelectEndpoint(Endp); //選擇要操作的端點緩沖
D12WriteCommand(D12_READ_BUFFER); //發(fā)送讀緩沖區(qū)的命令
D12ReadByte(); //該字節(jié)數(shù)據(jù)是保留的,不用。
j=D12ReadByte(); //這里才是實際的接收到的數(shù)據(jù)長度
if(j>Len) //如果要讀的字節(jié)數(shù)比實際接收到的數(shù)據(jù)長
{
j=Len; //則只讀指定的長度數(shù)據(jù)
}
#ifdef DEBUG1 //如果定義了DEBUG1,則需要顯示調(diào)試信息
Prints("讀端點");
PrintLongInt(Endp/2); //端點號。由于D12特殊的端點組織形式,
//這里的0和1分別表示端點0的輸出和輸入;
//而2、3分別表示端點1的輸出和輸入;
//3、4分別表示端點2的輸出和輸入。
//因此要除以2才顯示對應的端點。
Prints("緩沖區(qū)");
PrintLongInt(j); //實際讀取的字節(jié)數(shù)
Prints("字節(jié)。\r\n");
#endif
for(i=0;i<j;i++)
{
//這里不直接調(diào)用讀一字節(jié)的函數(shù),而直接在這里模擬時序,可以節(jié)省時間
D12ClrRd(); //RD置低
*(Buf+i)=D12GetData(); //讀一字節(jié)數(shù)據(jù)
D12SetRd(); //RD置高
#ifdef DEBUG1
PrintHex(*(Buf+i)); //如果需要顯示調(diào)試信息,則顯示讀到的數(shù)據(jù)
if(((i+1)%16)==0)Prints("\r\n"); //每16字節(jié)換行一次
#endif
}
#ifdef DEBUG1
if((j%16)!=0)Prints("\r\n"); //換行。
#endif
return j; //返回實際讀取的字節(jié)數(shù)。
}
////////////////////////End of function//////////////////////////////
/********************************************************************
函數(shù)功能:使能發(fā)送端點緩沖區(qū)數(shù)據(jù)有效的函數(shù)。
入口參數(shù):無。
返 回:無。
備 注:只有使用該函數(shù)使能發(fā)送端點數(shù)據(jù)有效之后,數(shù)據(jù)才能發(fā)送出去。
********************************************************************/
void D12ValidateBuffer(void)
{
D12WriteCommand(D12_VALIDATE_BUFFER);
}
////////////////////////End of function//////////////////////////////
/********************************************************************
函數(shù)功能:將數(shù)據(jù)寫入端點緩沖區(qū)函數(shù)。
入口參數(shù):Endp:端點號;Len:需要發(fā)送的長度;Buf:保存數(shù)據(jù)的緩沖區(qū)。
返 回:Len的值。
備 注:無。
********************************************************************/
uint8 D12WriteEndpointBuffer(uint8 Endp,uint8 Len,uint8 * Buf)
{
uint8 i;
D12SelectEndpoint(Endp); //選擇端點
D12WriteCommand(D12_WRITE_BUFFER); //寫Write Buffer命令
D12WriteByte(0); //該字節(jié)必須寫0
D12WriteByte(Len); //寫需要發(fā)送數(shù)據(jù)的長度
#ifdef DEBUG1 //如果定義了DEBUG1,則需要顯示調(diào)試信息
Prints("寫端點");
PrintLongInt(Endp/2); //端點號。由于D12特殊的端點組織形式,
//這里的0和1分別表示端點0的輸出和輸入;
//而2、3分別表示端點1的輸出和輸入;
//3、4分別表示端點2的輸出和輸入。
//因此要除以2才顯示對應的端點。
Prints("緩沖區(qū)");
PrintLongInt(Len); //寫入的字節(jié)數(shù)
Prints("字節(jié)。\r\n");
#endif
D12SetPortOut(); //將數(shù)據(jù)口設置為輸出狀態(tài)(注意這里為空宏,移植時可能有用)
for(i=0;i<Len;i++)
{
//這里不直接調(diào)用寫一字節(jié)的函數(shù),而直接在這里模擬時序,可以節(jié)省時間
D12ClrWr(); //WR置低
D12SetData(*(Buf+i)); //將數(shù)據(jù)放到數(shù)據(jù)線上
D12SetWr(); //WR置高,完成一字節(jié)寫
#ifdef DEBUG1
PrintHex(*(Buf+i)); //如果需要顯示調(diào)試信息,則顯示發(fā)送的數(shù)據(jù)
if(((i+1)%16)==0)Prints("\r\n"); //每16字節(jié)換行一次
#endif
}
#ifdef DEBUG1
if((Len%16)!=0)Prints("\r\n"); //換行
#endif
D12SetPortIn(); //數(shù)據(jù)口切換到輸入狀態(tài)
D12ValidateBuffer(); //使端點數(shù)據(jù)有效
return Len; //返回Len
}
////////////////////////End of function//////////////////////////////
/********************************************************************
函數(shù)功能:設置地址函數(shù)。
入口參數(shù):Addr:要設置的地址值。
返 回:無。
備 注:無。
********************************************************************/
void D12SetAddress(uint8 Addr)
{
D12WriteCommand(D12_SET_ADDRESS_ENABLE); //寫設置地址命令
D12WriteByte(0x80 | Addr); //寫一字節(jié)數(shù)據(jù):使能及地址
}
////////////////////////End of function//////////////////////////////
/********************************************************************
函數(shù)功能:使能端點函數(shù)。
入口參數(shù):Enable: 是否使能。0值為不使能,非0值為使能。
返 回:無。
備 注:無。
********************************************************************/
void D12SetEndpointEnable(uint8 Enable)
{
D12WriteCommand(D12_SET_ENDPOINT_ENABLE);
if(Enable!=0)
{
D12WriteByte(0x01); //D0為1使能端點
}
else
{
D12WriteByte(0x00); //不使能端點
}
}
////////////////////////End of function//////////////////////////////
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -