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