📄 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 + -