⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 usbtors232_sk_eng.asm

📁 USB技术大全-54.8M.zip
💻 ASM
📖 第 1 页 / 共 5 页
字号:
;***************************************************************************
;* 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 + -