Thông báo

Collapse
No announcement yet.

SD card và MMC card

Collapse
This is a sticky topic.
X
X
 
  • Lọc
  • Giờ
  • Show
Clear All
new posts

  • #31
    Giả sử đã khởi tạo MMC, chúng ta sẽ bàn tiếp đến các hàm đọc và ghi sector cho MMC.

    - Do đọc dễ hơn ghi, nên tôi nói hàm read_sector trước.
    Command đọc 1 sector là Command 17. 17(dec) = 0x11(hex) = 0001 0001
    Ghép với byte command 0x01.... ta có : 0x0101 0001 = 0x51

    Vậy lệnh đọc là : CMD17( 0x51, byte4..1,0x00)
    Có một điều hơi khó hiểu chỗ này, các bác cẩn thận này:
    Các byte4-1 là địa chỉ theo byte, nhưng MMC lại đọc theo sector. Có nghĩa là: giả sử chúng ta cần đọc sector0 = 512byte đầu tiên, MMC sẽ gửi dữ liệu bắt đầu từ byte số 0. Vậy 4byte này là 0x00 0x00 0x00 0x00 = 0!

    Nhưng giả sử chúng ta muốn đọc sector 1, là 512byte tiếp theo, MMC sẽ gửi từ byte thứ 512 đến byte 1023, vậy 4byte này phải trỏ đến byte thứ 512 và như vậy có giá trị là: 0x00 0x00 0x02 0x00 = 0x200 = 512.

    Vậy nếu chúng ta có 4 thanh ghi 8bit từ r20-r23 lưu địa chỉ byte, để chuyển thành sector muốn đọc ta làm thêm 1 hàm shift_mmc như sau:

    clr r20
    lsl r21
    rol r22
    rol r23.
    Với r23 = byte4; r20 = byte1
    Khi đó, Muốn đọc sector 0, r23..r20 = 0x00 0x00 0x00 0x00
    Muốn đọc sector 1, r23..r20 = 0x00 0x00 0x00 0x01 0x00
    Áp dụng hàm shift_mmc cho trường hợp này:
    r20 = 0x00
    r21 = 0x01, lsl r21 = 0x02
    rol r22 = 0x00
    rol r23 = 0x00
    ---> r23..r20 = 0x00 0x00 0x02 0x00
    Các bác có thể thử với một vị trí sector bất kỳ để hiểu đoạn này

    Như vậy, lệnh đọc sector MMC sẽ là: (giả sử sector 1)
    ldi r21,0x01
    rcall shift_mmc

    ldi r16, 0x51
    rcall SPI_byte_transfer
    mov r16,r23
    rcall SPI_byte_transfer
    mov r16, r22
    rcall SPI_byte_transfer
    mov r16, r21
    rcall SPI_byte_transfer
    mov r16, r20
    rcall SPI_byte_transfer
    ---(hoặc rcall SPI_0_transfer)

    rcall SPI_255_transfer
    rcall SPI_255_transfer
    (chúng ta gọi 2 hàm send 0xFF đến MMC để chờ response)
    cpi r16,0x00
    (so sánh response với 0x00, nếu khác là có error)
    brne MMC_read_error
    ret

    MMC_read_error:
    (tùy các bác xử lý!)
    ret
    Mồm chó vó ngựa

    Comment


    • #32
      Nguyên văn bởi yankazaz Xem bài viết
      (tiếp luôn)

      - CHo những ai máu SD, MMC:
      search và down Winhex V14.8, DiskExplorer, Proteus V7.1 SP2 có SD simulation.
      Vào lapcenter.com, vào forum và tìm down phần simulation mẫu.
      Dùng DiskExplorer build file ảnh của thẻ MMC32 (chú ý: Proteus chỉ hỗ trợ max là 32M). File ảnh sẽ có dạng .img. Bạn đổi tên thành .mmc là ok.
      Khi vẽ trong proteus, chèn file ảnh đó vào đường dẫn thẻ nhớ. Thế là hoàn thành.

      - Ứng dụng: Mp3 player FaT16 support.
      Cái này chắc nhiều người làm rồi, FatFs (cứ gõ từ này là ra) là một phần driver về FAT cho thẻ nhớ. Nếu các bác không muốn mất thời gian, down về mà chiến (C language).
      Thủ tục chỉ đơn giản là: đọc 1 sector trên MMC, send qua IC giải mã cho đến khi IC giải mã (như VS1001, VS1033, STA013...) báo với uC rằng, buffer của nó đã đầy thì stop không đọc thẻ nữa mà check data ready từ IC giải mã. Khi có tín hiệu, lại tiếp tục đọc và play.

      - Datalogger: Tốc độ ghi file trên thẻ nhớ là khá cao. SPI frequency có thể lên đến 1Mb (nếu sử dụng AVR có dual mode). Cao hơn thì tôi chưa thử nên không dám bàn. Chúng ta có thể ghi file bất kỳ dạng txt, với khung dữ liệu cố định, mỗi lần ghi 16 byte. (Tất nhiên, chúng ta sẽ chờ khi đủ 512byte 1 sector mới ghi vào thẻ). Mỗi lần ghi 1 dòng trong file txt. Do khung dữ liệu là cố định, có thể lập trình visual gì đó để đọc thẻ nhớ (sử dụng API có sẵn), xử lý dữ liệu với từng đối tượng. Chẳng hạn như trạm bơm có mực nước, điện áp, ..... và xây dựng đồ thị, báo cáo...

      Còn nhiều thứ nữa nhưng tôi mới làm 2 cái này, mong được cao nhân chỉ bảo thêm!!!

      Cao thủ đây rồi.Em đang làm về phần datalogger có dùng đến thẻ nhớ đó bác .Em dùng thẻ MMC 32Mb và vi điều khiển ATmega16, mới lập trình để ghi 1 sector vào thẻ thôi (làm theo cách bác bảo đó ). Em đang khog biết cách đọc dữ liệu ghi trên thẻ bằng máy tính như thế nào, mong bác chỉ giáo.
      Last edited by Sky_Blue; 14-04-2008, 22:43.
      "Ai không biết giá trị của thời gian thì đừng mong vinh quang"!

      Comment


      • #33
        Em đang khog biết cách đọc dữ liệu ghi trên thẻ bằng máy tính như thế nào, mong bác chỉ giáo.
        Bạn muốn đọc ghi trực tiếp hay gián tiếp? Trực tiếp là thẻ nhớ đút vô khe SD/MMC trên laptop (VD) và gián tiếp là thôgn qua uC?
        - Đối với trực tiếp, theo ý kiến tôi sử dụng hàm API có sẵn của Visual.. là không khó và không mất thời gian, tùy theo định dạng trong thẻ nhớ (bạn có thể định dạng theo cấu trúc excel - tất nhiên phải ghi theo kiểu excel..) mà bạn chọn database thích hợp để xử lý. Phương án này tôi nghĩ là hợp lý, để sau một thời gian thẻ đầy (vấn đề thẻ đầy sẽ còn bàn nhiều - chúng ta không phải là microsoft phải kô ), chúng ta sẽ trực tiếp đọc dữ liệu từ thẻ để xây dựng thông tin từng năm, như gió máy mưa dông vv..v..
        Theo tính toán của tôi, thì với thẻ 512Mb, 1s một lần, mỗi lần 16byte là thừa đủ! Nếu bạn muốn lưu nhiều hơn, có thể sử dụng thẻ nhớ Max 2Gb (chú ý FAT16 chỉ support max 2Gb).

        - Còn việc đọc gián tiếp, có thể giả định máy tính của bạn là máy chủ, có nhiều bộ datalogger hình thành giao tiếp theo chuẩn modbus hay gì đó. Và khi cần đọc dữ liệu, máy tính gửi command qua giao tiếp này, đối với UC thì đó sẽ là một ngắt của UART và bạn có thể đọc dữ liệu trực tiếp từ buffer (nếu như máy chủ yêu cầu đều đặn 2s một lần gửi) hoặc đọc từ MMC, nhưng sẽ phải quản lý sector và thông tin tốt hơn.

        Tôi muốn nói thêm là, Mỗi lần ghi file, bao giờ cũng mất 1 cluster, kể cả có đầy hay còn thừa cluster đó. (Ặc, nói đến ghi tôi quên mất là vấn đề này khó hơn đọc nhiều, và tôi hy vọng sẽ được trình bày sau. Mong bạn theo dõi và support dientuvietnam.net )
        Mồm chó vó ngựa

        Comment


        • #34
          Nguyên văn bởi yankazaz Xem bài viết
          Bạn muốn đọc ghi trực tiếp hay gián tiếp? Trực tiếp là thẻ nhớ đút vô khe SD/MMC trên laptop (VD) và gián tiếp là thôgn qua uC?
          - Đối với trực tiếp, theo ý kiến tôi sử dụng hàm API có sẵn của Visual.. là không khó và không mất thời gian, tùy theo định dạng trong thẻ nhớ (bạn có thể định dạng theo cấu trúc excel - tất nhiên phải ghi theo kiểu excel..) mà bạn chọn database thích hợp để xử lý. Phương án này tôi nghĩ là hợp lý, để sau một thời gian thẻ đầy (vấn đề thẻ đầy sẽ còn bàn nhiều - chúng ta không phải là microsoft phải kô ), chúng ta sẽ trực tiếp đọc dữ liệu từ thẻ để xây dựng thông tin từng năm, như gió máy mưa dông vv..v..
          Theo tính toán của tôi, thì với thẻ 512Mb, 1s một lần, mỗi lần 16byte là thừa đủ! Nếu bạn muốn lưu nhiều hơn, có thể sử dụng thẻ nhớ Max 2Gb (chú ý FAT16 chỉ support max 2Gb).

          - Còn việc đọc gián tiếp, có thể giả định máy tính của bạn là máy chủ, có nhiều bộ datalogger hình thành giao tiếp theo chuẩn modbus hay gì đó. Và khi cần đọc dữ liệu, máy tính gửi command qua giao tiếp này, đối với UC thì đó sẽ là một ngắt của UART và bạn có thể đọc dữ liệu trực tiếp từ buffer (nếu như máy chủ yêu cầu đều đặn 2s một lần gửi) hoặc đọc từ MMC, nhưng sẽ phải quản lý sector và thông tin tốt hơn.

          Tôi muốn nói thêm là, Mỗi lần ghi file, bao giờ cũng mất 1 cluster, kể cả có đầy hay còn thừa cluster đó. (Ặc, nói đến ghi tôi quên mất là vấn đề này khó hơn đọc nhiều, và tôi hy vọng sẽ được trình bày sau. Mong bạn theo dõi và support dientuvietnam.net )
          Em muốn đọc theo kiểu trực tiếp thôi.Vấn đề ở đây là em chưa biết nên lập trình như thế nào, vừa rồi có đứa bạn bảo nên lập trình theo kiểu ghi từng bít nhị phân vào thẻ nhớ, không theo chuẩn FAT, sau đó sẽ dùng một phần mềm để đọc các bít nhị phân này ở trên máy tính (nó lại không nhớ là dùng phần mềm nào). Em thì thích dùng ghi theo bảng FAT hơn, vì như thế thuận tiện khi đọc trên laptop. Em thấy ý tưởng ghi theo bảng excel của bác rất hay, em muốn làm theo hướng này, mỗi tội kiến thức Visual của em là con số 0 tròn trĩnh . Bác có thể chia sẻ thêm thông tin phần này giúp em được không ?
          Bác có thể cho em địa chỉ email để em tiện liên hệ, vì gần đến ngày em phải báo cáo kết quả với thầy giáo rồi, mà em làm chưa đâu vào đâu.
          Email của em: thienthanh_5@yahoo.com
          "Ai không biết giá trị của thời gian thì đừng mong vinh quang"!

          Comment


          • #35
            Sorry vì tôi không reply sớm cho bạn:

            - Theo tôi nghĩ, ghi từng bit nhị phân lên MMC là không vấn đề gì, nhưng nếu bạn trót nhỡ làm hỏng thằng MBR tức sector đầu tiên (ghi 0xxx gì lên đó cũng được) thì khả năng ra đi của thẻ là lớn (tôi không nói là teo ngay vì tôi chưa làm thế bao giờ - nhưng một điều chắc chắn là khi MBR bị bad thì thẻ nhớ 100% không phục hồi được). Bởi thế khi ghi raw(ghi nhị phân) lên thẻ, và đút vô laptop thì bao giờ windows cũng sẽ báo là not regconized và bắt reformat. Vậy bạn sử dụng cái gì trên windows nếu windows không thể nhận dạng được thẻ nhớ để đọc thẻ nhớ?

            - Chúng ta ghi theo FAT, là để windows nhận dạng được thẻ (do không ghi vào phân vùng của ổ, bao gồm MBR, PBR, FAT sector, Root entry mà chỉ ghi vào vùng dữ liệu với một quy ước về cluster). Còn nếu ghi theo raw mà giả sử có cái gì đó kỳ tích đọc được thì khác gì bạn ghi vào epprom rồi send vào PC qua RS232?

            - Việc ghi trực tiếp thẻ tôi chưa làm, nhưng như đã nói là nó sẽ không quá phức tạp như khi bạn tự tìm hiểu cơ chế đọc ghi, bởi các hàm sẵn có của microsoft có cấu trúc, tham số rất rõ rồi. Tôi mới chỉ search trên MSDN và ra rất nhiều kết quả. Bạn hãy chịu khó đọc từ link này trở đi, nếu chưa biết lập trình thế nào thì tôi cũng không biết phải làm gì trong hoàn cảnh thầy đòi nợ nữa. Còn nếu bạn đã có cơ bản, tôi nghĩ sẽ không khó khăn lắm đâu.
            Link: http://msdn2.microsoft.com/en-us/lib...07(VS.85).aspx
            Bạn bắt đầu từ phần File Manager, chú ý là trong đó có hàm support cho cả removable disk (thẻ nhớ), ghi và đọc file trên phân vùng v..v..
            Mồm chó vó ngựa

            Comment


            • #36
              Thanks bác yakanzaz. Em đang đọc link bác đưa rồi. Em sẽ cố gắng cày cuốc , có gì không hiểu sẽ nhờ bác tư vấn thêm cho. Em chỉ còn có 2 tuần nữa là phải báo cáo ông thầy rồi, hic, không biết có kịp không nữa.
              "Ai không biết giá trị của thời gian thì đừng mong vinh quang"!

              Comment


              • #37
                - Tôi xin tiếp với hàm ghi sector MMC

                - Thao tác ghi sector cho MMC/SD cũng tương tự như đọc sector, đó là:
                + Nhập sector cần ghi vào 4 thanh ghi
                + Gọi hàm shift sector để chuyển number sector - number byte
                + Gửi lệnh CMD 0x58, 4byte frame, 1byte CRC = 0xFE
                Ở đoạn này, thông thường như hàm read thì chúng ta sẽ gửi tiếp 0xFF qua SPI để đọc byte response, check giá trị và kết thúc hàm. Nhưng đối với hàm ghi, chúng ta sẽ gửi 0xFF để check response. Giả sử response này là A, chúng ta sẽ and A với 0x1F (chỉ check 5bit thấp của response) và so sánh với 0x05. Nếu khác, có nghĩa là lệnh ghi bị lỗi (error)

                + Sau khi check response này, chúng ta tiếp tục gửi 0xFF và check như đối với hàm read (if (response !=0x00) { call error subroutine})

                Về cơ bản, hàm giao tiếp với MMC/SD không khó khăn (thực sự không khó nếu bạn thực hiện việc chuyển sector - byte và check response đúng). Các bạn (nếu không có UART để debug), có thể dễ dàng sử dụng LCD16x2 sau từng command để xem command nào lỗi. Ví dụ: sau khi send command 0x00, ta sẽ send 0-OK lên LCD. Nếu không thấy có cái gì trên LCD, (do không có JTAG và debug tool, mọi thứ chạy trong uC là tối tăm như đêm chị Dậu) - bạn nên check lại hàm send command, read sector và write sector.

                Mọi thứ sẽ bắt đầu khi chúng ta đọc - ghi FAT.
                Mồm chó vó ngựa

                Comment


                • #38
                  - Về FAT, tôi đã giới thiệu qua ở những bài trên, để hiểu một cách tốt nhất, bạn nên vào MSDN của microsoft, in ra các bảng sau:
                  + Partition Boot Record
                  + Master Boot Record
                  + FAT entry
                  + Root directory entry

                  Những entry này thực chất là những sector có vị trí đặc biệt trên MMC/SD. Nhiệm vụ của chúng ta là sử dụng hàm đọc sector, bắt đầu đọc từ Master Root Record để lấy thông tin cho việc sử lý. Những thông tin chúng ta cần đều nằm trong 4 bảng nói trên. Ở đây có một điều lưu ý các bạn:
                  + Tất cả MBR trên mọi thẻ nhớ đều bắt đầu từ sector0 - tức sector đầu tiên
                  + Thông thường, đối với những thẻ nhớ có dung lượng nhỏ, MBR thường không có khi bạn build image bằng các công cụ như disk explorer, lý do: dung lượng nhỏ quá, và không cần thiết đến MBR để chia thẻ làm 2 -3 partition làm gì cả. (đây là thông tin tôi hỏi admin của avrfreaks.net)

                  + Tuy nhiên, theo thực tế thì thẻ 32Mb vẫn có MBR. Và tôi vẫn xử lý với thẻ 32Mb cũng như 512Mb theo hướng có MBR và ok với cả 2. Do vậy, khi mô phỏng bạn sẽ làm với sector0 là PBR, còn thực tế thì phải có hàm MBR ở sector0.

                  Tôi kết thúc ở đây, tất nhiên là còn thiếu nhiều chỗ, và vẫn với một câu là: nếu bạn thích khám phá thì hãy viết code mới. Nếu có thời gian và công sức + hardware + luck thì sẽ thành công (chưa nói đến chuyện tối ưu code). Còn nếu không, bạn có thể hiểu source code về FAT, mà theo tôi biết là có rất nhiều, rất nhiều - kể cả một số project dự thi contest cũng sử dụng nó - FatFs. Tuy nhiên, nói như thế không có nghĩa là nó hoàn hảo. Tôi chỉ xin nêu một vài ví dụ:

                  - Người sử dụng đút thẻ nhớ 512Mb với 10Mb free, bạn sẽ xử lý thế nào? Ghi tiếp, hay yêu cầu format, hay báo lỗi?
                  - Trong khi ghi, đột nhiên bị mất điện, vậy khi cấp điện bạn sẽ ghi lại từ đầu, hay ghi tiếp. Làm thế nào để biết điểm mình đang ghi ở chỗ nào? Loại trừ việc dùng battery, do battery cũng sẽ hết?
                  Còn nhiều điều phát sinh nữa, đặc biệt trong quá trình ghi. Và tôi hy vọng mọi người sẽ tiếp tục theo dõi & thảo luận thread này. Về thông tin tôi nêu ra trong bài, thật sự là nó ở rất nhiều nguồn và datasheet của nhiều hãng, không hề sao chép ở bất cứ đâu. Các bạn muốn tìm về nguồn cội tôi khuyên nên search FatFS và vào trang đầu tiên (sr do kô nhớ).
                  Mồm chó vó ngựa

                  Comment


                  • #39
                    thanhks bác yakanzza rất nhiều, bài viết của bác rất hay!

                    Sphinx: Bác bấm nút thank là được rồi!
                    Last edited by sphinx; 19-04-2008, 18:04.
                    "Ai không biết giá trị của thời gian thì đừng mong vinh quang"!

                    Comment


                    • #40
                      bác nào da làm đầu đọc thẻ nhớ bằng VDK chưa hoặc tương tự như thế cho em kinh nghiem hoăc tài liệu nhe!

                      Comment


                      • #41
                        Nguyên văn bởi yankazaz Xem bài viết
                        (tiếp luôn)

                        - Ứng dụng: Mp3 player FaT16 support.
                        Cái này chắc nhiều người làm rồi, FatFs (cứ gõ từ này là ra) là một phần driver về FAT cho thẻ nhớ. Nếu các bác không muốn mất thời gian, down về mà chiến (C language).
                        Thủ tục chỉ đơn giản là: đọc 1 sector trên MMC, send qua IC giải mã cho đến khi IC giải mã (như VS1001, VS1033, STA013...) báo với uC rằng, buffer của nó đã đầy thì stop không đọc thẻ nữa mà check data ready từ IC giải mã. Khi có tín hiệu, lại tiếp tục đọc và play.
                        bác cho em hỏi mấy con VS1001,VS1033,STA013 đấy có thể mua ở đâu, bao nhiêu tiền ? cảm ơn bác!
                        P/S :em ở HN

                        Comment


                        • #42
                          bác cho em hỏi mấy con VS1001,VS1033,STA013 đấy có thể mua ở đâu, bao nhiêu tiền ? cảm ơn bác!
                          P/S :em ở HN
                          Đợt trước mình mua STA013 qua digikey. Ở việt nam thì có email này bạn có thể liên lạc: dinhlaithe@yahoo.com - Đây là một bạn ở HCM, có VS1001 và VS1033. Lúc mình hỏi thì chỉ còn VS1033. Giá của con này (theo bạn ý bán) là 20$, không mua dưới 5 chú >.<
                          Mồm chó vó ngựa

                          Comment


                          • #43
                            Nguyên văn bởi david Xem bài viết
                            bác cho em hỏi mấy con VS1001,VS1033,STA013 đấy có thể mua ở đâu, bao nhiêu tiền ? cảm ơn bác!
                            P/S :em ở HN
                            http://www.pnlabvn.com/pnlab/index.p...mart&Itemid=29

                            Bạn có thể mua STA015 tại PNLab với giá bán lẻ 150k/c.
                            PNLab
                            Mạch nạp/debug ULink2, Jlink ARM USB
                            Mạch nạp AVR, PIC, 8051, MSP430 USB
                            Mạch phát triển STM32, ARM9, ARM11
                            more...www.pnlabvn.com

                            Comment


                            • #44
                              Hi,

                              Các pác cho em hỏi : "thẻ nhớ SD 128MB có format dưới định dạng FAT16 được không?"

                              Thx....

                              Comment


                              • #45
                                Thẻ nhớ thường được format dưới FAT16, nhưng những loại thẻ có dung lượng cao đều support FAT32 (bạn có thể ghi từ Win sang thẻ nhớ những file dài đến ..ái). Tuy nhiên khi có một thẻ nhớ bất kỳ bạn nên reformat dưới dạng FAT16!
                                Mồm chó vó ngựa

                                Comment

                                Về tác giả

                                Collapse

                                atmega8 Tìm hiểu thêm về atmega8

                                Bài viết mới nhất

                                Collapse

                                Đang tải...
                                X