📄 pdiusbd12.c
字号:
Print_Msg("!\r\n");
ack_setup(0); //== 对控制端点0 进行建立包应答
ack_setup(1); //== 对控制端点1 进行建立包应答
Control_Data.wLength = Control_Data.DeviceRequest.wLength; //== 取出要传输数据的总字节数
Control_Data.wCount = 0; //== 传输字节计数器清零
if (Control_Data.DeviceRequest.bmRequestType&0x80) //== 如果控制传输是控制读取(设备到主机)
{
bEPPflags.bits.setup_packet_in = 1; //== 通知处理Setup 包,get command
bEPPflags.bits.control_state = USB_IDLE;
}
else //== 控制输出(主机到设备),不过要向主机返回一个长度为0的数据包
{
if (Control_Data.DeviceRequest.wLength == 0) //== set command 返回信息的字节长度是0
{
bEPPflags.bits.setup_packet_out = 1;
bEPPflags.bits.control_state = USB_IDLE;
}
else
{
if (Control_Data.DeviceRequest.wLength > MAX_CONTROLDATA_SIZE) //== 主机发给设备的令牌包的数据
{ //-- 长度不能大于8个字节
bEPPflags.bits.control_state = USB_IDLE;
set_endpoint_status(0,1); //== 运行控制端点0
set_endpoint_status(1,1); //== 运行控制端点1
}
else
{
bEPPflags.bits.control_state = USB_RECEIVE; //== set command with OUT token
}
} //== set command with data
} //== else set command
} //== if setup packet
else
{
if (bEPPflags.bits.control_state == USB_RECEIVE)
{
i = read_endpoint_buff(0, EP0_PACKET_SIZE, Control_Data.dataBuffer + Control_Data.wCount);
Control_Data.wCount += i;
if ((i != EP0_PACKET_SIZE) || (Control_Data.wCount >= Control_Data.wLength))
{
bEPPflags.bits.setup_packet_out = 1;
bEPPflags.bits.control_state = USB_IDLE;
}
}
else
{
bEPPflags.bits.control_state = USB_IDLE;
}
}
select_endpoint(0); //== 这是必须的
clear_buffer();
return 0;
}
//===============================================================================//
//== 函 数 名:endp0_in
//== 功 能:终端点0输入处理
//== 说 明:
//== 时 间:2008.8.13 创建函数
//== 入口参数:无
//== 返 回 值:0
//===============================================================================//
unsigned char endp0_in(void)
{
short i;
#ifdef __DEBUG__ //== 打印调试信息
Print_Msg("Runing endp0_in()!\r\n");
#endif
bEPPflags.bits.usb_endp0_in = 1;
i = Control_Data.wLength - Control_Data.wCount;
D12_last_status.Register = read_last_status(1); //== Clear interrupt flag
if (bEPPflags.bits.control_state != USB_TRANSMIT)
return 1;
if (i >= EP0_PACKET_SIZE) //== 一次没传完
{
write_endpoint_buff(1, EP0_PACKET_SIZE, Control_Data.pData + Control_Data.wCount);
if (bEPPflags.bits.first_get_descriptor)
{
bEPPflags.bits.control_state = USB_IDLE; //== 第一次传控制端点最大缓冲区的字节数就可以(在这里是16)
bEPPflags.bits.first_get_descriptor = 0;
}
else
{
bEPPflags.bits.control_state = USB_TRANSMIT;
}
Control_Data.wCount += EP0_PACKET_SIZE;
}
else
{
if (i != 0)
{
write_endpoint_buff(1, i, Control_Data.pData + Control_Data.wCount);
Control_Data.wCount += i;
bEPPflags.bits.control_state = USB_IDLE; //== 发送完后
}
else
{
if (i == 0)
{
write_endpoint_buff(1, 0, 0); //== Send zero packet at the end ???
bEPPflags.bits.control_state = USB_IDLE;
}
}
}
return 0;
}
//===============================================================================//
//== 函 数 名:endp1_out
//== 功 能:端点1输出
//== 说 明:
//== 时 间:2008.8.13 创建函数
//== 入口参数:无
//== 返 回 值:0
//===============================================================================//
unsigned char endp1_out(void)
{
#ifdef __DEBUG__ //== 打印调试信息
Print_Msg("Runing endp1_out()!\r\n");
#endif
D12_last_status.Register = read_last_status(2); //== Clear interrupt flag
Print_Msg("端点1输出................................\r\n");
return 0;
}
//===============================================================================//
//== 函 数 名:endp1_in
//== 功 能:端点1输入
//== 说 明:
//== 时 间:2008.8.13 创建函数
//== 入口参数:无
//== 返 回 值:0
//===============================================================================//
unsigned char endp1_in(void)
{
unsigned char code buff[8] = {1,8,3,4,5,6,7,8,};
#ifdef __DEBUG__ //== 打印调试信息
Print_Msg("Runing endp1_in()!\r\n");
#endif
D12_last_status.Register = read_last_status(3); //== Clear interrupt flag
Print_Msg("端点1输入................................\r\n");
write_endpoint_buff(3, 8, buff);
return 0;
}
//===============================================================================//
//== 函 数 名:endp2_out
//== 功 能:端点2输出
//== 说 明:
//== 时 间:2008.8.13 创建函数
//== 入口参数:无
//== 返 回 值:0
//===============================================================================//
unsigned char endp2_out(void)
{
unsigned char i, j;
unsigned char buffer[10];
#ifdef __DEBUG__ //== 打印调试信息
Print_Msg("Runing endp2_out()!\r\n");
#endif
D12_last_status.Register = read_last_status(4); //== Clear interrupt flag
bEPPflags.bits.usb_endp2_out = 1;
j = read_main_endpoint_buff(buffer);
#ifdef __DEBUG__ //== 打印调试信息
Print_Msg("端点2输出................................\r\n");
Print_Msg(" 端点2的数据是:");
Print_Msg("!\r\n");
for (i=0; i<j; i+=8)
{
Print_Hex(buffer, 8);
Print_Msg(" ");
if ((i%16)==0) Print_Msg("!\r\n");
}
Print_Msg("!\r\n");
#endif
return 0;
}
//===============================================================================//
//== 函 数 名:endp2_in
//== 功 能:主端点输入处理
//== 说 明:
//== 时 间:2008.8.13 创建函数
//== 入口参数:无
//== 返 回 值:0
//===============================================================================//
unsigned char endp2_in(void)
{
// unsigned char i;
unsigned char code buff[64] = {1,21,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,
22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,
41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,
60,61,62,63,64};
#ifdef __DEBUG__ //== 打印调试信息
Print_Msg("Runing endp2_in()!\r\n");
#endif
#ifdef __DEBUG__ //== 打印调试信息
Print_Msg("端点2输入................................\r\n");
#endif
bEPPflags.bits.usb_endp2_in = 1;
D12_last_status.Register = read_last_status(5); //== Clear interrupt flag
// for (i=0; i<8; i++)
// usb_transmit_buf[i] = i;
// usb_transmit_buf[0] = 0x01;
// usb_transmit_buf[1] = 0x08;
// write_endpoint_buff(5, 8, usb_transmit_buf);
write_endpoint_buff(5, 64, buff);
return 0;
}
//===============================================================================//
//== 函 数 名:D12_isr
//== 功 能:D12 中断处理
//== 说 明:
//== 时 间:2008.8.20 创建函数
//== 入口参数:无
//== 返 回 值:0
//===============================================================================//
unsigned char D12_isr(void)
{
Print_Msg("\r\n");
bEPPflags.bits.int_isr = 1;
read_interrupt_register();
if (D12_interrupt_register.int_Register != 0)
{
if (D12_interrupt_register.Interrupt.bus_reset) //== usb 总线复位
{
usb_bus_reset();
}
else
{
if (D12_interrupt_register.Interrupt.DMA_EOT) //== dma 传输
{
//dma_eot();
}
if (D12_interrupt_register.Interrupt.suspend_change) //== 总线挂起
{
usb_bus_suspend();
}
if (D12_interrupt_register.Interrupt.control_in_port) //== 控制端点0输入
{
endp0_in();
}
if (D12_interrupt_register.Interrupt.control_out_port) //== 控制端点0输出
{
endp0_out();
}
if (D12_interrupt_register.Interrupt.port_in_1) //== 端点1输入
{
endp1_in();
}
if (D12_interrupt_register.Interrupt.port_out_1) //== 端点1输出
{
endp1_out();
}
if (D12_interrupt_register.Interrupt.main_in_port) //== 端点2输入
{
endp2_in();
}
if (D12_interrupt_register.Interrupt.main_out_port) //== 端点2输出
{
endp2_out();
}
}
}
bEPPflags.bits.int_isr = 0;
return 0;
}
//===============================================================================//
//== 函 数 名:usb_init
//== 功 能:D12 初始化
//== 说 明:
//== 时 间:2008.8.13 创建函数
//== 入口参数:无
//== 返 回 值:0
//===============================================================================//
unsigned char usb_init(void)
{
#ifdef __DEBUG__ //== 打印调试信息
Print_Msg("Init D12!\r\n");
#endif
disconnect_usb(); //== 断开USB连接
init_usb(); //== 初始化USB芯片
D12_ReadChipID();
connect_usb(); //== 连接USB
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -