阅读:1147回复:3
请教大侠,FT245BM资料
刚接触usb,老师希望用FT245BM进行pc和单片的通信,但对FT245BM一无所知,希望得到众位大侠的帮助,小妹感激不尽!
|
|
沙发#
发布于:2003-08-09 19:07
可以上google搜一下相关文章
上公司的网站下载datasheet看一下 |
|
板凳#
发布于:2003-08-10 20:15
这个IC简单,你可以把它设想为一个RAM,按照他的时序照做就可以了。只要硬件连接正确,不需要任何操作,就可以实现USB连接。这里有一个例程。
;==================================================================== ;== ;== Program : SMARTM.ASM ;== ;== Device : Microchip PIC device ;== ;== Author : A.J.Dougan - Future Technology Devices International ;== Date : 20.02.01 ;== ;==================================================================== ;== ;== Port connections for smart media ;== ;== ;== PortA 0 o/p RD# usb ;== PortA 1 o/p WR usb ;== PortA 2 o/p WE# mem ;== PortA 3 o/p RE# mem ;== PortA 4 ;== PortA 5 o/p ENABLE \'244 & \'245 and power ;== ;== PortB 0 ;== PortB 1 ;== PortB 2 ;== PortB 3 ;== PortB 4 ;== PortB 5 ;== PortB 6 ;== PortB 7 ;== ;== PortC 0 i/p RXfull# usb ;== PortC 1 i/p TXEmpty# usb ;== PortC 2 i/p R/B# mem ;== PortC 3 o/p ALE mem ;== PortC 4 o/p CLE mem ;== PortC 5 o/p WP# mem ;== PortC 6 i/p WP disk ;== PortC 7 i/p Card present ;== ;== PortD 0 Data0 ;== PortD 1 Data1 ;== PortD 2 Data2 ;== PortD 3 Data3 ;== PortD 4 Data4 ;== PortD 5 Data5 ;== PortD 6 Data6 ;== PortD 7 Data7 ;== ;== ;== ;== LIST P=16F877 include \"P16F877.INC\" ; __CONFIG _RC_OSC|_WDT_OFF|_CP_OFF __CONFIG _HS_OSC|_WDT_OFF|_CP_OFF ; ================================================================ ; Define Symbols ; ================================================================ ByteCntL EQU 20H ByteCntH EQU 21H MStatus EQU 22H MData EQU 23H Command EQU 24H MYCNTL EQU 25H MYCNTH EQU 26H EventChr EQU 27H CardState EQU 28H WaitBusyCntL EQU 29H WaitBusyCntH EQU 2AH SendEvntChr EQU 2BH WBUF EQU 72H PSW EQU 73H ; ================================================================ ; Reset Vector ; ================================================================ ORG 0 GOTO START ; jump to start ; ================================================================ ; Interrupt ; ================================================================ ORG 4 INTSUB MOVWF WBUF MOVF STATUS,W MOVWF PSW INTSUB1 NOP ENDINT MOVF PSW,W MOVWF STATUS SWAPF WBUF,1 SWAPF WBUF,W RETFIE ; ================================================================ ; Subroutines ; ================================================================ ; ================================================================ ; Power Up smart media ; ================================================================ PwrUp BSF PORTA,5 MOVLW 020H MOVWF PORTC ; Set WP# ALE CLE = 100 RETLW 0 ; **** return with 0 ; ================================================================ ; Power Down smart media ; ================================================================ PwrDn MOVLW 000H MOVWF PORTC ; Set WP# ALE CLE = 100 BCF PORTA,5 RETLW 0 ; **** return with 0 ; ================================================================ ; Read up to 64k bytes from SmartMedia ; ================================================================ RdBig MOVLW 020H MOVWF PORTC ; Set WP# ALE CLE = 100 ; CLRF WaitBusyCntL ; set up wait not busy counter ; CLRF WaitBusyCntH CLRW ; Check byte count low for 0. XORWF ByteCntL,W BTFSS STATUS,2 ; check zero flag GOTO RdBig_G ; not zero so use it ; byte count low has 0. Now see if byte count high is greater then 0 RdBig_O CLRW XORWF ByteCntH,W BTFSC STATUS,2 ; check zero flag GOTO SendEventChr ; allow SendEventChr to return ; RETLW 0 ; **** return with 0 DECF ByteCntH ; decrement high count and start again RdBig_G BTFSC PORTC,1 ; Wait for port C bit 1 to be low GOTO RdBig_G ; for space available RdBig_G1 BTFSS PORTC,2 ; Wait for port C bit 2 to be high GOTO RdBig_G1 ; for rdy/bsy to be high BCF PORTA,3 ; Read data from Smart media BSF PORTA,1 ; Strobe data to USB fifo BCF PORTA,1 ; Strobe data to USB fifo BSF PORTA,3 ; Stop Read data from Smart media DECFSZ ByteCntL,F ; check for bytecnt low 0 GOTO RdBig_G GOTO RdBig_O ; go to outer loop ; ================================================================ ; Write up to 64k bytes from SmartMedia ; ================================================================ WrBig MOVLW 020H MOVWF PORTC ; Set WP# ALE CLE = 100 CLRW ; Check byte count low for 0. XORWF ByteCntL,W BTFSS STATUS,2 ; check zero flag GOTO WrBig_G ; not zero so use it ; byte count low has 0. Now see if byte count high is greater then 0 WrBig_O CLRW XORWF ByteCntH,W BTFSC STATUS,2 ; check zero flag RETLW 0 ; **** return with 0 DECF ByteCntH ; decrement high count and start again WrBig_G BTFSC PORTC,0 ; Wait for port C bit 0 to be low GOTO WrBig_G ; for data available BCF PORTA,0 ; Read data from USB BCF PORTA,0 ; Do it twice for 20MHz BCF PORTA,2 ; Strobe data to Smart mem BSF PORTA,2 BSF PORTA,0 ; Stop Read data from USB DECFSZ ByteCntL,F ; check for bytecnt low 0 GOTO WrBig_G GOTO WrBig_O ; go to outer loop ; ================================================================ ; Send Command phase to mem - assume < 255 bytes ; ================================================================ SndCmd MOVLW 028H MOVWF PORTC ; Set WP# ALE CLE = 101 CLRW ; Check byte count low for 0. XORWF ByteCntL,W BTFSS STATUS,2 ; check zero flag GOTO SndCmd_1 ; not zero so use it SndCmd_Exit MOVLW 020H MOVWF PORTC ; Set WP# ALE CLE = 100 RETLW 0 ; **** return with 0 SndCmd_1 BTFSC PORTC,0 ; Wait for port C bit 0 to be low GOTO SndCmd_1 ; for data available BCF PORTA,0 ; Read data from USB BCF PORTA,0 ; Do it twice for 20MHz BCF PORTA,2 ; Strobe data to Smart mem BSF PORTA,2 BSF PORTA,0 ; Stop Read data from USB DECFSZ ByteCntL,F ; check for bytecnt low 0 GOTO SndCmd_1 GOTO SndCmd_Exit ; ================================================================ ; Send Address phase to mem - assume < 255 bytes ; ================================================================ SndAddr MOVLW 030H MOVWF PORTC ; Set WP# ALE CLE = 110 CLRW ; Check byte count low for 0. XORWF ByteCntL,W BTFSS STATUS,2 ; check zero flag GOTO SndAddr_1 ; not zero so use it SndAddr_Exit MOVLW 020H MOVWF PORTC ; Set WP# ALE CLE = 100 RETLW 0 ; **** return with 0 SndAddr_1 BTFSC PORTC,0 ; Wait for port C bit 0 to be low GOTO SndAddr_1 ; for data available BCF PORTA,0 ; Read data from USB BCF PORTA,0 ; Do it twice for 20MHz BCF PORTA,2 ; Strobe data to Smart mem BSF PORTA,2 BSF PORTA,0 ; Stop Read data from USB DECFSZ ByteCntL,F ; check for bytecnt low 0 GOTO SndAddr_1 GOTO SndAddr_Exit ; ================================================================ ; set event char ; ================================================================ SetEventChr BTFSC PORTC,0 ; Wait for port C bit 0 to be low GOTO SetEventChr ; for data available BCF PORTA,0 ; Read data from USB MOVF PORTD,W ; Get data to W MOVF PORTD,W ; Do it twice for 20MHz BSF PORTA,0 ; Stop Read data from USB MOVWF EventChr ; Store in command RETLW 0 ; return ; ================================================================ ; set event char ON or OFF 1 = on ; ================================================================ SetEventOnOff BTFSC PORTC,0 ; Wait for port C bit 0 to be low GOTO SetEventOnOff ; for data available BCF PORTA,0 ; Read data from USB MOVF PORTD,W ; Get data to W MOVF PORTD,W ; Do it twice for 20MHz BSF PORTA,0 ; Stop Read data from USB MOVWF SendEvntChr ; Store in command RETLW 0 ; return ; ================================================================ ; wait for not busy ; ================================================================ WaitNBsy BTFSS PORTC,2 ; Wait for port C bit 0 to be low GOTO WaitNBsy ; for rdy/bsy to be high RETLW 0 ; return ; ================================================================ ; Read Command ; ================================================================ RdCmd RdCmd_1 BTFSC PORTC,0 ; Wait for port C bit 0 to be low GOTO RdCmd_1 ; for data available BCF PORTA,0 ; Read data from USB MOVF PORTD,W ; Get data to W MOVF PORTD,W ; Do it twice for delay for 20MHz BSF PORTA,0 ; Stop Read data from USB MOVWF Command ; Store in command MOVLW 0AAH ; Check for echo command XORWF Command,W BTFSC STATUS,2 ; check zero flag RETLW 0 ; return if AA MOVLW 0ABH ; Check for echo command XORWF Command,W BTFSC STATUS,2 ; check zero flag RETLW 0 ; return if AA RdCmd_2 BTFSC PORTC,0 ; Wait for port C bit 0 to be low GOTO RdCmd_2 ; for data available BCF PORTA,0 ; Read data from USB MOVF PORTD,W ; Get data to W MOVF PORTD,W ; Do it twice for delay for 20MHz BSF PORTA,0 ; Stop Read data from USB MOVWF ByteCntL ; Store in ByteCount low RdCmd_3 BTFSC PORTC,0 ; Wait for port C bit 0 to be low GOTO RdCmd_3 ; for data available BCF PORTA,0 ; Read data from USB MOVF PORTD,W ; Get data to W MOVF PORTD,W ; Do it twice for delay for 20MHz BSF PORTA,0 ; Stop Read data from USB MOVWF ByteCntH ; Store in ByteCount high RETLW 0 ; **** return with 0 ; ================================================================ ; Send Data to host ; ================================================================ ReadWPPin CLRW ; clear W MOVWF MData ; set data to not Write Protect BTFSS PORTC,6 ; Skip if WP bit is ON GOTO SndData ; send data ; set return data to 1 to show WP bit is on MOVLW 01H MOVWF MData ; put it in MData GOTO SndData SendCardState MOVF CardState,W ; get event char MOVWF MData ; put it in MData GOTO SndData SendEventChr CLRW ; Check SendEvntChr for 0 XORWF SendEvntChr,W BTFSC STATUS,2 ; check zero flag RETLW 0 ; zero so return MOVF EventChr,W ; get event char MOVWF MData ; put it in MData GOTO SndData EchoCmd MOVF Command,W ; get command entry point MOVWF MData ; put it in MData SndData ; SndData entry point BSF STATUS,5 ; set bit 5 of status reg = RP0 ; to select bank 1 CLRF PORTD ; PORTD<7:0> as output BCF STATUS,5 MOVF MData,W ; put status into W MOVWF PORTD ; output it SndData_1 BTFSC PORTC,1 ; Wait for port C bit 1 to be low GOTO SndData_1 ; for space available BSF PORTA,1 ; strobe data BCF PORTA,1 BSF STATUS,5 ; set bit 5 of status reg = RP0 ; to select bank 1 MOVLW 0FFH MOVWF PORTD ; PORTD<7:0> as input BCF STATUS,5 RETLW 0 ; **** return with 0 ; ================================================================ ; ; ================================================================ MyDelay MOVLW 080H ; LOAD COUNT REG MOVWF MYCNTH MYDELAY_1 MOVLW 0FFH ; LOAD COUNT REG WITH FF MOVWF MYCNTL MYDELAY_2 DECFSZ MYCNTL,F ; COUNT DOWN GOTO MYDELAY_2 DECFSZ MYCNTH,F GOTO MYDELAY_1 RETLW 0 ; return with 0 ; ================================================================ ; Init subroutine ; ================================================================ InitSub MOVLW 00DH ; init ports MOVWF PORTA ; PORTA<5:0> = x3D MOVLW 000H MOVWF PORTC ; PORTC<7:0> = x00 MOVLW 000H MOVWF PORTB ; PORTB<7:0> = x00 MOVLW 0FFH MOVWF PORTD ; PORTB<7:0> = x5A MOVWF FSR ; init indirection pointer BSF STATUS,5 ; set bit 5 of status reg = RP0 ; to select bank 1 MOVLW 00H ; PORTA<0> as all output MOVWF PORTA MOVLW 0C7H MOVWF PORTC ; PORTC<7:0> as output IIOOOIII MOVLW 0FFH MOVWF PORTD ; PORTD<7:0> as input MOVLW 0FFH MOVWF PORTB ; PORTB<7:0> as input MOVLW 0EH ; PORTA<0> as AN0, VREF=VDD, left justified MOVWF PORTE MOVLW 07H ; All channels on porta as digital MOVWF ADCON0 BCF STATUS,5 MOVLW 00H ; A/D converter off MOVWF ADCON0 MOVLW 00H MOVWF FSR ; intialize FSR MOVLW 00 MOVWF T1CON CLRF MStatus CLRF MData CLRF ByteCntL CLRF ByteCntH CLRF Command CLRF EventChr CLRF CardState MOVLW 01 ; enable event chars MOVWF SendEvntChr RETLW 0 ; **** return with 0 ; ================================================================ ; Main Program ; ================================================================ ORG 100 START CALL InitSub ; MOVLW 04FH ; update cardstate MOVWF CardState ; CALL SndData MainLoop ; CLRWDT ; clear watch dog ; BTFSC PORTC,0 ; Wait for port C bit 0 to be low ; GOTO MainLoop ; for data available ; BCF PORTA,0 ; Read data from USB ; MOVF PORTD,W ; Get data to W ; BSF PORTA,0 ; Stop Read data from USB ; MOVWF MData ; CALL SndData ; GOTO MainLoop main_1 CLRWDT ; clear watch dog BTFSS PORTC,0 ; Wait for port C bit 0 to be low BTFSC PORTC,0 ; Wait for port C bit 0 to be low GOTO main_1a CALL RdCmd; MOVLW 0AAH ; single byte flush and echo XORWF Command,W BTFSC STATUS,2 ; check zero flag CALL EchoCmd MOVLW 0ABH ; single byte flush and echo XORWF Command,W BTFSC STATUS,2 ; check zero flag CALL EchoCmd MOVLW 08AH XORWF Command,W BTFSC STATUS,2 ; check zero flag CALL SendCardState main_1a BTFSC PORTC,7 ; Wait for present GOTO main_1 CALL MyDelay ; CALL PwrUp MOVLW 049H MOVWF CardState MOVWF MData CALL SndData main_2 CLRWDT ; clear watch dog BTFSC PORTC,7 ; Wait for present GOTO main_3 BTFSS PORTC,0 ; Wait for port C bit 0 to be low GOTO GetCommand GOTO main_2 GetCommand CALL RdCmd; ; GOTO main_2 MOVLW 081H XORWF Command,W BTFSC STATUS,2 ; check zero flag CALL SndCmd MOVLW 082H XORWF Command,W BTFSC STATUS,2 ; check zero flag CALL SndAddr MOVLW 083H XORWF Command,W BTFSC STATUS,2 ; check zero flag CALL WrBig MOVLW 084H XORWF Command,W BTFSC STATUS,2 ; check zero flag CALL RdBig MOVLW 085H XORWF Command,W BTFSC STATUS,2 ; check zero flag CALL PwrUp MOVLW 086H XORWF Command,W BTFSC STATUS,2 ; check zero flag CALL PwrDn MOVLW 0AAH ; single byte flush and echo XORWF Command,W BTFSC STATUS,2 ; check zero flag CALL EchoCmd MOVLW 0ABH ; single byte flush and echo XORWF Command,W BTFSS STATUS,2 ; check zero flag GOTO GetCommand_2 CALL EchoCmd ; echo and jump to start ; GOTO START GetCommand_2 MOVLW 088H XORWF Command,W BTFSC STATUS,2 ; check zero flag CALL WaitNBsy MOVLW 089H XORWF Command,W BTFSC STATUS,2 ; check zero flag CALL SetEventChr MOVLW 08AH XORWF Command,W BTFSC STATUS,2 ; check zero flag CALL SendCardState MOVLW 08BH XORWF Command,W BTFSC STATUS,2 ; check zero flag CALL SetEventOnOff MOVLW 08CH XORWF Command,W BTFSC STATUS,2 ; check zero flag CALL ReadWPPin GOTO main_2 main_3 CALL PwrDn CALL MyDelay MOVLW 04FH MOVWF CardState MOVWF MData CALL SndData GOTO MainLoop END ; Program ends |
|
地板#
发布于:2003-08-11 10:07
请问你用过这个芯片吗?在哪里可以买到,价格是多少?
|
|