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

📄 d12_ci.c

📁 利用sunplus16位单片机实现USB接口的全套技术资料
💻 C
字号:
// =========================================
// 文件名称:D12_CI.c
// 功能描述:PDIUSBD12命令层
// 维护记录:modified by liuxue v1.0 2007-03-15
// =========================================

#include "D12_Driver.h"

#define CMD		1
#define DAT		0

// =========================================
// 函数:void D12_SetAddressEnable(unsigned int bAddress, unsigned int bEnable)
// 描述:设置地址,使能
// 参数:bAddress:地址, bEnable:使能
// 返回:无
// =========================================
void D12_SetAddressEnable(unsigned int bAddress, unsigned int bEnable)
{
	D12_InitWrite();
	D12_Write(CMD, 0x00D0);
	if(bEnable)
		bAddress |= 0x80;
	D12_Write(DAT,bAddress);
}

// =========================================
// 函数:void void D12_SetEndpointEnable(unsigned int bEnable)
// 描述:设置端点使能
// 参数:置1表示普通/同步端点使能
// 返回:无
// =========================================
void D12_SetEndpointEnable(unsigned int bEnable)
{
	D12_InitWrite();
	D12_Write(CMD,0x00D8);
	if(bEnable)
		D12_Write(DAT,0x0001);
	else
		D12_Write(DAT,0x0000);
}

// =========================================
// 函数:void D12_SetMode(unsigned int bConfig, unsigned int bClkDiv)
// 描述:设置模式
// 参数:
// bConfig.bit0	保留
// bConfig.bit1	1表示CLKOUT在SUSPEND引脚变高之后不会切换到LazyClock;
//				0表示CLKOUT在SUSPEND引脚变高之后切换到LazyClock
// 				LazyClock频率是30(1+-40%)kHz,编程值将不会被总线复位所改变
// bConfig.bit2	时钟运行
//				1表示内部时钟和PLL即使在挂起状态下仍然运行;
//				0表示只要不需要时,内部时钟、晶振和PLL就停止运行。
//				为满足严格的挂起电流要求,该位需要设置为0。已编程值不会被总线复位所改变
// bConfig.bit3	中断模式
// 				1表示报告所有的错误和NAKing,并产生一个中断;
//				0表示只有OK被报告
//				已编程值不会被总线复位所改变
// bConfig.bit4	SoftConnect
//				1表示,如果VBUS可用,上行数据上拉电阻就被连接
//				0表示不连接
//				已编程值不会被总线复位所改变
// bConfig.bit5 保留,写为0
// bConfig.bit6\7	端点配置
//					模式0:非同步模式
//					模式1:同步输出模式
//					模式2:同步输入模式
//					模式3:同步输入/输出模式
// 上电复位值:0000 1110

// bCLKDiv

// 返回:无
// =========================================
void D12_SetMode(unsigned int bConfig, unsigned int bClkDiv)
{
	D12_InitWrite();
	D12_Write(CMD,0x00F3);
	D12_Write(DAT,bConfig);
	D12_Write(DAT,bClkDiv);
}

// =========================================
// 函数:void D12_SetDMA(unsigned int bMode)
// 描述:设置DMA
// 参数:bMode
// 返回:无
// =========================================
void D12_SetDMA(unsigned int bMode)
{
	D12_InitWrite();
	D12_Write(CMD, 0x00FB);
	D12_Write(DAT, bMode);
}

// =========================================
// 函数:unsigned int D12_ReadInterruptRegister(void)
// 描述:读中断寄存器
// 参数:无
// 返回:中断信息
// =========================================
unsigned int D12_ReadInterruptRegister(void)
{
	unsigned int b1, j;

	D12_InitWrite();
	D12_Write(CMD,0x00F4);
	D12_InitRead();
	b1 = D12_Read();
	j = D12_Read();
	j <<= 8;
	j += b1;
	return j;
}

// =========================================
// 函数:unsigned int D12_SelectEndpoint(unsigned int bEndp)
// 描述:选择端点
// 参数:选择端点命令将内部指针初始化到选择的缓冲区起始位置
// 返回:bit0:满/空:1表示缓冲区已满,0表示缓冲区为空
//		 bit1:停止:1表示选择的端点处于停止状态
// =========================================
unsigned int D12_SelectEndpoint(unsigned int bEndp)
{
	unsigned int c;
	D12_InitWrite();
	D12_Write(CMD,bEndp);
	D12_InitRead();
	c = D12_Read();
	return c;
}

// =========================================
// 函数:unsigned int D12_ReadLastTransactionStatus(unsigned int bEndp)
// 描述:读取最后处理状态寄存器
// 参数:选择端点
// 返回:错误状态
// =========================================
unsigned int D12_ReadLastTransactionStatus(unsigned int bEndp)
{
	D12_InitWrite();
	D12_Write(CMD, 0x40 + bEndp);
	D12_InitRead();
	return D12_Read();
}

// =========================================
// 函数:unsigned int D12_ReadEndpoint(unsigned int endp,unsigned int len,unsigned int * buf)
// 描述:读缓冲区
// 参数:endp:端点号;len:端点缓冲区中的数据长度;buf:数据缓冲区的地址
// 返回:端点缓冲区中的数据长度
// =========================================
unsigned int D12_ReadEndpoint(unsigned int endp, unsigned int len, unsigned int * buf)
{
	unsigned int i, j;
	D12_InitWrite();
	D12_Write(CMD, endp);
	D12_InitRead();
	if((D12_Read() & D12_FULLEMPTY) == 0)
	{
		return 0;
	}
	D12_InitWrite();
	D12_Write(CMD,0x00F0);
	D12_InitRead();
	j = D12_Read();
	j = D12_Read();
	if(j > len)
		j = len;
	for(i=0; i<j; i++)
		*(buf+i) = D12_Read();
	D12_InitWrite();
	D12_Write(CMD,0x00F2);
	return j;
}

// =========================================
// 函数:unsigned int D12_WriteEndpoint(unsigned int endp,unsigned int len,unsigned int * buf)
// 描述:写缓冲区
// 参数:endp:端点号;len:数据长度;buf:数据缓冲区地址
// 返回:写入的字节数
// =========================================
unsigned int D12_WriteEndpoint(unsigned int endp, unsigned int len, unsigned int * buf)
{
	unsigned int i;

	D12_InitWrite();
	D12_Write(CMD,endp);
	D12_InitRead();
	D12_Read(DAT);
	D12_InitWrite();
	D12_Write(CMD,0x00F0);
	D12_Write(DAT,0x0000);
	D12_Write(DAT,len);
	for(i=0; i<len; i++)
	{
		D12_Write(DAT, *(buf+i));
	}
	D12_Write(CMD,0x00FA);
	return len;
}

// =========================================
// 函数:void D12_SetEndpointStatus(unsigned int bEndp, unsigned int bStalled)
// 描述:设置端点状态
// 参数:bEndp:端点号, bStalled:1, 停止
// 返回:无
// =========================================
void D12_SetEndpointStatus(unsigned int bEndp, unsigned int bStalled)
{
	D12_InitWrite();
	D12_Write(CMD, 0x40 + bEndp);
	D12_Write(DAT, bStalled);
}

// =========================================
// 函数:void D12_AcknowledgeEndpoint(unsigned int endp)
// 描述:应答SETUP
// 参数:endp:端点号
// 返回:无
// =========================================
void D12_AcknowledgeEndpoint(unsigned int endp)
{
	D12_InitWrite();
	D12_Write(CMD, endp);
	D12_Write(CMD, 0x00F1);
	if(endp == 0)
		D12_Write(CMD, 0x00F2);
}

// =========================================
// 函数:unsigned int D12_ReadEndpointAndClrD12Int(unsigned int endp, unsigned int len, unsigned int * buf)
// 描述:读缓冲区
// 参数:endp:端点号;len:端点缓冲区中的数据长度;buf:数据缓冲区的地址
// 返回:端点缓冲区中的数据长度
// =========================================
unsigned int D12_ReadEndpointAndClrD12Int(unsigned int endp, unsigned int len, unsigned int * buf)
{
	unsigned int I_DataLength=0, i=0;
	D12_InitWrite();
	D12_Write(CMD, endp);
	D12_InitRead();
	if((D12_Read() & D12_FULLEMPTY) == 0)
	{
		return 0;
	}
	D12_InitWrite();
	D12_Write(CMD, 0x00F0);
	D12_InitRead();
	I_DataLength = D12_Read();
	I_DataLength = D12_Read();
	if(I_DataLength > len)
		I_DataLength = len;
	for(i=0; i<I_DataLength; i++)
		*(buf+i) = D12_Read();
	D12_InitWrite();
	D12_Write(CMD, 0x00F2);
	D12_ReadLastTransactionStatus(endp);
	return I_DataLength;
}

// =========================================
// 函数:unsigned int D12_WriteEndpointAndClrD12Int(unsigned int endp, unsigned int len, unsigned int * buf)
// 描述:读缓冲区
// 参数:endp:端点号;len:端点缓冲区中的数据长度;buf:数据缓冲区的地址
// 返回:端点缓冲区中的数据长度
// =========================================
unsigned int D12_WriteEndpointAndClrD12Int(unsigned int endp, unsigned int len, unsigned int * buf)
{
	unsigned int i;
	D12_InitWrite();
	D12_Write(CMD, endp);
	D12_InitRead();
	D12_Read(DAT);
	D12_InitWrite();
	D12_Write(CMD, 0x00F0);
	D12_Write(DAT, 0x0000);
	D12_Write(DAT, len);
	for(i=0; i<len; i++)
	{
		D12_Write(DAT, *(buf+i));
	}
	D12_Write(CMD, 0x00FA);
	//clear d12 interrupt
	D12_ReadLastTransactionStatus(endp);
	return len;
}

⌨️ 快捷键说明

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