INT8U UsbInitialize(void)<br />{<br /> UsbInitHareware();<br /> bEPPflags.value = 0; /* 置USB事件标志为0 set USB event flags to zero */<br /> <br /> if (UsbReadTestRegister() != 0xa50f) //read test register<br /> {<br /> return 1;<br /> }<br /> UsbDeviceIntConfig();<br /> UsbConfigEndpoint();<br /> UsbSetMode(0x00); //generate interrupt<br /> ReConnectUsb();<br /> return 0;<br />}<br /><br />void UsbMidiSystemConstruct(void)<br />{<br /> g_UsbMidiErr = UsbInitialize();<br /> g_UsbMidiOutBusy = USBOUT_IDLE;<br /><br /> //InitUsbIntrrupt();<br />}<br /><br />void Ep2RxDone(void)<br />{<br /> INT8U len;<br /> INT8U class;<br /> INT8U i;<br /> <br /> UsbSelectClrIntEndpoint(4);<br /> i = 0;<br /> len = UsbReadEndpoint(4, sizeof(g_EpBuf), g_EpBuf);<br /> class = g_EpBuf[0] & 0x0f;<br /> <br /> if ( (len != 0) && (class >= 0x04) && (class < 0x0f) )<br /> {<br /> bEPPflags.bits.ep2_rxdone = 1; /* 标识该端点收到数据 flag endpoint received data */<br /> do <br /> {<br /> g_UsbMidiInBuffer[g_UsbMidiInTail][0] = g_EpBuf[i++];<br /> g_UsbMidiInBuffer[g_UsbMidiInTail][1] = g_EpBuf[i++];<br /> g_UsbMidiInBuffer[g_UsbMidiInTail][2] = g_EpBuf[i++];<br /> g_UsbMidiInBuffer[g_UsbMidiInTail][3] = g_EpBuf[i++];<br /> g_UsbMidiInMessages++;<br /> g_UsbMidiInTail++;<br /> if (g_UsbMidiInTail == USB_MIDIIN_SIZE)<br /> {<br /> g_UsbMidiInTail = 0;<br /> }<br /> if (i < len)<br /> {<br /> class = g_EpBuf & 0x0f;<br /> }<br /> else<br /> {<br /> break;<br /> }<br /> }while((class >= 0x04) && (class < 0x0f));<br /> }<br />}<br /><br /><br />void Usb_LPService(void)<br />{<br /> INT32U ep_st;<br /> ep_st = USBEpIntSt; /* 读端点中断状态寄存器 read endpoint interrupt status register */<br /> if(ep_st & USB_ENDP00)<br /> {<br /> Ep0RxDone(); /* 控制端点接收数据处理 process controll endpoint receive data */<br /> }<br /> if(ep_st & USB_ENDP01)<br /> {<br /> Ep0TxDone(); /* 控制端点发送数据处理 process controll endpoint transmit data */<br /> }<br /> if(ep_st & USB_ENDP04)<br /> {<br /> Ep2RxDone(); /* 逻辑端点2接收数据处理 process logic endpoint 2 receive data */ <br /> }<br /> if(ep_st & USB_ENDP05) <br /> {<br /> Ep2TxDone(); /* 逻辑端点2发送数据处理 process logic endpoint 2 transmit data */ <br /> } <br /> USBDevIntClr = SLOWINTERRUPT;<br />}<br /><br />void SendUsbMidiOutEvent(void)<br />{<br /> INT8U usbbuf[4];<br /> INT8U i;<br /> if ( (g_UsbMidiErr) || (g_UsbMidiBulkOkCounter < 100) )<br /> {<br /> return;<br /> }<br /> <br /> if ((MidiByte1 & 0xf0) == 0xc0)<br /> {<br /> MidiByte3 = 0;<br /> }<br /> usbbuf[0] = (MidiByte1 >> 4) & 0x0f;<br /> usbbuf[1] = MidiByte1;<br /> usbbuf[2] = MidiByte2;<br /> usbbuf[3] = MidiByte3;<br /><br /> if (g_UsbMidiOutBusy == USBOUT_BUSY)<br /> {<br /> for (i = 0; i < 4; i++)<br /> {<br /> g_UsbMidiOutBuffer[g_UsbMidiInTail] = usbbuf;<br /> }<br /> OS_ENTER_CRITICAL();<br /> g_UsbMidiOutMessages++;<br /> OS_EXIT_CRITICAL();<br /> g_UsbMidiInTail++;<br /> if (g_UsbMidiInTail == USB_MIDIOUT_SIZE)<br /> {<br /> g_UsbMidiInTail = 0; <br /> }<br /> }<br /> else<br /> {<br /> OS_ENTER_CRITICAL();<br /> g_UsbMidiOutBusy = USBOUT_BUSY;<br /> g_UsbMidiTimeOut = 0; <br /> OS_EXIT_CRITICAL();<br /> UsbWriteEndpoint(5, 4, usbbuf);<br />/* for (i = 0; i < 200; i++)<br /> {<br /> ;<br /> }<br />*/ <br /> <br /> }<br />}<br /><br /><br />主程序不断调用SendUsbMidiOutEvent()上传消息,用PC上位机软件,监视上传消息,总是在不确定时刻就停止了上传消息.此时把g_UsbMidiOutBusy信号量强制等于USBOUT_IDLE(停止时显然没有来发送中断,清除该信号),使得再次发送,但是仍然没有数据上传,并且也不再产生发送中断.
|