■ CDCを使ったUSB-UART変換プログラムの例について
PIC18F2550や4550などのUSB機能内蔵のPICを使って、USBとUARTを相互に変換するプログラムのプロクラム例を紹介しています。 UART側は割込を使用してUART受信が発生すると直ちにUARTから受信してUSBOUT命令でUSB側にデータを送信します。USB側からの受信に対してはループによって待機し、受信後HSEROUT命令でUART側にデータを送ります。
サンプル例ではPIC18F2550を使用しています。動作周波数はOSC1-OSC2に外部から12MHzのクロックを供給し内部で4xPLLで4逓倍して48MHz動作としています。UARTの通信速度は9600bpsです。CDCについても同様に9600bpsです。
※本FAQのCGIの都合上正しくTABやスペースが入らないため、見にくい場合にはお手数ですが下記からソースコードのzipファイルを入手してください。
http://www.microtechnica.tv/support/software/usb-uartpbpexe.zip
-------------------------------------------- #CONFIG CONFIG WDT = OFF ;WDT disabled (enabled by SWDTEN bit) CONFIG VREGEN = ON ;USB Voltage Regulator Enable CONFIG PLLDIV = 3 ;Divide by 3 (12 MHz oscillator input) CONFIG STVREN = ON ;stack overflow/underflow reset enabled CONFIG XINST = OFF ;Extended instruction set disabled CONFIG CPUDIV = OSC1_PLL2 ;No CPU system clock divide CONFIG USBDIV = 2 ;Clock source from 96MHz PLL/2 CONFIG CP0 = OFF ;Program memory is not code-protected CONFIG FOSC = HSPLL_HS ;HS+PLL oscillator CONFIG FCMEN = OFF ;Fail-Safe Clock Monitor disabled CONFIG IESO = OFF ;Two-Speed Start-up disabled CONFIG WDTPS = 32768 ;1:32768 CONFIG LVP = OFF ;Low Voltage ICSP CONFIG PBADEN = OFF ;PortB<4:0> pins are configured as digital #ENDCONFIG
Include "cdc_desc.bas" DEFINE OSC 48 DEFINE HSER_BAUD 9600 DEFINE HSER_CLROERR 1
ucfg = %00010100 'enable internal USB pull-up, Full speed USB
BufferRX var Byte[16] cnt Var Byte B0 VAR BYTE
init: ADCON1 = 15 CMCON = 7
INTCON2.7 = 1 'Disable PortB Pullups
RCON.7 = 0 INTCON.4 = 0 ' Disable INT0 (PORTB.0) INTCON3.3 = 0 ' Disable INT1 (PORTB.1) INTCON3.4 = 0 ' Disable INT2 (PORTB.2) INTCON.5 = 0 ' Disable TMR0 (Timmer 0) INTCON.6 = 1 ' Enable Peripheral Interrupts INTCON.7 = 1 ' Enable Global Interrupt Handler PIE1.4 = 0 ' Disable USART Transmit Interrupt PIE1.5 = 1 ' Enable USART Receive Interrupt PIE2.5 = 0 ' Disable USB Interrupt
usb_init:
USBInit pause 1000 USBService
ON INTERRUPT GOTO Main_Interrupt_Handler ENABLE INTERRUPT
mainloop: USBService cnt = 16 USBIn 3, BufferRX, Cnt, MainLoop
HSEROUT [STR BufferRX\Cnt] 'gosub usbtx goto mainLoop
usbtx: USBService USBOut 3, BufferRX, Cnt, usbtx pause 50 return
'----------------------------------------- DISABLE INTERRUPT Main_Interrupt_Handler:
IF PIR1.4 = 1 THEN PIR1.4 = 0 ENDIF
IF PIR1.5 = 1 THEN HSERIN [B0] BufferRX[0] = B0 Cnt = 1
OutLoop: USBService ' Must service USB regularly USBOut 3, BufferRX, Cnt, OutLoop PIR1.5 = 0 ENDIF
IntDone: RESUME
ENABLE INTERRUPT END
|