📄 usbtors232_sk_eng.asm
字号:
;***************************************************************************
;* U S B S T A C K F O R T H E A V R F A M I L Y
;*
;* File Name :"USBtoRS232.asm"
;* Title :AVR309:USB to UART protocol converter
;* Date :01.02.2004
;* Version :2.8
;* Target MCU :ATmega8
;* AUTHOR :Ing. Igor Cesko
;* Slovakia
;* cesko@internet.sk
;* http://www.cesko.host.sk
;*
;* DESCRIPTION:
;* USB protocol implementation into MCU with noUSB interface:
;* Device:
;* Universal USB interface (3x8-bit I/O port + RS232 serial line + EEPROM)
;* + added RS232 FIFO buffer
;*
;* The timing is adapted for 12 MHz crystal
;*
;*
;* to add your own functions - see section: TEMPLATE OF YOUR FUNCTION
;*
;* to customize device to your company you must change VendorUSB ID (VID)
;* to VID assigned to your company (for more information see www.usb.org)
;*
;***************************************************************************
.include "m8def.inc"
;comment for AT90S2313
.equ UCR =UCSRB
.equ UBRR =UBRRL
.equ EEAR =EEARL
.equ USR =UCSRA
.equ E2END =127
.equ RAMEND128 =96+127
.equ inputport =PINB
.equ outputport =PORTB
.equ USBdirection =DDRB
.equ DATAplus =1 ;signal D+ na PB1 ;ENG;signal D+ on PB1
.equ DATAminus =0 ;signal D- na PB0 - treba dat na tento pin pull-up 1.5kOhm ;ENG;signal D- on PB0 - give on this pin pull-up 1.5kOhm
.equ USBpinmask =0b11111100 ;mask low 2 bits (D+,D-) on PB ;ENG;mask low 2 bit (D+,D-) on PB
.equ USBpinmaskDplus =~(1<<DATAplus) ;mask D+ bit on PB ;ENG;mask D+ bit on PB
.equ USBpinmaskDminus =~(1<<DATAminus);mask D- bit on PB ;ENG;mask D- bit on PB
.equ TSOPPort =PINB
.equ TSOPpullupPort =PORTB
.equ TSOPPin =2 ;signal OUT z IR senzora TSOP1738 na PB2 ;ENG;signal OUT from IR sensor TSOP1738 on PB2
;.equ LEDPortLSB =PORTD ;pripojenie LED diod LSB ;ENG;connecting LED diode LSB
;.equ LEDPinLSB =PIND ;pripojenie LED diod LSB (vstup) ;ENG;connecting LED diode LSB (input)
;.equ LEDdirectionLSB =DDRD ;vstup/vystup LED LSB ;ENG;input/output LED LSB
;.equ LEDPortMSB =PORTB ;pripojenie LED diod MSB ;ENG;connecting LED diode MSB
;.equ LEDPinMSB =PINB ;pripojenie LED diod MSB (vstup) ;ENG;connecting LED diode MSB (input)
;.equ LEDdirectionMSB =DDRB ;vstup/vystup LED MSB ;ENG;input/output LED MSB
;.equ LEDlsb0 =3 ;LED0 na pin PD3 ;ENG;LED0 on pin PD3
;.equ LEDlsb1 =5 ;LED1 na pin PD5 ;ENG;LED1 on pin PD5
;.equ LEDlsb2 =6 ;LED2 na pin PD6 ;ENG;LED2 on pin PD6
;.equ LEDmsb3 =3 ;LED3 na pin PB3 ;ENG;LED3 on pin PB3
;.equ LEDmsb4 =4 ;LED4 na pin PB4 ;ENG;LED4 on pin PB4
;.equ LEDmsb5 =5 ;LED5 na pin PB5 ;ENG;LED5 on pin PB5
;.equ LEDmsb6 =6 ;LED6 na pin PB6 ;ENG;LED6 on pin PB6
;.equ LEDmsb7 =7 ;LED7 na pin PB7 ;ENG;LED7 on pin PB7
.equ SOPbyte =0b10000000 ;Start of Packet byte ;ENG;Start of Packet byte
.equ DATA0PID =0b11000011 ;PID pre DATA0 pole ;ENG;PID for DATA0 field
.equ DATA1PID =0b01001011 ;PID pre DATA1 pole ;ENG;PID for DATA1 field
.equ OUTPID =0b11100001 ;PID pre OUT pole ;ENG;PID for OUT field
.equ INPID =0b01101001 ;PID pre IN pole ;ENG;PID for IN field
.equ SOFPID =0b10100101 ;PID pre SOF pole ;ENG;PID for SOF field
.equ SETUPPID =0b00101101 ;PID pre SETUP pole ;ENG;PID for SETUP field
.equ ACKPID =0b11010010 ;PID pre ACK pole ;ENG;PID for ACK field
.equ NAKPID =0b01011010 ;PID pre NAK pole ;ENG;PID for NAK field
.equ STALLPID =0b00011110 ;PID pre STALL pole ;ENG;PID for STALL field
.equ PREPID =0b00111100 ;PID pre PRE pole ;ENG;PID for FOR field
.equ nSOPbyte =0b00000001 ;Start of Packet byte - opacne poradie ;ENG;Start of Packet byte - reverse order
.equ nDATA0PID =0b11000011 ;PID pre DATA0 pole - opacne poradie ;ENG;PID for DATA0 field - reverse order
.equ nDATA1PID =0b11010010 ;PID pre DATA1 pole - opacne poradie ;ENG;PID for DATA1 field - reverse order
.equ nOUTPID =0b10000111 ;PID pre OUT pole - opacne poradie ;ENG;PID for OUT field - reverse order
.equ nINPID =0b10010110 ;PID pre IN pole - opacne poradie ;ENG;PID for IN field - reverse order
.equ nSOFPID =0b10100101 ;PID pre SOF pole - opacne poradie ;ENG;PID for SOF field - reverse order
.equ nSETUPPID =0b10110100 ;PID pre SETUP pole - opacne poradie ;ENG;PID for SETUP field - reverse order
.equ nACKPID =0b01001011 ;PID pre ACK pole - opacne poradie ;ENG;PID for ACK field - reverse order
.equ nNAKPID =0b01011010 ;PID pre NAK pole - opacne poradie ;ENG;PID for NAK field - reverse order
.equ nSTALLPID =0b01111000 ;PID pre STALL pole - opacne poradie ;ENG;PID for STALL field - reverse order
.equ nPREPID =0b00111100 ;PID pre PRE pole - opacne poradie ;ENG;PID for FOR field - reverse order
.equ nNRZITokenPID =~0b10000000 ;PID maska pre Token paket (IN,OUT,SOF,SETUP) - opacne poradie NRZI ;ENG;PID mask for Token packet (IN,OUT,SOF,SETUP) - reverse order NRZI
.equ nNRZISOPbyte =~0b10101011 ;Start of Packet byte - opacne poradie NRZI ;ENG;Start of Packet byte - reverse order NRZI
.equ nNRZIDATA0PID =~0b11010111 ;PID pre DATA0 pole - opacne poradie NRZI ;ENG;PID for DATA0 field - reverse order NRZI
.equ nNRZIDATA1PID =~0b11001001 ;PID pre DATA1 pole - opacne poradie NRZI ;ENG;PID for DATA1 field - reverse order NRZI
.equ nNRZIOUTPID =~0b10101111 ;PID pre OUT pole - opacne poradie NRZI ;ENG;PID for OUT field - reverse order NRZI
.equ nNRZIINPID =~0b10110001 ;PID pre IN pole - opacne poradie NRZI ;ENG;PID for IN field - reverse order NRZI
.equ nNRZISOFPID =~0b10010011 ;PID pre SOF pole - opacne poradie NRZI ;ENG;PID for SOF field - reverse order NRZI
.equ nNRZISETUPPID =~0b10001101 ;PID pre SETUP pole - opacne poradie NRZI ;ENG;PID for SETUP field - reverse order NRZI
.equ nNRZIACKPID =~0b00100111 ;PID pre ACK pole - opacne poradie NRZI ;ENG;PID for ACK field - reverse order NRZI
.equ nNRZINAKPID =~0b00111001 ;PID pre NAK pole - opacne poradie NRZI ;ENG;PID for NAK field - reverse order NRZI
.equ nNRZISTALLPID =~0b00000111 ;PID pre STALL pole - opacne poradie NRZI ;ENG;PID for STALL field - reverse order NRZI
.equ nNRZIPREPID =~0b01111101 ;PID pre PRE pole - opacne poradie NRZI ;ENG;PID for FOR field - reverse order NRZI
.equ nNRZIADDR0 =~0b01010101 ;Adresa = 0 - opacne poradie NRZI ;ENG;Address = 0 - reverse order NRZI
;stavove byty - State ;ENG;status bytes - State
.equ BaseState =0 ;
.equ SetupState =1 ;
.equ InState =2 ;
.equ OutState =3 ;
.equ SOFState =4 ;
.equ DataState =5 ;
.equ AddressChangeState =6 ;
;Flagy pozadovanej akcie ;ENG;Flags of action
.equ DoNone =0
.equ DoReceiveOutData =1
.equ DoReceiveSetupData =2
.equ DoPrepareOutContinuousBuffer =3
.equ DoReadySendAnswer =4
.equ CRC5poly =0b00101 ;CRC5 polynom ;ENG;CRC5 polynomial
.equ CRC5zvysok =0b01100 ;CRC5 zvysok po uspesnom CRC5 ;ENG;CRC5 remainder after successful CRC5
.equ CRC16poly =0b1000000000000101 ;CRC16 polynom ;ENG;CRC16 polynomial
.equ CRC16zvysok =0b1000000000001101 ;CRC16 zvysok po uspesnom CRC16 ;ENG;CRC16 remainder after successful CRC16
.equ MAXUSBBYTES =14 ;maximum bytes in USB input message ;ENG;maximum bytes in USB input message
.equ NumberOfFirstBits =10 ;kolko prvych bitov moze byt dlhsich ;ENG;how many first bits allowed be longer
.equ NoFirstBitsTimerOffset =256-12800*12/1024 ;Timeout 12.8ms (12800us) na ukoncenie prijmu po uvodnych bitoch (12Mhz:clock, 1024:timer predivider, 256:timer overflow value) ;ENG;Timeout 12.8ms (12800us) to terminate after firsts bits
.equ InitBaudRate =12000000/16/57600-1 ;nastavit vysielaciu rychlost UART-u na 57600 (pre 12MHz=12000000Hz) ;ENG;UART on 57600 (for 12MHz=12000000Hz)
.equ InputBufferBegin =RAMEND128-127 ;zaciatok prijimacieho shift buffera ;ENG;compare of receiving shift buffer
.equ InputShiftBufferBegin =InputBufferBegin+MAXUSBBYTES ;zaciatok prijimacieho buffera ;ENG;compare of receiving buffera
.equ MyInAddressSRAM =InputShiftBufferBegin+MAXUSBBYTES
.equ MyOutAddressSRAM =MyInAddressSRAM+1
.equ OutputBufferBegin =RAMEND128-MAXUSBBYTES-2 ;zaciatok vysielacieho buffera ;ENG;compare of transmitting buffer
.equ AckBufferBegin =OutputBufferBegin-3 ;zaciatok vysielacieho buffera Ack ;ENG;compare of transmitting buffer Ack
.equ NakBufferBegin =AckBufferBegin-3 ;zaciatok vysielacieho buffera Nak ;ENG;compare of transmitting buffer Nak
.equ ConfigByte =NakBufferBegin-1 ;0=unconfigured state ;ENG;0=unconfigured state
.equ AnswerArray =ConfigByte-8 ;8 byte answer array ;ENG;8 byte answer array
.equ StackBegin =AnswerArray-1 ;spodok zasobnika (stack je velky cca 68 bytov) ;ENG;low reservoir (stack is big cca 68 byte)
.equ MAXRS232LENGTH =RAMEND-RAMEND128-10 ;maximalna dlzka RS232 kodu ;ENG;maximum length RS232 code
.equ RS232BufferBegin =RAMEND128+1 ;zaciatok buffera pre RS232 prijem ;ENG;compare of buffer for RS232 - receiving
.equ RS232BufferEnd =RS232BufferBegin+MAXRS232LENGTH
.equ RS232ReadPosPtr =RS232BufferBegin+0
.equ RS232WritePosPtr =RS232BufferBegin+2
.equ RS232LengthPosPtr =RS232BufferBegin+4
.equ RS232Reserved =RS232BufferBegin+6
.equ RS232FIFOBegin =RS232BufferBegin+8
.def RS232BufferFull =R1 ;priznak plneho RS232 buffera ;ENG;flag of full RS232 buffer
.def backupbitcount =R2 ;zaloha bitcount registra v INT0 preruseni ;ENG;backup bitcount register in INT0 disconnected
.def RAMread =R3 ;ci sa ma citat zo SRAM-ky ;ENG;if reading from SRAM
.def backupSREGTimer =R4 ;zaloha Flag registra v Timer interrupte ;ENG;backup Flag register in Timer interrupt
.def backupSREG =R5 ;zaloha Flag registra v INT0 preruseni ;ENG;backup Flag register in INT0 interrupt
.def ACC =R6 ;accumulator ;ENG;accumulator
.def lastBitstufNumber =R7 ;pozicia bitstuffingu ;ENG;position in bitstuffing
.def OutBitStuffNumber =R8 ;kolko bitov sa ma este odvysielat z posledneho bytu - bitstuffing ;ENG;how many bits to send last byte - bitstuffing
.def BitStuffInOut =R9 ;ci sa ma vkladat alebo mazat bitstuffing ;ENG;if insertion or deleting of bitstuffing
.def TotalBytesToSend =R10 ;kolko sa ma poslat bytov ;ENG;how many bytes to send
.def TransmitPart =R11 ;poradove cislo vysielacej casti ;ENG;order number of transmitting part
.def InputBufferLength =R12 ;dlzka pripravena vo vstupnom USB bufferi ;ENG;length prepared in input USB buffer
.def OutputBufferLength =R13 ;dlzka odpovede pripravena v USB bufferi ;ENG;length answers prepared in USB buffer
.def MyOutAddress =R14 ;moja USB adresa (Out Packet) ;ENG;my USB address (Out Packet) for update
.def MyInAddress =R15 ;moja USB adresa (In/SetupPacket) ;ENG;my USB address (In/SetupPacket)
.def ActionFlag =R16 ;co sa ma urobit v hlavnej slucke programu ;ENG;what to do in main program loop
.def temp3 =R17 ;temporary register ;ENG;temporary register
.def temp2 =R18 ;temporary register ;ENG;temporary register
.def temp1 =R19 ;temporary register ;ENG;temporary register
.def temp0 =R20 ;temporary register ;ENG;temporary register
.def bitcount =R21 ;counter of bits in byte ;ENG;counter of bits in byte
.def ByteCount =R22 ;pocitadlo maximalneho poctu prijatych bajtov ;ENG;counter of maximum number of received bytes
.def inputbuf =R23 ;prijimaci register ;ENG;receiver register
.def shiftbuf =R24 ;posuvny prijimaci register ;ENG;shift receiving register
.def State =R25 ;byte stavu stavoveho stroja ;ENG;state byte of status of state machine
.def RS232BufptrX =R26 ;XL register - pointer do buffera prijatych IR kodov ;ENG;XL register - pointer to buffer of received IR codes
.def RS232BufptrXH =R27
.def USBBufptrY =R28 ;YL register - pointer do USB buffera input/output ;ENG;YL register - pointer to USB buffer input/output
.def ROMBufptrZ =R30 ;ZL register - pointer do buffera ROM dat ;ENG;ZL register - pointer to buffer of ROM data
;poziadavky na deskriptory ;ENG;requirements on descriptors
.equ GET_STATUS =0
.equ CLEAR_FEATURE =1
.equ SET_FEATURE =3
.equ SET_ADDRESS =5
.equ GET_DESCRIPTOR =6
.equ SET_DESCRIPTOR =7
.equ GET_CONFIGURATION =8
.equ SET_CONFIGURATION =9
.equ GET_INTERFACE =10
.equ SET_INTERFACE =11
.equ SYNCH_FRAME =12
;typy deskriptorov ;ENG;descriptor types
.equ DEVICE =1
.equ CONFIGURATION =2
.equ STRING =3
.equ INTERFACE =4
.equ ENDPOINT =5
;databits ;ENG;databits
.equ DataBits5 =0
.equ DataBits6 =1
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -