📄 pdiusbd12.c
字号:
/*===============================================================================//
//== 文 件 名:PDIUSBD12.c
//== author :gnsusn
//== 说 明:对PDIUSBD12芯片的操作
//== 修改日志:2008.8.13 创建文件
//==
//===============================================================================*/
#include "PDIUSBD12.h"
#include "USB.h"
#include "functions.h"
//***************************************************************************************
//=======================================================================================
#define D12_COMMAND_ADD (*(unsigned char volatile xdata*)0x6001)
#define D12_DATA_ADD (*(unsigned char volatile xdata*)0x6000)
extern unsigned char usb_transmit_buf[8]; //== 用于给USB发送数据的缓冲区,在USB.c中定义
extern EPPFLAGS bEPPflags; //== 程序运行状态标志,在USB.c中定义
extern CONTROL_DATA_BUFF Control_Data; //== setup 包,在USB.c中定义
D12_INTERRUPT_REGISTER D12_interrupt_register; //== D12中断寄存器的标志
D12_LAST_STATUS D12_last_status; //== 端点的最后处理状态
/****************************** PDIUSBD12硬件提取层 ******************************/
//===============================================================================//
//== 函 数 名:write_D12_command
//== 功 能:向D12写入一个字节的命令
//== 说 明:
//== 时 间:2008.8.13 创建函数
//== 入口参数:D12_command:向D12写入的命令
//== 返 回 值:0
//===============================================================================//
unsigned char write_D12_command(unsigned char D12_command)
{
D12_COMMAND_ADD = D12_command;
return 0;
}
//===============================================================================//
//== 函 数 名:write_a_D12_data
//== 功 能:向D12写入一个字节的命令
//== 说 明:
//== 时 间:2008.8.13 创建函数
//== 入口参数:D12_data:向D12写入的数据
//== 返 回 值:0
//===============================================================================//
unsigned char write_a_D12_data(unsigned char D12_data)
{
D12_DATA_ADD = D12_data;
return 0;
}
//===============================================================================//
//== 函 数 名:read_a_usb_data
//== 功 能:从D12读出一个字节
//== 说 明:
//== 时 间:2008.8.13 创建函数
//== 入口参数:无
//== 返 回 值:ret:从D12读出的数据
//===============================================================================//
unsigned char read_a_D12_data(void)
{
unsigned char ret;
ret = D12_DATA_ADD;
return ret;
}
/**************************** PDIUSBD12硬件提取层结束 ****************************/
/****************************** PDIUSBD12硬件命令层 ******************************/
//===============================================================================//
//== 函 数 名:set_usb_addr
//== 功 能:设置D12的地址
//== 说 明:开机后单片机设置D12的地址,并使能这个地址,这个地址默认为0
//== :设置地址使能写入一个字节
//== :D7:置1使能该功能
//== :D6~D0:写入的字节即为地址
//== 时 间:2008.8.13 创建函数
//== 入口参数:无
//== 返 回 值:0
//===============================================================================//
unsigned char set_usb_addr(unsigned char addr)
{
#ifdef __DEBUG__
Print_Msg("Runing set_usb_addr()!\r\n");
#endif
write_D12_command(Set_Address);
write_a_D12_data(Address_Enable|addr); //== Address_Enable:0x80 使能这个地址
#ifdef __DEBUG__
Print_Msg(" 设置地址.....................!\r\n");
Print_Msg(" 地址为:");
Print_Long(addr);
Print_Msg("!\r\n");
#endif
return 0;
}
//===============================================================================//
//== 函 数 名:set_endpoint_enable
//== 功 能:使能端点0
//== 说 明:通过设置设置地址(设备地址)/使能命令后才可使能(端点0)普通/同步端点
//== 时 间:2008.8.13 创建函数
//== 入口参数:无
//== 返 回 值:0
//===============================================================================//
unsigned char set_endpoint_enable(void)
{
#ifdef __DEBUG__
Print_Msg("Runing set_endpoint_enable()!\r\n");
#endif
#ifdef __DEBUG__
Print_Msg(" 使能端点0!\r\n");
#endif
write_D12_command(Set_Endpoint_Enable);
write_a_D12_data(0x01); //== 值1 表示普通/同步端点使能
return 0;
}
//===============================================================================//
//== 函 数 名:set_endpoint_disable
//== 功 能:禁止端点0
//== 说 明:通过设置设置地址(设备地址)/使能命令后才可使能(端点0)普通/同步端点
//== 时 间:2008.8.13 创建函数
//== 入口参数:无
//== 返 回 值:0
//===============================================================================//
unsigned char set_endpoint_disable(void)
{
#ifdef __DEBUG__
Print_Msg("Runing set_endpoint_disable()!\r\n");
#endif
#ifdef __DEBUG__
Print_Msg(" 禁止端点0!\r\n");
#endif
write_D12_command(Set_Endpoint_Enable);
write_a_D12_data(0x00); //== 值1 表示普通/同步端点使能
return 0;
}
//===============================================================================//
//== 函 数 名:read_interrupt_register
//== 功 能:从D12读出中断状态寄存器
//== 说 明:
//== 时 间:2008.8.13 创建函数
//== 入口参数:无
//== 返 回 值:0
//===============================================================================//
unsigned char read_interrupt_register(void)
{
#ifdef __DEBUG__
Print_Msg("Runing read_interrupt_register()!\r\n");
#endif
write_D12_command(Read_Interrupt_Register);
D12_interrupt_register.Register[0] = read_a_D12_data();
D12_interrupt_register.Register[1] = read_a_D12_data();
#ifdef __DEBUG__
Print_Msg(" 中断寄存器数据是:");
Print_Hex(D12_interrupt_register.Register, 2);
Print_Msg("\r\n");
#endif
return 0;
}
//===============================================================================//
//== 函 数 名:select_endpoint
//== 功 能:选择端点
//== 说 明:
//== 时 间:2008.8.13 创建函数
//== 入口参数:endp:端点索引号(0-5)
//== 返 回 值:bit0--1表示缓冲区满,0表示缓冲区空
// bit1--1表示端点处于停止状态,0表示运行
//===============================================================================//
unsigned char select_endpoint(unsigned char endp)
{
unsigned char ret;
#ifdef __DEBUG__ //== 打印调试信息
Print_Msg("Runing select_endpoint()!\r\n");
#endif
write_D12_command(Select_EndPoint+endp);
ret = read_a_D12_data();
#ifdef __DEBUG__
Print_Msg(" 选择了端点:");
Print_Long(endp);
Print_Msg(" 端点状态:");
Print_Hex(&ret, 1);
Print_Msg("!\r\n");
#endif
return ret;
}
//===============================================================================//
//== 函 数 名:read_last_status
//== 功 能:读取端点最后处理状态,命令为0x40+endp
//== 说 明:该命令同时复位中断寄存器中的相应位,并将状态清零,表示已读取。
//== 时 间:2008.8.13 创建函数
//== 入口参数:endp:端点索引号(0-5)
//== 返 回 值:端点最后处理状态寄存器
//===============================================================================//
unsigned char read_last_status(unsigned char endp)
{
unsigned char ret;
#ifdef __DEBUG__ //== 打印调试信息
Print_Msg("Runing read_last_status()!\r\n");
#endif
write_D12_command(Read_Last_Status+endp);
ret = read_a_D12_data();
#ifdef __DEBUG__
Print_Msg(" 读取端点 ");
Print_Long(endp);
Print_Msg(" 最后处理状态状态,");
Print_Msg(" 端点状态是:");
Print_Hex(&ret, 1);
Print_Msg("!\r\n");
#endif
return ret;
}
//===============================================================================//
//== 函 数 名:set_endpoint_status
//== 功 能:设置端点状态,停止或运行端点,命令为0x40+endp
//== 说 明:端点状态 1:停止 0:运行
//== 时 间:2008.8.13 创建函数
//== 入口参数:endp:端点索引号(0-5)
// status:端点状态
// bit1-bit7为保留位
// bit0 = 1--表示端点处于停止状态
//== 返 回 值:0
//===============================================================================//
unsigned char set_endpoint_status(unsigned char endp,unsigned char status)
{
#ifdef __DEBUG__ //== 打印调试信息
Print_Msg("Runing set_endpoint_status()!\r\n");
#endif
write_D12_command(0x40+endp);
write_a_D12_data(status);
return 0;
}
//===============================================================================//
//== 函 数 名:read_endpoint_status
//== 功 能:读端点状态,命令为0x80+endp
//== 说 明:主要作用是判断端点缓冲区是否满
//== 时 间:2008.8.13 创建函数
//== 入口参数:endp:端点索引号(0-5)
//== 返 回 值:当前端点状态信息
//===============================================================================//
unsigned char read_endpoint_status(unsigned char endp)
{
#ifdef __DEBUG__ //== 打印调试信息
Print_Msg("Runing read_endpoint_status()!\r\n");
#endif
write_D12_command(0x80+endp);
return read_a_D12_data();
}
//===============================================================================//
//== 函 数 名:clear_buffer
//== 功 能:清缓冲区,命令为0xf2
//== 说 明:清的是选择的端点的缓冲区,在读取缓冲数据后调用
//== 时 间:2008.8.13 创建函数
//== 入口参数:无
//== 返 回 值:0
//===============================================================================//
unsigned char clear_buffer(void)
{
#ifdef __DEBUG__ //== 打印调试信息
Print_Msg("Runing clear_buffer()!\r\n");
#endif
write_D12_command(Clear_Buffer);
return 0;
}
//===============================================================================//
//== 函 数 名:validate_buffer
//== 功 能:缓冲区数据有效
//== 说 明:选择的端点的缓冲区有效,在写缓冲后调用
//== 时 间:2008.8.13 创建函数
//== 入口参数:无
//== 返 回 值:0
//===============================================================================//
unsigned char validate_buffer(void)
{
#ifdef __DEBUG__ //== 打印调试信息
Print_Msg("Runing validate_buffer()!\r\n");
#endif
write_D12_command(Validate_Buffer);
return 0;
}
//===============================================================================//
//== 函 数 名:ack_setup
//== 功 能:应答建立包
//== 说 明:处理完 setup 包后调用
//== 时 间:2008.8.13 创建函数
//== 入口参数:endp:端点索引号
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -