📄 pdiusbd12.c
字号:
//== 返 回 值:0
//===============================================================================//
unsigned char ack_setup(unsigned char endp)
{
#ifdef __DEBUG__ //== 打印调试信息
Print_Msg("Runing ack_setup()!\r\n");
#endif
select_endpoint(endp);
write_D12_command(Ack_Setup);
return 0;
}
//===============================================================================//
//== 函 数 名:error
//== 功 能:出错处理
//== 说 明:
//== 时 间:2008.8.13 创建函数
//== 入口参数:number:错误号
//== 返 回 值:0
//===============================================================================//
unsigned char error(unsigned char number)
{
#ifdef __DEBUG__ //== 打印调试信息
Print_Msg("Runing error()!\r\n");
#endif
number = 0;
return 0;
}
//===============================================================================//
//== 函 数 名:read_endpoint_buff
//== 功 能 :读端点缓冲区(读取逻辑端点0和1),读出的数据为
//== 说 明 :字节1: 保留可为任意值
//== :字节2: 数据字节的数目/长度
//== :字节3: 数据字节1
//== :字节4: 数据字节2
//== 时 间 :2008.8.13 创建函数
//== 入口参数:endp:端点号 len:要读出的长度 buff:存储的缓冲区
//== 返 回 值:ret:实际读取的字节数
//===============================================================================//
unsigned char read_endpoint_buff(unsigned char endp,unsigned char len,unsigned char * buff)
{
unsigned char i, ret;
#ifdef __DEBUG__ //== 打印调试信息
Print_Msg("Runing read_endpoint_buff()!\r\n");
#endif
//== 进行端点操作前要选择端点
if ((select_endpoint(endp)&0x01) == 0x00)//== 端点缓冲区为空时返回,端点必须在运行状态时才可引发中断
{ //== 所以这里只是判断缓冲区是否满,并没有要判断端点是否运行
error(0);
return 0;
}
write_D12_command(Read_Buffer); //== 读缓冲区命令,读nB
read_a_D12_data(); //== 读出的第一个字节,保留,可为任意值
ret = read_a_D12_data(); //== 读出的第二个字节是数据字节的数目/长度
if (ret > len) //== 数据字节长度最大130B
{
ret = len;
}
for (i=0; i<ret; i++)
{
*(buff+i) = D12_DATA_ADD;
}
clear_buffer();
return ret;
}
//===============================================================================//
//== 函 数 名:read_main_endpoint_buff
//== 功 能 :读端点4缓冲区(主输出端点),读出的数据为
//== 说 明 :字节1: 保留可为任意值
//== :字节2: 数据字节的数目/长度
//== :字节3: 数据字节1
//== :字节4: 数据字节2
//== :主端点4和5都是双缓冲区,每个端点都有2个64字节的缓冲区
//== 时 间 :2008.8.13 创建函数
//== 入口参数:buff:存储的缓冲区
//== 返 回 值:ret:实际读取的字节数
//===============================================================================//
unsigned char read_main_endpoint_buff(unsigned char* buff)
{
unsigned char i, ret;
unsigned char bDbuBuf = 1; //== 记录有几个缓冲区满
unsigned char j = 0;
#ifdef __DEBUG__ //== 打印调试信息
Print_Msg("Runing read_main_endpoint_buff()!\r\n");
#endif
if ((read_endpoint_status(0x84)&0x60) == 0x60)//== 两个缓冲区都满都满,要读取128个字节
{
// error(0);
bDbuBuf = 2;
}
for (; bDbuBuf>0; bDbuBuf--)
{ //== 进行端点操作前要选择端点
if ((select_endpoint(0x04))&0x01 == 0x00) //== 端点缓冲区为空时退出
{
break;
}
write_D12_command(Read_Buffer); //== 读缓冲区命令,读nB
read_a_D12_data(); //== 读出的第一个字节,保留,可为任意值
ret = read_a_D12_data(); //== 读出的第二个字节是数据字节的数目/长度
for (i=0; i<ret; i++) //== 数据字节长度最大130B
{
*(buff+i+j) = D12_DATA_ADD;
}
j += ret;
clear_buffer();
}
ret = j;
return ret;
}
//===============================================================================//
//== 函 数 名:write_endpoint_buff
//== 功 能:写端点缓冲区
//== 说 明:最多一次能写入130个字节
//== 时 间:2008.8.13 创建函数
//== 入口参数:endp:端点号 len:要写入的长度 buff:存储的缓冲区
//== 返 回 值:len:实际写入的字节数
//===============================================================================//
unsigned char write_endpoint_buff(unsigned char endp, unsigned char len, unsigned char* buff)
{
unsigned char i;
#ifdef __DEBUG__ //== 打印调试信息
Print_Msg("Runing write_endpoint_buff()!\r\n");
#endif
read_last_status(endp);
select_endpoint(endp);
write_D12_command(Write_Buffer);
write_a_D12_data(0); //== 写入的第一个字节保留,总为0
write_a_D12_data(len);
for (i=0; i<len; i++)
{
D12_DATA_ADD = *(buff+i);
}
validate_buffer();
Print_Msg("************** ");
Print_Hex(buff, len);
Print_Msg("**************!\r\n");
return len;
}
//===============================================================================//
//== 函 数 名:disconnect_usb
//== 功 能:断开USB连接
//== 说 明:断开后要有一100ms的延时
//== 时 间:2008.8.13 创建函数
//== 入口参数:无
//== 返 回 值:0
//===============================================================================//
unsigned char disconnect_usb(void)
{
unsigned int i;
#ifdef __DEBUG__ //== 打印调试信息
Print_Msg("Runing disconnect_usb()!\r\n");
#endif
#ifdef __DEBUG__ //== 打印调试信息
Print_Msg(" 断开USB连接........................\r\n");
#endif
write_D12_command(0xf3);
write_a_D12_data(0x0e);
write_a_D12_data(0x47);
for (i=0; i<50000; i++); //== 延时100ms
return 0;
}
//===============================================================================//
//== 函 数 名:connect_usb
//== 功 能:连接USB
//== 说 明:连接USB后并设置D12的输出时钟频率
//--0xF3 设置模式 写入两个字节
//--1、配置字节 D7,D6(00):端点配置 模式0:非同步模式 模式1:同步输出模式
//--------------- 模式2:同步输入模式 同步输入/输出模式
//---------------D5(0): 保留位
//---------------D4(0): softConnect 1:VBUS可用 上行数据上拉电阻被连接
//---------------D3(1): 中断模式 1:表示报告所有的错误和”NKing”并产生一个中
//--------------- 0:表示只有"OK"被报告
//---------------D2(1):时钟运行,1:表示在挂起状态下仍然有时钟和PLL,0表示无
//---------------D1(1): 无LAZYCLOCK 1:表示CLKOUT不会切换到LazyClock
//--------------- 0:表示CLKOUT在Suspend变高之后切换到LazyClock
//---------------D0(0): 保留位
//--2、时钟分频系数字节
//---------------D7(0): SOF-ONLY中断模式
//---------------1:表示仅当桢时钟的起始(SOF)时刻引起中断的产生,而不管引脚中断模式的设定
//---------------D6(0):SET_TO_ONE模式
//---------------D5,D4(00): 保留位
//---------------D3,2,1,0(1011):N表示分频系数输出频率为48MHz/(N+1)
//== 时 间:2008.8.13 创建函数
//== 入口参数:无
//== 返 回 值:0
//===============================================================================//
unsigned char connect_usb(void)
{
#ifdef __DEBUG__ //== 打印调试信息
Print_Msg("Runing connect_usb()!\r\n");
#endif
#ifdef __DEBUG__ //== 打印调试信息
Print_Msg(" 连接USB...............\r\n");
#endif
write_D12_command(0xf3); //== 初始化USBD12
write_a_D12_data(0x1e); //== 连接USB
write_a_D12_data(0x47); //== 设置频率
return 0;
}
//===============================================================================//
//== 函 数 名:init_usb
//== 功 能:初始化D12
//== 说 明:
//== 时 间:2008.8.13 创建函数
//== 入口参数:无
//== 返 回 值:0
//===============================================================================//
unsigned char init_usb(void)
{
#ifdef __DEBUG__ //== 打印调试信息
Print_Msg("Runing init_usb()!\r\n");
#endif
#ifdef __DEBUG__ //== 打印调试信息
Print_Msg(" set+enable D12 address!\r\n");
#endif
set_usb_addr(0);
set_endpoint_enable();
return 0;
}
//===============================================================================//
//== 函 数 名:D12_ReadChipID
//== 功 能:读取D12版本号
//== 说 明:
//== 时 间:2008.8.13 创建函数
//== 入口参数:无
//== 返 回 值:0
//===============================================================================//
unsigned char D12_ReadChipID(void)
{
unsigned char Chip_ID[2];
#ifdef __DEBUG__ //== 打印调试信息
Print_Msg("D12_ReadChipID()!\r\n");
#endif
write_D12_command(Read_ChipID);
Chip_ID[0] = read_a_D12_data();
Chip_ID[1] = read_a_D12_data();
Print_Msg(" Chip_ID:");
Print_Hex(Chip_ID, 2);
Print_Msg("!\r\n");
return 0;
}
//===============================================================================//
//== 函 数 名:endp0_out
//== 功 能:终端点0输出中断处理
//== 说 明:
//== 时 间:2008.8.13 创建函数
//== 入口参数:无
//== 返 回 值:0
//===============================================================================//
unsigned char endp0_out(void)
{
unsigned char i;
#ifdef __DEBUG__ //== 打印调试信息
Print_Msg("Runing endp0_out()!\r\n");
#endif
D12_last_status.Register = read_last_status(0); //== 读取端点0的最后状态寄存器并清中断标志
if (D12_last_status.Status.setup_packet) //== 如果收到建立(setup)包
{
Control_Data.wLength = 0; //== 传输字节总数清零
Control_Data.wCount = 0; //== 传输字节计数器清零
if (read_endpoint_buff(0,sizeof(Control_Data.DeviceRequest),(unsigned char *)(&(Control_Data.DeviceRequest))) != sizeof(REQUESTCMD))
{ //== 如果从端点0读取8个字节失败
set_endpoint_status(0,0); //== 停止控制端点0
set_endpoint_status(1,0); //== 停止控制端点1
bEPPflags.bits.control_state = USB_IDLE;
return 1;
}
Print_Hex((unsigned char*)(&(Control_Data.DeviceRequest)), 8);
Print_Msg("!\r\n");
Control_Data.DeviceRequest.wValue = SWAP16(Control_Data.DeviceRequest.wValue);
Control_Data.DeviceRequest.wIndex = SWAP16(Control_Data.DeviceRequest.wIndex);
Control_Data.DeviceRequest.wLength = SWAP16(Control_Data.DeviceRequest.wLength);
Print_Hex((unsigned char*)(&(Control_Data.DeviceRequest)), 8);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -