?? usb2.c
字號:
#include "usb_inc.h"
#include "usb_dbg.h"
#include "usb_d12_ci.h"
/* General I/O port for USB control */
#define USB_RUN (*((unsigned char*)0x8000000) = 0x00) //PORT_F.8 BIT SET
#define USB_DIS (*((unsigned char*)0x8000000) = 0xff) //PORT_F.8 BIT CLEAR
/* USB access control */
#define USB_DATA (*(volatile unsigned char *)(0x6000000))
#define USB_COMMAND (*(volatile unsigned char *)(0x6000001))
//初始化命令,地址和使能設置
void D12_SetAddressEnable(unsigned char bAddress, unsigned char bEnable)
{
USB_COMMAND = 0xD0;
if(bEnable)
bAddress |= 0x80;
USB_DATA = bAddress;
}
//初始化命令,端點使能設置
void D12_SetEndpointEnable(unsigned char bEnable)
{
USB_COMMAND = 0xD8;
if(bEnable)
USB_DATA = 1;
else
USB_DATA = 0;
}
//初始化命令,模式設置
void D12_SetMode(unsigned char bConfig, unsigned char bClkDiv)
{
USB_COMMAND = 0xF3;
USB_DATA = bConfig;//設置配置寄存器
USB_DATA = bClkDiv;//設置時鐘預除因子字節
}
//初始化命令,設置DMA
void D12_SetDMA(unsigned char bMode)
{
USB_COMMAND = 0xFB;
USB_DATA = bMode;
}
//數據流命令,讀兩字節的中斷寄存器
//返回值:中斷寄存器字節2 中斷寄存器字節1
unsigned short D12_ReadInterruptRegister(void)
{
unsigned char b1;
unsigned int j;
USB_COMMAND = 0xF4;
b1 = USB_DATA;//中斷寄存器字節1
j = USB_DATA;//中斷寄存器字節2
j <<= 8;
j += b1;
return j;
}
//數據流命令,選擇端點,返回1字節讀的數據
unsigned char D12_SelectEndpoint(unsigned char bEndp)
{
unsigned char c;
USB_COMMAND = bEndp;
c = USB_DATA;
return c;
}
//數據流命令,讀最后傳送的狀態,返回最后轉送的狀態
unsigned char D12_ReadLastTransactionStatus(unsigned char bEndp)
{
USB_COMMAND = 0x40 + bEndp;
return USB_DATA;
}
//數據流命令,讀端點狀態,返回讀出的字節
unsigned char D12_ReadEndpointStatus(unsigned char bEndp)
{
unsigned char c;
USB_COMMAND = 0x80 + bEndp;
c = USB_DATA;
return c;
}
//數據流命令,設置端點狀態
void D12_SetEndpointStatus(unsigned char bEndp, unsigned char bStalled)
{
USB_COMMAND = 0x40 + bEndp;
USB_DATA = bStalled;
}
//數據流命令,清除緩存區
void D12_ClearBuffer(void)
{
USB_COMMAND = 0xF2;
}
//通用命令,發送重啟
void D12_SendResume(void)
{
USB_COMMAND = 0xF6;
}
//通用命令,讀當前的幀數,返回幀數
unsigned short D12_ReadCurrentFrameNumber(void)
{
unsigned short i,j;
USB_COMMAND = 0xF5;
i= USB_DATA;
j = USB_DATA;
i += (j<<8);
return i;
}
//讀器件ID
unsigned short D12_ReadChipID(void)
{
unsigned short i,j;
USB_COMMAND = 0xFD;
i=USB_DATA;
j=USB_DATA;
i += (j<<8);
return i;
}
//數據流命令,讀端點數據len字節到buf中
unsigned char D12_ReadEndpoint(unsigned char endp, unsigned char * buf, unsigned char len)
{
unsigned char i, j;
USB_COMMAND = endp;
if((USB_DATA & D12_FULLEMPTY) == 0) {//BUFFER空
return 0;
}
//BUFFER滿,寫緩存區多個字節
USB_COMMAND = 0xF0;
j = USB_DATA;//保留,讀時為任意值
j = USB_DATA;//數據字節的長度
if(j > len)
j = len;
for(i=0; i<j; i++)
*(buf+i) = USB_DATA;
USB_COMMAND = 0xF2;//清除緩存區
return j;
}
// D12_ReadMainEndpoint() added by V2.2 to support double-buffering.
// Caller should assume maxium 128 bytes of returned data.
unsigned char D12_ReadMainEndpoint(unsigned char * buf)
{
unsigned char i, j, k = 0, bDblBuf = 1;
USB_COMMAND = 0x84;//讀主端點
if( (USB_DATA & 0x60) == 0x60)
bDblBuf = 2;
while(bDblBuf) {
USB_COMMAND = 4;
if((USB_DATA & D12_FULLEMPTY) == 0)
break;
USB_COMMAND = 0xF0;
j = USB_DATA;
j = USB_DATA;
for(i=0; i<j; i++)
*(buf+i+k) = USB_DATA;
k += j;
USB_COMMAND = 0xF2;
bDblBuf --;
}
return k;
}
// D12_WriteEndpoint() added by V2.2 to support double-buffering.
// Caller should assume maxium 128 bytes of returned data.
unsigned char D12_WriteEndpoint(unsigned char endp, unsigned char * buf, unsigned char len)
{
unsigned char i,null;
USB_DbgPrint(("D12_WriteEndpoint : %04x\n",len));
for( i = 0; i < len; i++)
{
USB_DbgPrint(("%02x ",*(buf+i)));
}
USB_DbgPrint(("\n"));
USB_COMMAND = endp;
null = USB_DATA;
USB_COMMAND = 0xF0;
USB_DATA = 0;
USB_DATA = len;
for(i=0; i<len; i++)
USB_DATA = *(buf+i);
USB_COMMAND = 0xFA;
return len;
}
//應答設置,endp=0時清除選擇的緩存區
void D12_AcknowledgeEndpoint(unsigned char endp)
{
USB_COMMAND = endp;
USB_COMMAND = 0xF1;
if(endp == 0)
USB_COMMAND = 0xF2;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -