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

📄 usbd12.c

📁 开发环境ADS 通过编写一段程序使PC机与实验箱的从USB相连接。连接的时候
💻 C
字号:
/************************************************************************
 *File	: Usbd12.c														*
 *By 	: hugang, hgx2000@mail.china.com								*
 ************************************************************************/ 

#include "armusb.h"
#include "..\inc\44b.h"

extern ARMUSBFLAGS bUSBFlags;

/************************************************************************************************
 *设置地址使能命令																				*
 *命令代码: D0																					*
 *处理:写一个字节																				*
 ************************************************************************************************/
void UsbSetAddressEnable(unsigned char bAddress, unsigned char bEnable)
{
	if(bUSBFlags.bits.bIn_ISR == 0) USB_DISABLE_INTERRUPT;
	
	outportb(D12_COMMAND, 0xD0);								
	
	if(bEnable) bAddress |= 0x80;								
	
	outportb(D12_DATA, bAddress);						
	
	if(bUSBFlags.bits.bIn_ISR == 0) USB_ENABLE_INTERRUPT;
}

/************************************************************************************************
 *设置端点使能命令																				*
 *命令代码: D8																					*
 *处理: 写一个字节																				*
 ************************************************************************************************/
void UsbSetEndpointEnable(unsigned char bEnable)
{
	if(bUSBFlags.bits.bIn_ISR == 0) USB_DISABLE_INTERRUPT;
	
	outportb(D12_COMMAND, 0xD8);								
	
	if(bEnable) outportb(D12_DATA, 1);							
	else outportb(D12_DATA, 0);
	
	if(bUSBFlags.bits.bIn_ISR == 0) USB_ENABLE_INTERRUPT;						
}

/************************************************************************************************
 *设置模式命令																					*
 *命令代码: F3																					*
 *处理: 写两个字节	1.模式字节  2.时钟分频系数字节												*
 ************************************************************************************************/
void UsbSetMode(unsigned char bConfig, unsigned char bClkDiv)
{
	if(bUSBFlags.bits.bIn_ISR == 0) USB_DISABLE_INTERRUPT;
	
	outportb(D12_COMMAND, 0xF3);								
	outportb(D12_DATA, bConfig);								
	outportb(D12_DATA, bClkDiv);								
	
	if(bUSBFlags.bits.bIn_ISR == 0) USB_ENABLE_INTERRUPT;
}

/************************************************************************************************
 *设置DMA命令																					*
 *命令代码: F8																					*
 *处理:写一个字节																				*
 ************************************************************************************************/
void UsbSetDMA(unsigned char bMode)
{
	if(bUSBFlags.bits.bIn_ISR == 0) USB_DISABLE_INTERRUPT;
	
	outportb(D12_COMMAND, 0xFB);								
	outportb(D12_DATA, bMode);									
	
	if(bUSBFlags.bits.bIn_ISR == 0) USB_ENABLE_INTERRUPT;
}

/************************************************************************************************
 *读取中断寄存器命令																			*
 *命令代码: F4																					*
 *处理: 读两个字节																				*
 ************************************************************************************************/
unsigned short UsbReadInterruptRegister(void)
{
	volatile unsigned char b1;
	volatile unsigned int j;
	
	outportb(D12_COMMAND, 0xF4);								
	b1 = inportb(D12_DATA);									
	j = inportb(D12_DATA);									
	j <<= 8;
	j += b1;
	return j;
	
}

/************************************************************************************************
 *选择端点命令																					*
 *命令代码: 00 + bEndp																			*
 *处理: 写一个字节																				*
 ************************************************************************************************/
unsigned char UsbSelectEndpoint(unsigned char bEndp)
{
	volatile unsigned char c;
	
	if(bUSBFlags.bits.bIn_ISR == 0) USB_DISABLE_INTERRUPT;
	
	outportb(D12_COMMAND, bEndp);
	c = inportb(D12_DATA);										
	
	if(bUSBFlags.bits.bIn_ISR == 0) USB_ENABLE_INTERRUPT;
	
	return c;
}

/************************************************************************************************
 *读取端点最后处理状态																			*
 *命令代码: 40 + bEndp																			*
 *处理: 读一个字节																				*
 ************************************************************************************************/
unsigned char UsbReadLastTransactionStatus(unsigned char bEndp)
{
	outportb(D12_COMMAND, 0x40 + bEndp);					
	
	return inportb(D12_DATA);
}

/************************************************************************************************
 *读取端点状态																					*
 *命令代码: 80 + bEndp																			*
 *处理: 读一个字节																				*
 ************************************************************************************************/
unsigned char UsbReadEndpointStatus(unsigned char bEndp)
{
	volatile unsigned char c;
	
	if(bUSBFlags.bits.bIn_ISR == 0) USB_DISABLE_INTERRUPT;
	
	outportb(D12_COMMAND, 0x80 + bEndp);					
	c = inportb(D12_DATA);
	
	if(bUSBFlags.bits.bIn_ISR == 0) USB_ENABLE_INTERRUPT;
	
	return c;
}

/************************************************************************************************
 *设置端点状态																					*
 *命令代码: 40 + bEndp																			*
 *处理: 写一个字节																				*
 ************************************************************************************************/
void UsbSetEndpointStatus(unsigned char bEndp, unsigned char bStalled)
{
	if(bUSBFlags.bits.bIn_ISR == 0) USB_DISABLE_INTERRUPT;
	
	outportb(D12_COMMAND, 0x40 + bEndp);
	outportb(D12_DATA, bStalled);
	
	if(bUSBFlags.bits.bIn_ISR == 0) USB_ENABLE_INTERRUPT;
}

/************************************************************************************************
 *发送恢复命令																					*
 *命令代码: F6																					*
 *处理: 读两个字节																				*
 ************************************************************************************************/
void UsbSendResume(void)
{
	outportb(D12_COMMAND, 0xF6);
}


/************************************************************************************************
 *读取当前帧标志																				*
 *命令代码: F5																					*
 *处理: 读两个字节																				*
 ************************************************************************************************/
unsigned short UsbReadCurrentFrameNumber(void)
{
	volatile unsigned short i,j;
	
	if(bUSBFlags.bits.bIn_ISR == 0) USB_DISABLE_INTERRUPT;
	
	outportb(D12_COMMAND, 0xF5);
	i= inportb(D12_DATA);
	j = inportb(D12_DATA);
	i += (j<<8);
	
	if(bUSBFlags.bits.bIn_ISR == 0) USB_ENABLE_INTERRUPT;
	
	return i;
}

/************************************************************************************************
 *读取端点数据																					*
 *命令代码: F0																					*
 *处理: 读n字节,n<len,返回读取字节的长度														*
 ************************************************************************************************/
unsigned char UsbReadEndpoint(unsigned char endp, unsigned char * buf, unsigned char len)
{
	volatile unsigned char i, j;
	if(bUSBFlags.bits.bIn_ISR == 0) USB_DISABLE_INTERRUPT;
	
	outportb(D12_COMMAND, endp);						// 选择端点
	if((inportb(D12_DATA) & USB_D12_FULLEMPTY) == 0) {		// 判断端点缓冲区状态,若未满则返回
		if(bUSBFlags.bits.bIn_ISR == 0) USB_ENABLE_INTERRUPT;
		return 0;
	}
	
	outportb(D12_COMMAND, 0xF0);						// 读缓冲命令
	j = inportb(D12_DATA);
	j = inportb(D12_DATA);								// 获取字节长度
	
	if(j > len)	j = len;
	
	for(i=0; i<j; i++)
		*(buf+i) = inportb(D12_DATA);
		
	outportb(D12_COMMAND, 0xF2);						// 缓冲区清零
	
	if(bUSBFlags.bits.bIn_ISR == 0) USB_ENABLE_INTERRUPT;
	
	return j;
}

/************************************************************************************************
 *把数据写入端点																				*
 *命令代码: F0																					*
 *处理: 写n字节,n=len																			*
 ************************************************************************************************/
unsigned char UsbWriteEndpoint(unsigned char endp, unsigned char * buf, unsigned char len)
{
	volatile unsigned char i;

	if(bUSBFlags.bits.bIn_ISR == 0) USB_DISABLE_INTERRUPT;
	
	outportb(D12_COMMAND, endp);						// 选择端点	
	i = inportb(D12_DATA);									// 端点状态
	
	outportb(D12_COMMAND, 0xF0);						// 写缓冲区命令
	outportb(D12_DATA, 0);								// 向缓冲区填充数据
	outportb(D12_DATA, len);
	for(i=0; i<len; i++) outportb(D12_DATA, *(buf+i));
	
	outportb(D12_COMMAND, 0xFA);						// 使缓冲区有效
	
	if(bUSBFlags.bits.bIn_ISR == 0) USB_ENABLE_INTERRUPT;
	
	return len;
}

/************************************************************************************************
 *端点应当处理																					*
 *命令代码: F1																					*
 *处理: 																						*
 ************************************************************************************************/
void UsbAcknowledgeEndpoint(unsigned char endp)
{
	outportb(D12_COMMAND, endp);						// 选择端点
	outportb(D12_COMMAND, 0xF1);
	if(endp == 0) outportb(D12_COMMAND, 0xF2);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -