📄 d12ci.c
字号:
#include<reg51.h>
#include"Config.h"
#include"D12CI.h"
//51与D12的连接
#define D12Data P0
sbit D12RST = P1^1;
sbit D12ALE = P1^2;
sbit D12CS = P1^3;
sbit D12WR = P1^4;
sbit D12RD = P1^5;
sbit D12INT = P1^6;
sbit D12SUSPD = P1^7;
//函数名称: void Init_D12Port(void)
//功能描述: 初始化D12与8051的连接端口
void Init_D12Port(void)
{
D12CS = 1; //释放D12
D12CS = 0; //选择D12
}
//函数名称: void Rst_D12(void)
//功能描述: 复位D12
void Rst_D12(void)
{
INT16U i;
D12RST = 0; //D12的 RESET引脚置0
nNop(10);
D12RST = 1; //D12的 RESET引脚置1
D12SUSPD = 0; //D12的 SUSPEND引脚置0
}
//函数名称: outportb()
//功能描述: 向D12写入数据
//参数说明: I_D: 命令(0)或数据(1)
// Data: 命令字节
void outportb(bit I_D, INT8U Data)
{
if(I_D==0)
{
}
}
//函数名称: inportd()
//功能描述: 读入数据
//参数说明: INT16U Addr: 数据地址
INT8U inportb(INT16U Addr)
{
return *((INT8U xdata *) Addr);
}
/************************************************************
** 函数名称: D12_ReadChipID()
** 功能描述: 读取芯片ID
** 输 入: 无
** 输 出: 芯片的ID号
************************************************************/
INT16U D12_ReadChipID(void)
{
INT16U i,j;
if(bEPPflags.bits.in_isr == 0)
DISABLE();
outportb(D12_COMMAND, 0xFD); //发送读PDIUSBD12芯片ID号命令
i=inportb(D12_DATA); //读取ID号低字节
j=inportb(D12_DATA); //读取ID号高位字节
i += (j<<8); //组成16位的PDIUSBD12芯片ID号
if(bEPPflags.bits.in_isr == 0)
ENABLE();
return i;
}
/************************************************************
** 函数名称: D12_SetAddressEnable()
** 功能描述: 设置地址/使能
** 输 入: INT8U bAddress: 地址
INT8U bEnable : 0 --- 禁止
1 --- 使能
** 输 出: 无
************************************************************/
void D12_SetAddressEnable(INT8U bAddress, INT8U bEnable)
{
if(bEPPflags.bits.in_isr == 0)
DISABLE();
outportb(D12_COMMAND, 0xD0); //输出设置地址/使能指令
if(bEnable)
bAddress |= 0x80; //bit7置1,使能
outportb(D12_DATA, bAddress); //输出设置值
if(bEPPflags.bits.in_isr == 0)
ENABLE();
}
/************************************************************
** 函数名称: D12_SetEndpointEnable()
** 功能描述: 设置端点使能
** 输 入: INT8U bEnable : 0 --- 禁止
1 --- 允许
** 输 出: 无
************************************************************/
void D12_SetEndpointEnable(INT8U bEnable)
{
if(bEPPflags.bits.in_isr == 0)
DISABLE();
outportb(D12_COMMAND, 0xD8); //输出设置端点使能指令
if(bEnable)
outportb(D12_DATA, 1); //设置端点允许
else
outportb(D12_DATA, 0); //设置端点禁止
if(bEPPflags.bits.in_isr == 0)
ENABLE();
}
/************************************************************
** 函数名称: void D12_SetMode()
** 功能描述: 模式设置
** 输 入: INT8U bConfig: 配置字节信息
INT8U bClkDiv: 分频系数
** 输 出: 无
************************************************************/
void D12_SetMode(INT8U bConfig,INT8U bClkDiv)
{
if(bEPPflags.bits.in_isr == 0)
DISABLE();
outportb(D12_COMMAND, 0xF3); //输出设置模式指令
outportb(D12_DATA, bConfig); //输出配置字节信息
outportb(D12_DATA, bClkDiv); //输出时钟分频因数字节
if(bEPPflags.bits.in_isr == 0)
ENABLE();
}
/************************************************************
** 函数名称: void D12_SetDMA()
** 功能描述: 设置DMA工作方式设置
** 输 入: INT8U bMode: 设置值
** 输 出: 无
************************************************************/
void D12_SetDMA(INT8U bMode)
{
if(bEPPflags.bits.in_isr == 0)
DISABLE();
outportb(D12_COMMAND, 0xFB); //设置DMA工作方命令
outportb(D12_DATA, bMode); //输出设置值
if(bEPPflags.bits.in_isr == 0)
ENABLE();
}
/************************************************************
** 函数名称: D12_ReadInterruptRegister()
** 功能描述: 读取中断寄存器值
** 输 入: 无
** 输 出: 中断寄存器值
************************************************************/
INT16U D12_ReadInterruptRegister(void)
{
INT8U b1;
INT16U j;
outportb(D12_COMMAND, 0xF4); //读取中断寄存器命令
b1 = inportb(D12_DATA); //读取低8位字节
j = inportb(D12_DATA); //读取高8位字节
j <<= 8;
j += b1; //组合为16位
return j;
}
/************************************************************
** 函数名称: D12_SelectEndpoint()
** 功能描述: 端点选择,将内部指针初始化到选择的缓冲区起始位置
** 输 入: INT8U bEndp: 端点索引号,取值0 ~ 5
** 输 出: 读出的字节
************************************************************/
INT8U D12_SelectEndpoint(INT8U bEndp)
{
INT8U c;
if(bEPPflags.bits.in_isr == 0)
DISABLE();
outportb(D12_COMMAND, bEndp); //端点选择
c = inportb(D12_DATA); //读出一个字节
if(bEPPflags.bits.in_isr == 0)
ENABLE();
return c;
}
/************************************************************
** 函数名称: D12_ReadEndpointStatus()
** 功能描述: 读取端点状态
** 输 入: INT8U bEndp: 端点索引号,取值0 ~ 5
** 输 出: 端点状态
************************************************************/
#if D12_ReadEndpointStatus_EN
INT8U D12_ReadEndpointStatus(INT8U bEndp)
{
INT8U c;
if(bEPPflags.bits.in_isr == 0)
DISABLE();
outportb(D12_COMMAND, 0x80 + bEndp); //读取端点状态命令
c = inportb(D12_DATA); //读取端点状态
if(bEPPflags.bits.in_isr == 0)
ENABLE();
return c;
}
#endif
/************************************************************
** 函数名称: D12_ReadLastTransactionStatus()
** 功能描述: 读取最后处理状态寄存器
** 输 入: INT8U bEndp: 端点索引号,取值0 ~ 5
** 输 出: 端点最后处理的状态
************************************************************/
INT8U D12_ReadLastTransactionStatus(INT8U bEndp)
{
outportb(D12_COMMAND, 0x40 + bEndp); //输出读取最后处理状态寄存器命令
return inportb(D12_DATA); //读取状态
}
/************************************************************
** 函数名称: D12_SetEndpointStatus()
** 功能描述: 设置端点状态
** 输 入: INT8U bEndp: 端点索引号,取值0 ~ 5
INT8U bStalled: 状态值
** 输 出: 端点状态
************************************************************/
void D12_SetEndpointStatus(INT8U bEndp,INT8U bStalled)
{
if(bEPPflags.bits.in_isr == 0)
DISABLE();
outportb(D12_COMMAND, 0x40 + bEndp); //发送设置端点状态命令
outportb(D12_DATA, bStalled); //设置端点状态
if(bEPPflags.bits.in_isr == 0)
ENABLE();
}
/************************************************************
** 函数名称: D12_SendResume()
** 功能描述: 传输恢复
** 输 入: 无
** 输 出: 无
************************************************************/
#if D12_SendResume_EN
void D12_SendResume(void)
{
outportb(D12_COMMAND, 0xF6); //设置发送恢复
}
#endif
/************************************************************
** 函数名称: D12_ReadCurrentFrameNumber()
** 功能描述: 读取当前帧号
** 输 入: 无
** 输 出: 当前帧号
************************************************************/
#if D12_ReadCurrentFrameNumber_EN
INT16U D12_ReadCurrentFrameNumber(void)
{
INT16U i,j;
if(bEPPflags.bits.in_isr == 0)
DISABLE();
outportb(D12_COMMAND, 0xF5); //发送读取当前帧数目命令
i= inportb(D12_DATA); //读取帧数目的低8位
j = inportb(D12_DATA); //读取帧数目的高8位
i += (j<<8);
if(bEPPflags.bits.in_isr == 0)
ENABLE();
return i; //返目当前帧数目
}
#endif
/************************************************************
** 函数名称: D12_ReadEndpoint()
** 功能描述: 读取端点数据
** 输 入: INT8U endp: 端点索引号,取值 0 ~ 5
INT8U len: 要读取的数据长度
INT8U * buf: 接收数据指针
** 输 出: 实际读得的字节数
************************************************************/
INT8U D12_ReadEndpoint(INT8U endp,INT8U len,INT8U * buf)
{
INT8U i, j;
if(bEPPflags.bits.in_isr == 0)
DISABLE();
outportb(D12_COMMAND, endp); //发送选择端点命令
if((inportb(D12_DATA) & D12_FULLEMPTY) == 0) { //如果缓冲区为空
if(bEPPflags.bits.in_isr == 0)
ENABLE();
return 0; //则返回读到0字节
}
outportb(D12_COMMAND, 0xF0); //发送读缓冲区命令
j = inportb(D12_DATA); //读取保留字节
j = inportb(D12_DATA); //读取数据字节的数目/长度
if(j > len) //如果大于要求读的字节数目
j = len; //则只读取要求的字节长度
for(i=0; i<j; i++)
*(buf+i) = inportb(D12_DATA); //读取要求的字节数目/长度
outportb(D12_COMMAND, 0xF2); //清缓冲区,新的信息包才可以重新被接受
if(bEPPflags.bits.in_isr == 0)
ENABLE();
return j; //返回读到的字节数
}
/************************************************************
** 函数名称: D12_WriteEndpoint()
** 功能描述: 把数据写入端点
** 输 入: INT8U endp: 端点索引号,取值 0 ~ 5
INT8U len: 要写入的数据长度
INT8U * buf: 发送数据指针
** 输 出: 实际写入的字节数
************************************************************/
INT8U D12_WriteEndpoint(INT8U endp, INT8U len,INT8U * buf)
{
INT8U i;
if(bEPPflags.bits.in_isr == 0)
DISABLE();
outportb(D12_COMMAND, endp); //发送选择端点命令
i = inportb(D12_DATA); //可选地读取一个字节
outportb(D12_COMMAND, 0xF0); //发送写缓冲区命令
outportb(D12_DATA, 0); //写入一个保留字节
outportb(D12_DATA, len); //写入即将写入的字节数目
for(i=0; i<len; i++)
outportb(D12_DATA, *(buf+i)); //写入指定的字节
outportb(D12_COMMAND, 0xFA); //使缓冲区有效
if(bEPPflags.bits.in_isr == 0)
ENABLE();
return len; //返回写入的字节数
}
/************************************************************
** 函数名称: D12_AcknowledgeEndpoint()
** 功能描述: 应答Setup
** 输 入: INT8U endp: 端点索引号,取值 0 ~ 5
** 输 出: 无
************************************************************/
void D12_AcknowledgeEndpoint(INT8U endp)
{
outportb(D12_COMMAND, endp); //选择端点
outportb(D12_COMMAND, 0xF1); //应答Setup指令
if(endp == 0)
outportb(D12_COMMAND, 0xF2); //清空该端点缓冲区
}
/************************************************************
** 函数名称: void D12_ClearBuff()
** 功能描述: 清指定端点的缓冲区(包括双缓冲区)
** 输 入: INT8U endp: 端点索引号,取值 0 ~ 5
** 输 出: 无
************************************************************/
#if D12_ClearBuff_EN
void D12_ClearBuff(INT8U endp)
{
outportb(D12_COMMAND, endp); //选择端点
outportb(D12_COMMAND, 0xF2); //清空第1个缓冲区
if (endp >= 4){
outportb(D12_COMMAND, endp); //选择端点
outportb(D12_COMMAND, 0xF2); //清空第2个缓冲区
}
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -