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

📄 d12ci.c

📁 移植了可运行于arm lpc2294下的uc/os2
💻 C
字号:
/**********************************************************************************************************
** 文   件   名: D12CI.c
** 描        述: USB驱动程序软件包: PDIUSBD12 设备端驱动程序 接口控制驱动层
**********************************************************************************************************/

#include "D12Config.h"
#include "D12HAL.h"
#include "d12ci.h"

/************************************************************
** 函数名称: INT16U readchipid(void)
** 功能描述: 读取芯片ID
** 输   入: 无
** 输   出: 芯片的ID号
************************************************************/
INT16U readchipid(void)
{
	INT8U i;
	INT16U chipid;
	
	outportc(0xFD);				//发送读PDIUSBD12芯片ID号命令			
	i = inportd();				//读取ID号低字节
	chipid = inportd();			//读取ID号高位字节
	chipid = chipid * 256 + i;	//组成16位的PDIUSBD12芯片ID号
	
	return chipid;
}

	/*****************************************
		与CPU 无关, 与 USB相关的函数
	*****************************************/


/************************************************************
** 函数名称: void D12_SetAddressEnable(INT8U bAddress,INT8U bEnable)
** 功能描述: 设置地址/使能
** 输   入: INT8U bAddress:  地址
	     	 INT8U bEnable :  0 --- 禁止
	     		     		  1 --- 使能
** 输   出: 无
************************************************************/
void D12_SetAddressEnable(INT8U bAddress, INT8U bEnable)
{
	outportc(0xD0);				//输出设置地址/使能指令
	if(bEnable)
		bAddress |= 0x80;		//bit7置1,使能
	outportd(bAddress);			//输出设置值
}


/************************************************************
** 函数名称: void D12_SetEndpointEnable(INT8U bEnable)
** 功能描述: 设置端点使能
** 输   入: INT8U bEnable :  0 --- 禁止
	     		     		  1 --- 允许
** 输   出: 无
************************************************************/
void D12_SetEndpointEnable(INT8U bEnable)
{
	outportc(0xD8);				//输出设置端点使能指令
	if(bEnable)
		outportd(0x01);			//设置端点允许
	else
		outportd(0x00);			//设置端点禁止
}

/************************************************************
** 函数名称: void D12_SetMode(INT8U bConfig,INT8U bClkDiv)
** 功能描述: 模式设置
** 输   入: INT8U bConfig:  配置字节信息
	     	 INT8U bClkDiv:  分频系数
** 输   出: 无
************************************************************/
void D12_SetMode(INT8U bConfig,INT8U bClkDiv)
{
	outportc(0xF3);				//输出设置模式指令
	outportd(bConfig);			//输出配置字节信息
	outportd(bClkDiv);			//输出时钟分频因数字节
}

/************************************************************
** 函数名称: void D12_SetDMA(INT8U bMode)
** 功能描述: 设置DMA工作方式设置
** 输   入: INT8U bMode: 	设置值
** 输   出: 无
************************************************************/
void D12_SetDMA(INT8U bMode)
{
	outportc(0xFB);				//设置DMA工作方命令
	outportd(bMode);			//输出设置值
}

/************************************************************
** 函数名称: INT16U D12_ReadInterruptRegister(void)
** 功能描述: 读取中断寄存器值
** 输   入: 无
** 输   出: 中断寄存器值
************************************************************/
INT16U D12_ReadInterruptRegister(void)
{
	INT8U b1;
	INT16U j;

	outportc(0xF4);				//读取中断寄存器命令
	b1 = inportd();				//读取低8位字节
	j = inportd();				//读取高8位字节

	j = j * 256;			
	j += b1;					//组合为16位

	return j;
}

/************************************************************
** 函数名称: INT8U D12_SelectEndpoint(INT8U bEndp)
** 功能描述: 端点选择,将内部指针初始化到选择的缓冲区起始位置
** 输   入: INT8U bEndp:   端点索引号,取值0 ~ 5
** 输   出: 读出的字节
************************************************************/
INT8U D12_SelectEndpoint(INT8U bEndp)
{
	INT8U c;

	outportc(bEndp);			//端点选择
	c = inportd();				//读出一个字节

	return c;
}

/************************************************************
** 函数名称: INT8U D12_ReadEndpointStatus(INT8U bEndp)
** 功能描述: 读取端点状态
** 输   入: INT8U bEndp:   端点索引号,取值0 ~ 5
** 输   出: 端点状态
************************************************************/
INT8U D12_ReadEndpointStatus(INT8U bEndp)
{
	INT8U c;

	outportc(0x80 + bEndp);		//读取端点状态命令
	c = inportd();				//读取端点状态
	return c;
}

/************************************************************
** 函数名称: INT8U D12_ReadLastTransactionStatus(INT8U bEndp)
** 功能描述: 读取最后处理状态寄存器?
** 输   入: INT8U bEndp:   端点索引号,取值0 ~ 5
** 输   出: 端点最后处理的状态
************************************************************/
INT8U D12_ReadLastTransactionStatus(INT8U bEndp)
{
	outportc(0x40 + bEndp);		//输出读取最后处理状态寄存器?
	return inportd();			//读取状态
}


/************************************************************
** 函数名称: INT8U D12_ReadEndpointStatus(INT8U bEndp)
** 功能描述: 设置端点状态
** 输   入: INT8U bEndp:   端点索引号,取值0 ~ 5
	         INT8U bStalled: 状态值
** 输   出: 端点状态
************************************************************/
void D12_SetEndpointStatus(INT8U bEndp,INT8U bStalled)
{
	outportc(0x40 + bEndp);		//发送设置端点状态命令
	outportd(bStalled);			//设置端点状态
}


/************************************************************
** 函数名称: void D12_SendResume(void)
** 功能描述: 传输恢复
** 输   入: 无
** 输   出: 无
************************************************************/
void D12_SendResume(void)
{
	outportc(0xF6);				//设置发送恢复
}

/************************************************************
** 函数名称: INT16U D12_ReadCurrentFrameNumber(void)
** 功能描述: 读取当前帧号
** 输   入: 无
** 输   出: 当前帧号
************************************************************/
INT16U D12_ReadCurrentFrameNumber(void)
{
	INT16U i,j;

	outportc(0xF5);				//发送读取当前帧数目命令
	i= inportd();				//读取帧数目的低8位
	j = inportd();				//读取帧数目的高8位

	i += (j * 256);				

	return i;					//返目当前帧数目
}


/************************************************************
** 函数名称: INT8U D12_ReadEndpoint(INT8U endp,INT8U len,INT8U * buf)
** 功能描述: 读取端点数据
** 输   入: INT8U endp:     端点索引号,取值 0 ~ 5 
	    	 INT8U len:	     要读取的数据长度
	     	 INT8U * buf:    接收数据指针
** 输   出: 实际读得的字节数
************************************************************/
INT8U D12_ReadEndpoint(INT8U endp, INT8U len, INT8U * buf)
{
	INT8U i, j;

	outportc(endp);						//发送选择端点命令
	if((inportd() & 0x01) == 0) {		//如果缓冲区为空
		return 0;						//则返回读到0字节
	}

	outportc(0xF0);						//发送读缓冲区命令
	j = inportd();						//读取保留字节
	j = inportd();						//读取数据字节的数目/长度

	if(j > len)
		j = len;						//如果大于要求读的字节数目
										//则只读取要求的字节长度
	for(i=0; i<j; i++)		
		*(buf+i) = inportd();			//读取要求的字节数目/长度

	outportc(0xF2);						//清缓冲区,新的信息包才可以重新被接受
	return j;							//返回读到的字节数
}

/************************************************************
** 函数名称: INT8U D12_WriteEndpoint(INT8U endp,INT8U len,INT8U * buf)
** 功能描述: 把数据写入端点
** 输   入: INT8U endp:     端点索引号,取值 0 ~ 5 
	     	 INT8U len:	     要写入的数据长度
	     	 INT8U * buf:    发送数据指针
** 输   出: 实际写入的字节数
************************************************************/
INT8U D12_WriteEndpoint(INT8U endp, INT8U len, INT8U * buf)
{
	INT8U i;

	outportc(endp);					//发送选择端点命令
	i = inportd();					//可选地读取一个字节

	outportc(0xF0);					//发送写缓冲区命令
	outportd(0x00);					//写入一个保留字节
	outportd(len);					//写入即将写入的字节数目

	for(i=0; i<len; i++)			
		outportd(*(buf+i));			//写入指定的字节

	outportc(0xFA);					//使缓冲区有效

	return len;						//返回写入的字节数
}


/************************************************************
** 函数名称: void D12_AcknowledgeEndpoint(INT8U endp)
** 功能描述: 应答Setup
** 输   入: INT8U endp:     端点索引号,取值 0 ~ 5 
** 输   出: 无
************************************************************/
void D12_AcknowledgeEndpoint(INT8U endp)
{
	outportc(endp);					//选择端点
	outportc(0xF1);					//应答Setup指令
	if(endp == 0)
		outportc(0xF2);				//清空该端点缓冲区
}

/************************************************************
** 函数名称: void D12_ClearBuff(INT8U endp)
** 功能描述: 清指定端点的缓冲区(包括双缓冲区)?
** 输   入: INT8U endp:     端点索引号,取值 0 ~ 5 
** 输   出: 无
************************************************************/
void D12_ClearBuff(INT8U endp)
{	
	outportc(endp);			//选择缓冲区
	outportc(0xF2);			//清空第1个缓冲区
	
	if (endp >= 4){
		outportc(endp);		//选择第2个缓冲区
		outportc(0xF2);		//清空第2个缓冲区
	}
}


/************************************************************
** 函数名称: void disconnect_USB(void) 
** 功能描述: 断开USB总线
************************************************************/
void disconnect_USB(void)
{
	// Initialize D12 configuration
	D12_SetMode(D12_NOLAZYCLOCK, D12_SETTOONE | D12_CLOCK_12M);
}//SoftConnect 断开

/************************************************************
** 函数名称: void connect_USB(void)
** 功能描述: 连接USB总线
************************************************************/
void connect_USB(void)
{
	// Initialize D12 configuration
	D12_SetMode(D12_NOLAZYCLOCK|D12_SOFTCONNECT, D12_SETTOONE | D12_CLOCK_12M);
}//SoftConnect 连接上,并设置为无LazyClock,模式为非同步模式

/************************************************************
** 函数名称: void reconnect_USB(void)
** 功能描述: 重新连接USB总线
************************************************************/
void reconnect_USB(void)
{
	INT32U clk_cnt;

	disconnect_USB();				//断开芯片与USB总线连接
    for (clk_cnt = 0;clk_cnt<= 0x6FFFF;clk_cnt++); //延时处理
    connect_USB();					//连接到USB总线
}

⌨️ 快捷键说明

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