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

📄 d12ci.c

📁 spce061单片机的一些程序!C语言和汇编语言都有
💻 C
字号:
//============================================================================//
// 文件名:    D12CI.C
// 描  述:   处理PDIUSBD12芯片的控制命令
// 日  期:   2003/04/03
// 库文件:   NONE
//=============================================================================//
#include "D12CI.h"
#include "usbmain.h"
#define D12_FULLEMPTY			0x01
extern EPPFLAGS bEPPflags;
extern void SP_InitWriteD12(void);
extern void SP_InitReadD12(void);
extern void SP_WriteCmdOrDataToD12(unsigned int D_or_C_Addr,unsigned int Data_or_Command);
extern unsigned int SP_ReadD12(unsigned int D_Addr);
extern void Interrupt_Off(void);
extern void Interrupt_On(void);
unsigned int j;
//=====================================================================
// 函数:    D12_SetAddressEnable
// 语法:    void D12_SetAddressEnable(unsigned int bAddress, unsigned int bEnable)
// 描述:    设置USB设备地址使能
// 参数:    1.USB设备地址 2.地址使能参数
// 返回:    无
//=====================================================================
void D12_SetAddressEnable(unsigned int bAddress, unsigned int bEnable)
{
	if(bEPPflags.bits.in_isr == 0)
		Interrupt_Off();
	SP_InitWriteD12();
	SP_WriteCmdOrDataToD12(0xff03,0x00D0);
	if(bEnable)
		bAddress |= 0x80;
    SP_WriteCmdOrDataToD12(0xff02,bAddress);
	if(bEPPflags.bits.in_isr == 0)
		Interrupt_On();
}
//=====================================================================
// 函数:    D12_SetEndpointEnable
// 语法:    void D12_SetAddressEnable(unsigned int bEnable)
// 描述:    设置端点使能
// 参数:    1.端点使能参数
// 返回:    无
//=====================================================================

void D12_SetEndpointEnable(unsigned int bEnable)
{
	if(bEPPflags.bits.in_isr == 0)
		Interrupt_Off();
 	SP_InitWriteD12();
	SP_WriteCmdOrDataToD12(0xff03,0x00D8);
	if(bEnable)
		SP_WriteCmdOrDataToD12(0xff02,0x0001);
	else
	    SP_WriteCmdOrDataToD12(0xff02,0x0001);
	if(bEPPflags.bits.in_isr == 0)
		Interrupt_On();
}
//=====================================================================
// 函数:    D12_SetMode
// 语法:    void D12_SetMode(unsigned int bConfig, unsigned int bClkDiv)
// 描述:    设置D12芯片的工作模式
// 参数:    1.配置值 2.选择CLOCKOUT
// 返回:    无
//=====================================================================
void D12_SetMode(unsigned int bConfig, unsigned int bClkDiv)
{
 	SP_InitWriteD12();
	SP_WriteCmdOrDataToD12(0xff03,0x00F3);
 	SP_WriteCmdOrDataToD12(0xff02,bConfig);
 	SP_WriteCmdOrDataToD12(0xff02,bClkDiv);
 	if(bEPPflags.bits.in_isr == 0)        
 		Interrupt_On();                  

}
//=====================================================================
// 函数:    D12_SetDMA
// 语法:    void D12_SetDMA(unsigned int bMode)
// 描述:    设置D12芯片的DMA方式
// 参数:    DMA的设置变量
// 返回:    无
//=====================================================================
void D12_SetDMA(unsigned int bMode)
{
	SP_InitWriteD12();
	SP_WriteCmdOrDataToD12(0xff03,0x00FB);
 	SP_WriteCmdOrDataToD12(0xff02,bMode);
}
//=====================================================================
// 函数:    D12_SetEndpointStatus
// 语法:    void D12_SetEndpointStatus(unsigned int bEndp, unsigned int bStalled)
// 描述:    设置端点状态
// 参数:    1.端点索引号 2.端点禁止/选通变量
// 返回:    无
//=====================================================================
void D12_SetEndpointStatus(unsigned int bEndp, unsigned int bStalled)
{
	if(bEPPflags.bits.in_isr == 0)
		Interrupt_Off();
	SP_InitWriteD12();
	SP_WriteCmdOrDataToD12(0xff03,0x40 + bEndp);
    SP_WriteCmdOrDataToD12(0xff02,bStalled);
	if(bEPPflags.bits.in_isr == 0)
		Interrupt_On();
}
//==========================================================================================
// 函数:    D12_WriteEndpoint
// 语法:    void D12_WriteEndpoint(unsigned int endp, unsigned int len, unsigned int * buf)
// 描述:    写数据到端点
// 参数:    1.端点号 2.数据长度 3.数据缓冲区的地址
// 返回:    写入数据的长度
//==========================================================================================
unsigned int D12_WriteEndpoint(unsigned int endp, unsigned int len, unsigned int * buf)
{
	unsigned int i;
	if(bEPPflags.bits.in_isr == 0)
		Interrupt_Off();
	SP_InitWriteD12();
	SP_WriteCmdOrDataToD12(0xff03,endp);
    SP_InitReadD12();
	SP_ReadD12(0xff02);
	SP_InitWriteD12();
	SP_WriteCmdOrDataToD12(0xff03,0x00F0);
	SP_WriteCmdOrDataToD12(0xff02,0x0000);
	SP_WriteCmdOrDataToD12(0xff02,len);
	for(i=0; i<len; i++)
	{
		SP_WriteCmdOrDataToD12(0xff02,*(buf+i));
	}
	SP_WriteCmdOrDataToD12(0xff03,0x00FA);
	if(bEPPflags.bits.in_isr == 0)
		Interrupt_On();
	return len;
}
//=====================================================================
// 函数:    D12_AcknowledgeEndpoint
// 语法:    void D12_AcknowledgeEndpoint(unsigned int endp)
// 描述:    SETUP应答
// 参数:    1.端点号 
// 返回:    NONE
//=====================================================================
void D12_AcknowledgeEndpoint(unsigned int endp)
{
	SP_InitWriteD12();
	SP_WriteCmdOrDataToD12(0xff03,endp);
	SP_WriteCmdOrDataToD12(0xff03,0x00F1);
	if(endp == 0)
		SP_WriteCmdOrDataToD12(0xff03,0x00F2);
}

//=====================================================================
// 函数:    D12_ReadInterruptRegister
// 语法:    unsigned int D12_ReadInterruptRegister(void)
// 描述:    读中断寄存器
// 参数:    NONE
// 返回:    中断寄存器值
//=====================================================================
unsigned int D12_ReadInterruptRegister(void)
{
	unsigned int b1;
	SP_InitWriteD12();
	SP_WriteCmdOrDataToD12(0xff03,0x00F4);
	SP_InitReadD12();
	b1 = SP_ReadD12(0xff02);
    j = SP_ReadD12(0xff02);
	j <<= 8;
	j += b1;
	return j;
}

//=====================================================================
// 函数:    D12_ReadLastTransactionStatus
// 语法:    void D12_ReadLastTransactionStatus(unsigned int bEndp)
// 描述:    读最后状态
// 参数:    1.端点号 
// 返回:    端点最后处理状态
//=====================================================================
unsigned int D12_ReadLastTransactionStatus(unsigned int bEndp)
{
	SP_InitWriteD12();
	SP_WriteCmdOrDataToD12(0xff03,0x40 + bEndp);
	SP_InitReadD12();
	return SP_ReadD12(0xff02);
}

//=========================================================================================
// 函数:    D12_ReadEndpoint
// 语法:    void D12_ReadEndpoint(unsigned int endp, unsigned int len, unsigned int * buf)
// 描述:    读端点
// 参数:    1.端点号 2.端点缓冲区中的数据长度 3.数据缓冲区的地址
// 返回:    端点缓冲区中的数据长度
//=========================================================================================
unsigned int D12_ReadEndpoint(unsigned int endp, unsigned int len, unsigned int * buf)
{
	unsigned int i, j;
	if(bEPPflags.bits.in_isr == 0)
		Interrupt_Off();
	SP_InitWriteD12();
	SP_WriteCmdOrDataToD12(0xff03,endp);
	SP_InitReadD12();
	if((SP_ReadD12(0xff02) & D12_FULLEMPTY) == 0)
	{	
		if(bEPPflags.bits.in_isr == 0)
			Interrupt_On();
		return 0;
	}
	SP_InitWriteD12();
	SP_WriteCmdOrDataToD12(0xff03,0x00F0);
	SP_InitReadD12();
	j = SP_ReadD12(0xff02);
	j = SP_ReadD12(0xff02);
	if(j > len)
		j = len;
	for(i=0; i<j; i++)
		*(buf+i) = SP_ReadD12(0xff02);
	SP_InitWriteD12();
	SP_WriteCmdOrDataToD12(0xff03,0x00F2);
	if(bEPPflags.bits.in_isr == 0)
		Interrupt_On();
	return j;
}

//=====================================================================
// 函数:    D12_SelectEndpoint
// 语法:    unsigned int D12_SelectEndpoint(unsigned int bEndp)
// 描述:    选择端点
// 参数:    1.端点号
// 返回:    端点状态
//=====================================================================
unsigned int D12_SelectEndpoint(unsigned int bEndp)
{
	unsigned int c;
	if(bEPPflags.bits.in_isr == 0)
		Interrupt_Off();
	SP_InitWriteD12();
	SP_WriteCmdOrDataToD12(0xff03,bEndp);
	SP_InitReadD12();
	c = SP_ReadD12(0xff02);
	if(bEPPflags.bits.in_isr == 0)
		Interrupt_On();
	return c;
}

⌨️ 快捷键说明

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