📄 d12ci.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 + -