⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 usb2.c

📁 基于armjx44bo下的USB接口的程序.对应的实验平台是jx44b0x
💻 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 + -