1. Tuyển Mod quản lý diễn đàn. Các thành viên xem chi tiết tại đây

Tìm EEPROM hoặc Flash dung lượng lớn

Chủ đề trong 'Điện - Điện tử - Viễn thông' bởi tunglinh2809, 29/05/2004.

  1. 1 người đang xem box này (Thành viên: 0, Khách: 1)
  1. billydragon

    billydragon Thành viên mới

    Tham gia ngày:
    25/11/2003
    Bài viết:
    79
    Đã được thích:
    0
    Tôi đã từng viết chương trinh cho 8051 dùng Nand Flash của SAMSUNG, nó có thể đạt tới 128Mb. Tôi mua 1 cái thẻ Nand tại các cửa hàng bán thẻ cho máy ảnh KTS. về, phải chịu khó làm cái tiếp điểm để nó tiếp xúc với các cổng của 8051, sau đó có thể rút ra, thay thẻ khác v.vv.
    giao diện có 2 loại:
    1. IDE thì phải tuân thủ theo nguyên tắc FAT
    2. nếu chỉ duìng để nhớ thôi thì đọc kỹ datasheet là OK.
    nếu cần tôi có thể cho bạn mã nguồn để dùng loại bộ nhớ đó dưới dạng memory.
  2. tunglinh2809

    tunglinh2809 Thành viên mới

    Tham gia ngày:
    23/05/2004
    Bài viết:
    8
    Đã được thích:
    0
    Mình chỉ cần dùng để nhớ dữ liệu thôi. Nhưng không biết việc đưa dữ liệu vào thẻ có dễ không. Nếu có thể thì bạn gởi cho mình mã nguồn bạn đã làm nhé.
    Cám ơn bạn nhiều lắm.
  3. billydragon

    billydragon Thành viên mới

    Tham gia ngày:
    25/11/2003
    Bài viết:
    79
    Đã được thích:
    0
    Đây là chương trình dung 89C51 để đọc và ghi thẻ nhớ NAND Flash. Dùng để test thôi, giao diện qua terminal của PC cổng COMPORT.
    Để nó có thể nhận và ghi vào card với tốc độ 115kb thì cần dùng thạch anh 22.11Mhz, có thể dung để capture dữ liệu rất tiện.
    Datasheet của K9F2808U0B có thể tìm trên mạng rất nhiều,
    Đây không phải là giao diện ATA IDE mà chỉ dùng như bộ nhớ thôi nên rất đơn giản. Có các module như ghi, xoá , đọc và cũng rất dẽ hiểu.

    ''SMART MEDIA CARD FLASH CONTROL
    $large
    $crystal = 22118400
    $baud = 115200
    ''$serialoutput = Send
    Declare Sub Init_flash
    Declare Sub Pointer
    Declare Sub Erase_block
    Declare Sub Write_cmd
    Declare Sub Write_byte
    Declare Sub Write_finish
    Declare Sub Read_cmd
    Declare Sub Read_byte
    Dim Cmd As Byte
    Dim I As Long , J As Long
    Dim Filesize As Long , Cnt As Long
    Dim Row1_cnt As Byte , Row2_cnt As Byte , Fls_buff As Byte '', Col_start As Integer ,
    ''Dim Send_ok As Bit , Rx_ok As Bit
    Rx Alias Scon.0
    Tx Alias Scon.1
    Es Alias Ie.4
    Dim Rxtx As Byte
    Red_led Alias P1.1
    Dim Row1 As Byte , Row2 As Byte , Col As Byte
    Dim Fls_cmd As Byte
    Dim Error_flg As Bit , Wp_flg As Bit , Gnd_set As Bit
    Cs Alias P1.3
    Cle Alias P1.4
    Ale Alias P1.5
    Rb Alias P1.6
    Wp Alias P1.7
    Re Alias P3.7
    We Alias P3.6
    Gnd Alias P1.2
    Call Init_flash
    ''On Serial Serial_int
    ''
    ''************************* Main program ********************************
    '' Rx = 0 : Tx = 0
    '' Send_ok = 0
    '' Rx_ok = 0
    '' Enable Serial
    '' Priority Set Serial
    '' Enable Interrupts
    Print "K9F2808U0B" ; Chr(13) ; Chr(10)
    Batdau:
    Gosub Serint
    Goto Batdau
    Write_flash:
    Filesize = 0
    Print " WRITE BYTES:" ; Chr(13) ; Chr(10)
    Input "Col: " , Col
    Input "Row1 " , Row1_cnt
    Input "Row2: " , Row2_cnt
    Input "FileSize " , Filesize
    Fls_cmd = &H00
    Gnd = 0
    Printhex "WRITING AT:" ; Row2_cnt ; Row1_cnt ; Col ; ", SIZE: " ; Filesize ; Chr(13) ; Chr(10)
    Gosub Receive
    If Rxtx = &H38 Then
    Cnt = 0
    I = 0
    Write_loop1:
    Do
    Do
    Row1 = Row1_cnt
    Row2 = Row2_cnt
    Call Pointer
    Call Write_cmd
    ''Gosub Send_ack
    For I = 0 To 527
    Fls_buff = Waitkey()
    Call Write_byte
    Incr Cnt
    If Cnt = Filesize Then Goto Thoat_write
    Next I
    Call Write_finish
    Col = 0
    Incr Row1_cnt
    Loop Until Row1 = &HFF
    ''If Row1 = &HFF Then
    Row1_cnt = 0
    Incr Row2_cnt
    ''End If
    ''If Row2 = &HFF Then
    Loop Until Row2 = &HFF
    ''End If
    ''Goto Write_loop1
    Thoat_write:
    Call Write_finish
    ''Gosub Send_ack
    ''Gosub Receive
    Printhex "WRITE OK. FINISH AT: " ; Row2 ; Row1 ; I ; Chr(13) ; Chr(10)
    End If
    Return
    Send_ack:
    NOP
    Print Chr(&H32)
    ''Lap_ack:
    ''Gosub Receive
    ''If Rxtx <> &H31 Then Goto Lap_ack
    Return
    Read_flash:
    Filesize = 0
    Print "READ PAGE:" ; Chr(13) ; Chr(10)
    Input "Col: " , Col
    Input "Row1: " , Row1
    Input "Row2: " , Row2
    Input "FileSize: " , Filesize
    Gnd = 0
    Printhex "Reading from: " ; Row2 ; Row1 ; Col ; " Size: " ; Filesize ; Chr(13) ; Chr(10)
    Gosub Receive
    If Rxtx = &H38 Then
    Fls_cmd = &H00
    Call Pointer
    Call Read_cmd
    Waitms 1
    Read_loop:
    For Cnt = 1 To Filesize
    Call Read_byte
    Waitms 1
    Printhex Chr(fls_buff);
    Next Cnt
    End If
    Return
    Erase_flash:
    Print "BLOCKS ERASE." ; Chr(13) ; Chr(10)
    Input "Low Block (0-256) " , Row1_cnt
    Input "High Block(0-8) " , Row2_cnt
    Input "Lenght: " , Filesize
    Fls_cmd = &H00
    If Filesize = 0 Then Goto Allerased
    I = 0
    Print "Erasing..."
    Erase1_loop:
    Row1 = Row1_cnt
    Row2 = Row2_cnt
    Call Erase_block
    If Error_flg = 1 Then Print "ERASE ERROR!" ; Chr(13) ; Chr(10)
    If Wp_flg = 0 Then Print "WRITE PROTECTED!" ; Chr(13) ; Chr(10)
    Incr I
    If I = Filesize Then Goto Allerased
    Incr Row1_cnt
    If Row1 = &HFF Then
    Row1_cnt = 0
    Incr Row2_cnt
    End If
    If Row2 = &HFF Then Goto Allerased
    Goto Erase1_loop
    Allerased:
    Print Filesize ; " BLOCKS ERASE OK." ; Chr(13) ; Chr(10)
    Return
    Sub Init_flash:
    P3 = &HFF
    P1 = &HFF
    P2 = 0
    Reset Ale
    Reset Cle
    Reset Wp
    Set Cs
    Reset Gnd
    End Sub
    Sub Read_cmd(col As Byte , Row1 As Byte , Row2 As Byte)
    SETB {ALE}
    MOV A,{COL}
    MOVX @DPTR,A
    MOV A,{ROW1}
    MOVX @DPTR,A
    MOV A,{ROW2}
    MOVX @DPTR,A
    CLR {ALE}
    JNB {RB},*+0
    End Sub
    Sub Read_byte
    MOVX A,@DPTR
    Fls_buff = Acc
    End Sub
    Sub Erase_block
    Disable Interrupts
    SETB {WP} ''WRITE PROTECT OF
    CLR {CS} ''CHIP SELECT
    SETB P1.4''{CLE}
    CLR P1.5''{ALE}
    MOV A,#&H60
    MOVX @DPTR,A
    CLR P1.4''{CLE}
    SETB P1.5''{ALE}
    MOV A,{ROW1}
    MOVX @DPTR,A
    MOV A,{ROW2}
    MOVX @DPTR,A
    CLR P1.5''{ALE}
    SETB P1.4''{CLE}
    MOV A,#&HD0
    MOVX @DPTR,A
    CLR P1.4''{CLE}
    JNB P1.6,*+0
    SETB P1.4''{CLE}
    MOV A,#&H70
    MOVX @DPTR,A
    CLR P1.4''{CLE}
    MOVX A,@DPTR
    JNB ACC.7,WRITE_PROTECT
    JB ACC.0,ERASEERROR
    Eraseok:
    CLR {ERROR_FLG}
    SETB {WP_FLG}
    Goto Exit_erase
    !WRITE_PROTECT:
    CLR {WP_FLG}
    Goto Exit_erase
    !Eraseerror:
    MOV P1,#&HFF
    SETB {ERROR_FLG}
    Exit_erase:
    Enable Interrupts
    End Sub
    Sub Pointer
    CLR {CS}
    SETB {WP}
    SETB P1.4
    CLR P1.5
    MOV A,{FLS_CMD}
    MOVX @DPTR,A
    CLR P1.4
    End Sub
    Sub Write_cmd
    SETB P1.4
    CLR P1.5
    MOV A,#&H80
    MOVX @DPTR,A
    CLR P1.4
    SETB P1.5
    MOV A,{COL}
    MOVX @DPTR,A
    MOV A,{ROW1}
    MOVX @DPTR,A
    MOV A,{ROW2}
    MOVX @DPTR,A
    CLR P1.5
    End Sub
    Sub Write_byte
    MOV A,{FLS_BUFF}
    MOVX @DPTR,A
    End Sub
    Sub Write_finish:
    SETB P1.4
    MOV A,#&H10
    MOVX @DPTR,A
    JNB {RB},*+0
    Mov A , #&H70
    MOVX @DPTR,A
    CLR P1.4
    JB ACC.0,WRITEERROR
    Writeok:
    CLR {ERROR_FLG}
    SETB {WP_FLG}
    Goto Exit_write
    !WRITEerror:
    MOV P1,#&HFF
    SETB {ERROR_FLG}
    Exit_write:
    End Sub
    Serint:
    Set Red_led
    Gosub Receive
    If Rxtx = &H31 Then
    Waitms 5
    Print Chr(&H32)
    Gosub Receive
    If Rxtx = &H31 Then Goto Erase_flash
    If Rxtx = &H32 Then Goto Read_flash
    If Rxtx = &H33 Then Goto Write_flash
    End If
    Skip_cmd:
    Return
    Receive:
    Rxtx = Waitkey()
    Return
  4. tunglinh2809

    tunglinh2809 Thành viên mới

    Tham gia ngày:
    23/05/2004
    Bài viết:
    8
    Đã được thích:
    0
    Mình có thực hiện mạch nạp ROM, sử dụng sơ đồ mạch lấy tại www.batronix.com. Nhưng chẳng hiểu sao mạch chỉ đọc mà lại không ghi được. Không biết có bạn nào đã thực hiện thử mạch này chưa. Mình dùng phần mềm Batronix Prog Studio v5.28 và dùng phần mềm crack tải trên mạng. MÌnh dùng phần mềm kiểm tra mạch nhưng chẳng phát hiện gì sai cả, nhưng vẫn không chạy được.

Chia sẻ trang này