📄 d12.c
字号:
void get_report(void)
{
;
}
void get_protocol(void)
{
single_transmit(&protocol,1);
}
void set_idle(void)
{
single_transmit(0,0);
idle=control_data.DeviceRequest.wValue;
}
void set_report(void)
{
;
}
void set_protocol(void)
{
single_transmit(0,0);
protocol=control_data.DeviceRequest.wValue;
}
void (* ClassRequest[])(void) =
{
reserved,
get_report,
get_idle,
get_protocol,
reserved,
reserved,
reserved,
reserved,
reserved,
set_report,
set_idle,
set_protocol,
reserved,
reserved,
reserved,
reserved,
};
//*************************************************************************************************
//函数指针。。。
//*************************************************************************************************
void control_handler()
{
uint8 type,receiver,reg;
type = control_data.DeviceRequest.bmRequestType&USB_REQUEST_TYPE_MASK;
receiver = control_data.DeviceRequest.bmRequestType&USB_REQUEST_MASK;
reg = control_data.DeviceRequest.bRequest&USB_REQUEST_MASK;
if(type == USB_STANDARD_REQUEST)
{
if(receiver == 0) //到设备
(*StandardDeviceRequest[reg])();
else
if(receiver == 1) //到接口
(*StandardDeviceRequest[reg])();
else
if(receiver == 2) //到端点
{
if(control_data.DeviceRequest.bRequest==0)
get_status();
}
}
else
if(type == USB_CLASS_REQUEST)
{
if(receiver == 0) //到设备
(*ClassRequest[reg])();
else
if(receiver == 1) //到接口
(*ClassRequest[reg])();
else
if(receiver == 2) //到端点
{
if(control_data.DeviceRequest.bRequest==0)
get_status();
}
}
// else
// if(type == USB_VENDOR_REQUEST)
// (*VendorDeviceRequest[reg])();
else
stall_ep0();
//else
//{
// D12_Endpoint_select(1);
// single_transmit(0, 0);
//}
}
//*************************************************************************************************
//中断服务程序
//*************************************************************************************************
//********
//子程序
//********
//端点0 OUT中断
void ep0_rxdone(void)
{
//uint8 ep_status;
uint8 i;
uint8 ep_last_status;
uint8 req[sizeof(DEVICE_REQUEST)];
ep_last_status = D12_read_last_status_reg(0); //读最后状态寄存器
if(ep_last_status&D12_SETUP_PACKET) //等于则为设置包
{
control_data.wLength = 0;
control_data.wCount = 0; //假如长度有误,则停止
if(D12_read_Endpoint(0,sizeof(control_data.DeviceRequest),req)!= sizeof(DEVICE_REQUEST))
{
D12_set_Endpoint_status(0, 1); //停止控制端点0
D12_set_Endpoint_status(1, 1); //停止控制端点1
event_flag.bits.control_state = USB_IDLE; //设置为等待状态
return;
}
control_data.DeviceRequest.bmRequestType = req[0];
control_data.DeviceRequest.bRequest = req[1];
control_data.DeviceRequest.wValue = req[3] * 256 + req[2];
control_data.DeviceRequest.wIndex = req[5] * 256 + req[4];
control_data.DeviceRequest.wLength = req[7] * 256 + req[6];
D12_ack_Endpoint(0); //应答
D12_ack_Endpoint(1); //应答
//D12_Endpoint_select(0);
//D12_clear_buff();
control_data.wLength = control_data.DeviceRequest.wLength; //取出要传输数据的总字节数
control_data.wCount = 0;
if(control_data.DeviceRequest.bmRequestType&(uint8 )USB_ENDPOINT_DIRECTION_MASK) //为输入
{
event_flag.bits.setup_packet = 1;
event_flag.bits.control_state = USB_TRANSMIT; //发送态
}
else //否则为输出
{
if(control_data.wLength == 0)
{
event_flag.bits.setup_packet = 1;
event_flag.bits.control_state = USB_IDLE; //长度为0,则停止态
}
else
{
if(control_data.wLength>MAX_CONTROL_DATA_SIZE)
{
event_flag.bits.control_state = USB_IDLE; //长度为0,则停止态
D12_set_Endpoint_status(0,1); //停止端点
D12_set_Endpoint_status(1,1); //停止端点
}
else
{
event_flag.bits.control_state = USB_RECEIVE; //接收态
}
}
}
}
///////////////////////////////////////////////////////////////////////////////////////
else //否则为普通接收状态
if (event_flag.bits.control_state == USB_RECEIVE) //如果为接收状态
{
i = D12_read_Endpoint(0, EP0_PACKET_SIZE,
control_data.dataBuffer + control_data.wCount); //从端点0接收数据
control_data.wCount += i; //统计已接收的字节数
if( i != EP0_PACKET_SIZE || control_data.wCount >= control_data.wLength)
{ //数据接收完毕
event_flag.bits.setup_packet = 1; //通知control_handler()处理Setup包
event_flag.bits.control_state = USB_IDLE; //设置为等待状态
}
}
else //不为输入也不为输出
{
event_flag.bits.control_state = USB_IDLE; //设置等待状态
//D12_Endpoint_select(0);
//D12_clear_buff();
}
}
//端点0 IN中断
void ep0_txdone(void)
{
uint16 i;
i = control_data.wLength - control_data.wCount; //计算未发送的字节数
D12_read_last_status_reg(1);
if(event_flag.bits.control_state != USB_TRANSMIT) //非发送状态,返回
return;
if(i>= EP0_PACKET_SIZE) //剩下数据大于16B,发送16B
{
D12_write_Endpoint(1,EP0_PACKET_SIZE,control_data.pData + control_data.wCount);
control_data.wCount += EP0_PACKET_SIZE;
event_flag.bits.control_state = USB_TRANSMIT; //设置传输态
}
else
if(i != 0) //发送剩下数据
{
D12_write_Endpoint(1,i,control_data.pData + control_data.wCount);
control_data.wCount += i;
event_flag.bits.control_state = USB_IDLE; //设置等待态
}
else
if(i == 0) //发送完毕,发送0B
{
D12_write_Endpoint(1,0,0);
event_flag.bits.control_state = USB_IDLE; //设置等待态
}
}
//端点1 IN中断
void ep1_txdone(void)
{
D12_read_last_status_reg(3);
}
//端点1 OUT中断
void ep1_rxdone(void)
{
uint8 len;
D12_read_last_status_reg(2);
len = D12_read_Endpoint(2,sizeof(GenEpBuf),GenEpBuf);
if(len != 0)
event_flag.bits.ep1_rxdone = 1;
}
//主端点 IN控制
extern void scan_key(void);
void main_txdone(void)
{
D12_read_last_status_reg(5);
}
//主端点 OUT控制
void main_rxdone(void)
{
uint8 len,ep_status;
D12_read_last_status_reg(4);
ep_status = D12_read_Endpoint_status(4);
ep_status &= 0x60;
//接收数据
len = D12_read_Endpoint(4,64,EpBuf);
if(ep_status == 0x60)
len = D12_read_Endpoint(4,64,EpBuf);
}
//DMA结束处理
void dma_eot(void)
{
}
//********
//中断程序
//********
//D12外部中断0中断服务程序
void __irq D12_EINT0(void)
{
uint16 isr_status;
DISABLE();
isr_status = D12_read_interrupt_reg(); //读中断寄存器,清6-15位
event_flag.bits.usb_isr = 1;
/*
switch(isr_status)
{
case 0x01: ep0_rxdone();
break;
case 0x02: ep0_txdone();
break;
case 0x04: ep1_rxdone();
break;
case 0x08: ep1_txdone();
break;
case 0x10: main_rxdone();
break;
case 0x20: main_txdone();
break;
case 0x40: event_flag.bits.bus_reset = 1;
break;
case 0x80: event_flag.bits.bus_suspend = 1;
break;
case 0x0100:
break;
default :
break;
}
*/
if(isr_status!=0)
{
if(isr_status&D12_INT_BUSRESET)
event_flag.bits.bus_reset = 1;
if(isr_status&D12_INT_EOT)
dma_eot();
if(isr_status&D12_INT_SUSPENDCHANGE)
event_flag.bits.bus_suspend = 1;
if(isr_status&D12_INT_ENDP0IN)
ep0_txdone();
if(isr_status&D12_INT_ENDP0OUT)
ep0_rxdone();
if(isr_status&D12_INT_ENDP1IN)
ep1_txdone();
if(isr_status&D12_INT_ENDP1OUT)
ep1_rxdone();
if(isr_status&D12_INT_ENDP2IN)
main_txdone();
if(isr_status&D12_INT_ENDP2OUT)
main_rxdone();
}
event_flag.bits.usb_isr = 0;
//以下作调试指示用
/*
if(isr_status == 0x01)UART0_SendByte(0xa0);else
if(isr_status == 0x02)UART0_SendByte(0xa1);else
if(isr_status == 0x04)UART0_SendByte(0xa2);else
if(isr_status == 0x08)UART0_SendByte(0xa3);else
if(isr_status == 0x10)UART0_SendByte(0xa4);else
if(isr_status == 0x20)UART0_SendByte(0xa5);else
if(isr_status == 0x40)UART0_SendByte(0xa6);else
if(isr_status == 0x80)UART0_SendByte(0xa7);else
if(isr_status == 0x0100)UART0_SendByte(0xa8);
else
if(isr_status ==0) UART0_SendByte(0xaa);
else
{
UART0_SendByte(0xbb);
UART0_SendByte(isr_status&0xff);
}
*/
/*
if(isr_status == 0x01){rcv_buf[0]+=1;if(rcv_buf[0]>9)rcv_buf[0]=0;}else
if(isr_status == 0x02){rcv_buf[1]+=1;if(rcv_buf[1]>9)rcv_buf[1]=0;}else
if(isr_status == 0x04){rcv_buf[2]+=1;if(rcv_buf[2]>9)rcv_buf[2]=0;}else
if(isr_status == 0x08){rcv_buf[3]+=1;if(rcv_buf[3]>9)rcv_buf[3]=0;}else
if(isr_status == 0x10){rcv_buf[4]+=1;if(rcv_buf[4]>9)rcv_buf[4]=0;}else
if(isr_status == 0x20){rcv_buf[5]+=1;if(rcv_buf[5]>9)rcv_buf[5]=0;}else
if(isr_status == 0x40){rcv_buf[6]+=1;if(rcv_buf[6]>9)rcv_buf[6]=0;}else
if(isr_status == 0x80){rcv_buf[7]+=1;if(rcv_buf[7]>9)rcv_buf[7]=0;}
//if(isr_status ==0){rcv_buf[1]+=1;if(rcv_buf[1]>9)rcv_buf[1]=0;}
*/
EXTINT = 0x01; //清除外部中断0标志
VICVectAddr = 0x00;
ENABLE();
}
//*************************************************************************************************
//D12初始化
//*************************************************************************************************
//D12外部中断0初始化
void D12_EINT0_init(void)
{
PINSEL1 = (PINSEL1&0xfffffffc)| 0x00000001; //01,EINT0
EXTMODE = EXTMODE&0x0e; //EINT0 电平触发
EXTINT = 0x01; //清除外部中断0标志
VICIntSelect = 0x00000000; //IRQ
VICVectCntl0 = 0x20|14; //通道号14
VICVectAddr0 = (uint32)D12_EINT0;
VICIntEnable |= 1<<14;
VICVectAddr = 0x00; //中断向量地址清空一下
}
//D12初始化
void D12_init(void)
{
//PINSEL0 = 0x00000000; //GPIO 不用设
IO0DIR |= RSTUSB|SUSP; //IO输出
IO0CLR = RSTUSB; //复位
DelayNS(2);
IO0SET = RSTUSB; //正常
IO0CLR = SUSP; //不挂起
USB_reconnect(); //重新连接
USB_init(); //USB相关寄存器初始化
D12_EINT0_init(); //外部中断初始化
}
//*************************************************************************************************
//结束
//*************************************************************************************************
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -