lingjie
驱动牛犊
驱动牛犊
  • 注册日期2003-08-09
  • 最后登录2003-09-16
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1147回复:3

请教大侠,FT245BM资料

楼主#
更多 发布于:2003-08-09 16:57
刚接触usb,老师希望用FT245BM进行pc和单片的通信,但对FT245BM一无所知,希望得到众位大侠的帮助,小妹感激不尽!
coconuts
驱动牛犊
驱动牛犊
  • 注册日期2003-03-26
  • 最后登录2005-10-15
  • 粉丝0
  • 关注0
  • 积分40分
  • 威望6点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2003-08-09 19:07
可以上google搜一下相关文章
上公司的网站下载datasheet看一下
primey
驱动牛犊
驱动牛犊
  • 注册日期2002-02-27
  • 最后登录2005-02-03
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于: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

lingjie
驱动牛犊
驱动牛犊
  • 注册日期2003-08-09
  • 最后登录2003-09-16
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2003-08-11 10:07
请问你用过这个芯片吗?在哪里可以买到,价格是多少?
游客

返回顶部