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

  • #16
    Chú ý này, viết tiếng việt đi không bài của bác bị các mod chuyển cho MHZ đấy
    để xác định được cluster đầu tiên hay là xác định các thông số có liên quan khác bạn phải đọc thông tin từ bootsector (sector 0). trong card nó phân bố như sau: sector truơc FAT--FAt---Rdet--bắt đầu vùng dữ liệu.
    Còn việc muốn đọc một file thì bác fai tìm trong RDET, Khi nào tìm thấy entry quản lý cái file mà bác cần đọc ra thì dừng lại. Tìm trong entry xem xem nội dung file đó có nội dung bắt đầu ở cluster bao nhiêu. sau khi tìm được cluster đầu tiên chứa nội dung file. Quay trở về bảng FAt tìm tiếp các cluster tiếp theo của file cho đến hết. Nên lập thành một danh sách các cluster chứa nội dung file, sau khi lập xong thì ta bắt đầu đọc file. Vậy thôi.
    Nếu bác muốn ghi file thì phức tạp hơn chút, phải kiểm tra trạng thái cluster ở trong FAt, cụ thể nó gồm trống, hư, chứa nội dung. Tùy vào trạng thái để bác có thể chọn ghi hay là không ghi nội dung file cần ghi
    OKKKKKKKKKKK
    Phone: 0978536011

    Comment


    • #17
      CÁI NÀY TỚ NGHE ĐÃ KHOÁI RỒI!!!NHƯNG KHÔNG BIẾT LÀM NHƯ THẾ NÀO!!!CÓ ĐỌC SƠ QUA CẤU TRÚC MÁY TÍNH CÓ NÓI SƠ SƠ VỀ CÁI NÀY NHƯNG KHÔNG HIỂU CHO LẮM.ĐẠI CA NÀO HIỂU RÕ VỀ CÁI NÀY THI CHI EM VỚI!!!EM XIN HUẬ TẠ CHO 1 TUẦN CAPHE.(EM SỐNG Ở ĐÀ NẴNG)MAIL PHUC180785@YAHOO.COM
      |

      Comment


      • #18
        MMC thì chỉ có chế độ giao tiếp SPI
        SD thì có cả SPI và chế độ 4 bit data mode
        còn mấy cái loằng ngoằng mini với micro nó chỉ là khác kiểu chân và kiểu đóng gói thôi
        4 bit data mode là gi zay??

        Comment


        • #19
          Hôm nay rỗi việc, tiện thể post mấy cái nào

          - Tôi đã đọc, ghi FAT16 cho cả MMC32Mb, SD512. Tất cả mua ở chợ giời. MMC mua 40 ngàn. SD512 mua 120 ngàn.

          MMC thì khó mua, nếu muốn làm đơn giản trước thì qua đê La thành mà mò. 10 ngàn 1 cái.

          - Muốn giao tiếp với thẻ nhớ, trước tiên viết giao tiếp hardware bao gồm:
          + Giao tiếp SPI. Mặc dù SD và MMC đều hỗ trợ giao tiếp chuẩn riêng, nhưng với uC, bạn chỉ có thể giao tiếp với thẻ nhớ qua SPI. Datasheet của thẻ nhớ bao gồm: MMC-mode, SD-mode hay SPI-mode. Ưu điểm của MMC mode và SD mode là tốc độ nhanh. Trong đó SDcard hỗ trợ 4bit mode nên nhanh hơn hẳn so với MMC (tất nhiên là đối với mobile hay thiết bị hỗ trợ chuẩn thôi nha).
          + Khi đã làm xong SPI bao gồm:
          Khởi tạo SPI (SPI_init)
          Gửi byte SPI (SPI_transmit)
          Đọc byte SPI (SPI_receive)
          thì bạn hãy làm tiếp đến phần đọc MMC.

          - Đọc MMC (SD) gồm:
          + Khởi tạo MMC: MMC_init (SD_init)
          + Đọc sector MMC: MMC_read_sector (SD_read_sector)
          + Ghi sector MMC: MMC_write_sector (SD_write_sector)
          Trong 3 function trên đều phải sử dụng những base function sau:
          + MMC_send_command : Gửi lệnh (lệnh đọc, ghi ... cho MMC)
          + MMC_get_response: Kiểm tra lỗi khi giao tiếp MMC
          + MMC_exit: thoát khỏi chế độ giao tiếp MMC.

          Tôi xin nói qua về một số điều cơ bản:

          - Sector/ Cluster/ byte/ bit.
          Như đã biết, 1 byte = 8 bit
          Sector là một nhóm byte, thường là 512 byte (default cho thẻ nhớ FAT16,32)
          Cluster là một nhóm sector, tùy theo định dạng dung lượng thẻ nhớ. Nếu thẻ MMC32Mb thì 1 cluster = 1 sector. Tuy nhiên với SD512, 1 cluster = 2 sector = 1024byte(VD)

          Tại sao lại phân ra sector và cluster? Ans: Đối với ổ cứng nói chung, thẻ nhớ nói riêng, việc chia cluster và sector không khác gì việc chia nước ta ra thành 64 tỉnh thành, mỗi tỉnh thành vài huyện, mỗi huyện vài xã, mỗi xã vài thôn, mỗi thôn vài trăm người. Việc nhóm như vậy giúp hệ điều hành nói chung kiểm soát được toàn bộ ổ cứng, đặc biệt trong hoàn cảnh càng ngày dung lượng ổ càng lớn.

          Như vậy, để giao tiếp MMC, các bác chưa cần đến FAT vội, chỉ cần đọc được 1 sector = 512byte là ổn.
          Mồm chó vó ngựa

          Comment


          • #20
            - FAT16, FAT32 là gì?
            FAT = File Allocation Table: Bảng phân bố dữ liệu. Đối với FAT16, người ta dùng 16bit = 2byte để lưu ảnh của một file bất kỳ trên vùng dữ liệu vào bảng FAT. Còn đối với FAT32, người ta dùng 32 bit. Như vậy rõ ràng rằng, với 16bit, dung lượng hỗ trợ sẽ bé hơn nhiều lần so với FAT32.

            - Cấu trúc ổ cứng gần như giống hoàn toàn với MMC và SD, đều chia thành những sector, từ sector 0 đến sector xxxxxxx. (Mỗi sector = 512byte). Trong đó:

            Sector 0 là MBR: Master Boot Record
            Nếu đọc được sector này, các bác sẽ đọc được PBR ở đâu (sector thứ mấy), .v.v..v

            Giả dụ Sector x là PBR: Partion Boot Record
            Đọc sector này, các bác sẽ biết bảng FAT ở đâu, dung lượng (tính theo sector) là bao nhiêu; Root Entry ở đâu, gồm bao nhiêu entry, vùng dữ liệu tính từ sector nào....v.v.

            Vậy giả thiết tôi muốn đọc một file tên là MT.txt trên ổ cứng thì thao tác sẽ là:

            Tôi di chuyển đến Root Entry. Vùng này chứa thông tin về file trên ổ, kể cả file đã xóa. Tôi đọc từng entry, mỗi entry 32byte, so sánh tên trong mỗi entry với "MT". Nếu có, tôi sẽ đọc tiếp vùng bắt đầu (sector bắt đầu) của file là bao nhiêu, file đã xóa hay chưa. Giả thiết ổn cả, tôi sẽ nhảy đến sector của vùng bắt đầu file và tiến hành đọc file này. Dữ liệu sẽ có dạng hex. Nhưng đối với file txt, các bạn có thể chuyển sang ASCII.

            Câu hỏi sẽ là: khi nào thì biết file kết thúc, chả nhẽ cứ đọc một lèo sao? Trong root entry có cả điểm bắt đầu file và kết thúc file.

            Cần phân biệt có 2 kiểu ghi file lên thẻ. Ghi tuyến tính tức là ghi từ sector x, đến x+1... Và ghi kiểu frag, cứ chỗ nào có cluster trống thì ghi. Đối với ghi tuyến tính, ta dễ thực hiện và chỉ cần đọc từ sector bắt đầu đến sector cuối. Còn đối với ghi frag, hết 1 cluster ta phải đọc FAT để biết xem cluster tiếp theo nằm ở đâu, cho đến khi nào trên bảng fat có cluster kết thúc.

            Đối với người bắt đầu, ghi tuyến tính không phải là quá khó và đơn giản về mặt quản lý hơn là frag....
            Mồm chó vó ngựa

            Comment


            • #21
              (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!!!
              Mồm chó vó ngựa

              Comment


              • #22
                Nguyên văn bởi byte Xem bài viết
                vậy thì em sẽ làm từ MMC card trước vậy. Em khoái cái này lắm mà chưa làm được, mục đích cuối cùng của em chỉ là dùng AVR đọc và ghi dữ liệu vào bên trong đó thôi, bác nào làm rồi chỉ qua các bước cho người cơ bản phát. Nhân đây cho em hỏi luôn là cái MMC card nó dùng nguồn 3.3V, vậy dùng con IC nào để lấy dc điện áp đó vậy nếu không muốn dùng con zener. Thanks !!!!1
                Dùng zenner là tốt rồi chứ nhỉ? 3.6 V. Em thấy xài 2 con diode cũng được. 5-2x0.8 = 3.4V. Vậy cũng okie. Xài thêm một con chuyên dụng để làm nguồn 3.3V thì hơi phí.
                Email: - Mobil: tạm thời ngừng liên lạc 1 thời gian
                Giới thiệu website kiếm tiền trực tuyến & tăng thứ hạng website.

                Comment


                • #23
                  Mời bác Yankazaz tiếp tục, bác có phương pháp trình bày rất sư phạm.
                  Xin cảm ơn!
                  Một bông hồng cho những ai đang còn mẹ,
                  Đang còn mẹ để lòng vui sướng hơn ..

                  Comment


                  • #24
                    -Về phần mạch cứng:

                    Do thẻ nhớ sử dụng 3.3V, trong khi uC lại sử dụng nguồn 5V. Vấn đề là SPI gồm 4 đường: MOSI, MISO, SCK, SS. Đối với AVR, dòng 5V chấp nhận điện áp điều khiển từ 4,5V - 5,5V sử dụng công nghệ CMOS. Có nghĩa là: mức logic thấp từ 0-20%Vcc; mức logic cao từ 80-100%Vcc (nếu số liệu không chính xác, xin fix lại!).

                    Thẻ nhớ dùng 3.3V, có một trường hợp hay xảy ra như sau:
                    - Giả sử dùng điện trở pull up 2 con, chia điện áp tỷ lệ 5/3.3V để tín hiệu trên SCK, MOSI, SS thích hợp với thẻ nhớ. Đường MISO có điện áp từ 0-3.3V cắm vào uC. Trường hợp này có 2 vấn đề:
                    + Nếu tốc độ nhanh, việc chia trở có thể làm ảnh hưởng đến quá trình ghi, xung clock.
                    + Nếu uC dùng công nghệ CMOS, 3.3V từ MISO chưa đảm bảo mức logic high.
                    Tôi đã thử dùng chia trở, nhưng kết quả là không chạy, không hiểu tại sao

                    Phương án giải quyết đó là sử dụng một IC đệm ở giữa sử dụng nguồn 3.3V, đầu vào 5V, đầu ra là 3.3V (Opam hex buffer...v.v.) hoặc đầu vào 3.3V,đầu ra 5V.

                    - Tốt nhất, đó là sử dụng VXL chạy 3.3V như Atmega32L (VD). Vừa tiết kiệm nguồn 5V, vừa không sợ tín hiệu trên giao tiếp SPI, full compatitive giữa uC và MMC.
                    Nguồn 3.3V không nên chọn phương án tạm bợ (tính sụt trở...) do MMC ăn dòng vào cỡ 100mA, không kể còn các thành phần khác, thiết kế mạch, sụt giảm v..v..

                    Theo tôi, sử dụng MC34063A là hoàn toàn khả thi. Tôi đã phá một số router, người ta sử dụng cả 2 con MC để tạo nguồn 12V, 3.3V. Thêm nữa, do IC ngày nay phát triển theo hướng tiết kiệm năng lượng, IC 3.3V tiêu thụ công suât ít hơn nhiều so với 5V. Việc tự tạo một bộ nguồn 3.3V hoàn toàn hợp lý.

                    Tạo nguồn từ 3.3-12V dùng MC:
                    http://www.elecfree.com/electronic/m...-dc-converter/
                    Mồm chó vó ngựa

                    Comment


                    • #25
                      - Mạch sau tôi đã test, nguồn vào là 24V nhưng có thể sử dụng biến áp và chỉnh lưu cầu không vấn đề gì.

                      - Mạch trong trang http://www.elecfree.com/electronic/m...-dc-converter/ khi sử dụng có thể sẽ làm nóng MC. Nếu thấy làm như trên cho đơn giản thì tùy bác. Nhưng yên tâm rằng MC đủ khả năng nuôi thêm cái LCD, rơle .vv...v.
                      Nếu định làm thì qua chợ giời mua cuộn cảm loại 300uH để lọc đầu ra (thay thế trong sơ đồ). Trở 0.22 1W nếu không có thì mua loại 1 Ôm 1W cũng được.
                      Attached Files
                      Mồm chó vó ngựa

                      Comment


                      • #26
                        Tôi xin tiếp tục sau bữa ăn trưa (mỗi lần ăn, thành thói quen ta nên cầu chúa - cầu cho bát đũa sạch, cho tô cơm mới .v.v..v. >.<)
                        ============
                        MMC with Atmega32L:
                        ============
                        P.I: SPI initialize & Functions:

                        SPI Initialize:
                        - Atmega32 có các thanh ghi SPI sau:
                        [SPSR]: Status register thông báo các trạng thái khi giao tiếp SPI như:
                        + SPIF: Cờ ngắt
                        + WCOL: lỗi ghi SPI khi ghi dữ liêu vào thanh ghi data SPDR mà đang trong quá trình truyền nhận dữ liệu.
                        + SPI2X: bit rate dual mode

                        [SPCR]: Control register thanh ghi điều khiển bao gồm:
                        + cho phép ngắt SPI
                        + Enable SPI
                        + Chế độ master hay slave
                        + CPOL, CPHA: điều chỉnh dạng xung clock, data sẽ được đọc dựa trên đồ thị CPOL và CPHA. Điều này rất quan trọng, nếu như đối với một thiết bị nào đó (MMC chẳng hạn) chỉ đọc data trên sườn xuống của xung clock, trong khi ta lại thiết lập gửi ở sườn lên clock : chắc chắn là không giao tiếp được.
                        + Thiết lập baud rate cho SPI.

                        [SPDR]: thanh ghi dữ liệu. Thanh ghi này đơn giản như một thanh ghi dịch. Có nghĩa rằng, giả thiết A và B giao tiếp qua SPI. Khi A muốn gửi data X(8bits): [x7..x0] cho B, SPDR = X, thì chế độ sẽ như sau:
                        Đầu tiên, X được ghi vào SPDR, sau đó, x7 sẽ được đẩy lên chân MOSI, ngay khi đó, bit y0 ở thanh ghi SPI của MMC sẽ đẩy vào vị trí của x0. Minh họa như sau:

                        Bước 1: SPDR(Master) = [x7 x6 x5 x4 x3 x2 x1 x0]
                        SPDR(Slave) = [y7 y6 y5 y4 y3 y2 y1 y0]
                        Bước 2: SPDR(Master) = [x6 x5 x4 x3 x2 x1 x0 y7]
                        SPDR(Slave) = [y6 y5 y4 y3 y2 y1 y0 x7]
                        Như bạn thấy, vị trí của x7 và y7 có sự thay đổi, thanh ghi SPDR dịch đi một bít, như shift register dựa theo xung của clock. Sau 8 xung, data mơi được lấy ra.
                        Điều này có nghĩa là:
                        Khi gửi 1 byte đi theo SPI, đồng nghĩa với việc ta sẽ nhận 1byte từ SLAVE gửi lại theo đường MOSI. Do đó ai có ý định tái sử dụng SPDR cho đỡ tốn lệnh là hoàn toàn sai.
                        Một ví dụ cơ bản:
                        1 Master với 2 Slave, ban đầu master gửi 0x01 đi slave1, khi đó SPDR = 0x30 (ví dụ slave đang có giá trị đó). Master lại muốn gửi luôn cho slave 2 0x01 buộc phải nạp lại thanh ghi SPDR.

                        Vậy thủ tục initialize cho SPI hoàn toàn đơn giản:
                        SPI_init:
                        MOSI, SS, SCK: output
                        MISO : input
                        SPCR: [ SPIE SPE DORD MSTR CPOL CPHA SPR1 SPR0]
                        0 1 0 1 0 0 1 0
                        SPSR: Không cần thiết lập
                        SPDR: Không cần thiết lập
                        ret
                        Mồm chó vó ngựa

                        Comment


                        • #27
                          Hàm SPI send byte:
                          SPI_byte_transmit:

                          SPDR = data
                          Đọc thanh ghi SPSR đến khi nào bit SPIF = 1 (báo truyền nhận đã xong)
                          data = SPDR ( dữ liệu từ Slave gửi lại Master)

                          ret
                          SPI_byte_receive:
                          Do khi gửi là phải nhận nên hàm này không cần thiết.
                          Để giao tiếp với MMC, do tôi viết bằng assembly nên dài, xin phép viết một số hàm C sau:
                          int SPI_transfer (byte data)
                          {
                          SPDR = data;
                          while(SPIF !=1);
                          data = SPDR;
                          return data;
                          }
                          Hàm assembly có thể viết như sau:
                          SPI_255_transfer:
                          ser r16
                          rjmp SPI_transfer
                          SPI_zero_transfer:
                          clr r16
                          SPI_transfer:
                          out SPDR,r16
                          wait_SPI_transfer:
                          sbis SPDR,SPIF
                          rjmp wait_SPI_transfer
                          in r16, SPDR
                          ret
                          Last edited by yankazaz; 11-04-2008, 16:58. Lý do: Sửa lại cho chính xác (em chưa viết C nên thiếu dấu ;)
                          Mồm chó vó ngựa

                          Comment


                          • #28
                            Chúng ta đã khởi tạo và xây dựng hàm SPI transfer, tôi xin tiếp với MMC-SD hardware. Về bố trí chân cẳng của SD và MMC, chúng ta dễ dàng tìm thấy trên nhiều trang web khác nhau. Mạch phát triển cho AVR của Saigon tech cũng có phần này.

                            Để giao tiếp với thẻ nhớ, chúng ta phải biết được cấu trúc command đến thẻ nhớ như thế nào. Về tổng quan, SD và MMC có nhiều lệnh giống nhau, tuy nhiên SD có nhiều lệnh hơn. Trong giao tiếp SPI, chúng ta chỉ sử dụng một số lệnh cơ bản (có thể dùng cho cả SD và MMC) sau:

                            Command0: CMD0: đưa thẻ nhớ về trạng thái chờ Idle
                            Command1: CMD1: lệnh khởi tạo thẻ nhớ
                            Command16: CMD16: thay đổi kích thước gói dữ liệu (default: 512byte)
                            Command17: CMD17: đọc một gói dữ liệu (hay còn gọi là sector khi size = 512)
                            Command24: CMD24: Ghi một gói dữ liệu (tt)

                            Một lệnh gửi đến thẻ nhớ bao gồm 6 bytes, (tất nhiên là gửi bằng SPI transfer). Chức năng của các byte như sau:
                            - Byte5: Command Index: luôn bắt đầu bằng 01xx xxxx, với xx xxxx = tên command.
                            Ví dụ, đối với:
                            Command0, byte5 = 0100 0000 = 0x40
                            Command1, byte5 = 0100 0001 = 0x41
                            Command24: byte5 = 0101 1000 = 0x68

                            - byte4-byte1: 4byte này là tham số cho command. Đối với từng loại command, 4byte này có chức năng khác nhau với byte4 là MS byte và byte1 là LS byte.

                            - byte0: đây là byte CRC. Thông thường, ngoài lệnh cmd0, sử dụng CRC = 0x95 thì đối với các cmd khác, byte0 = 0x00. Đó là do khi bắt đầu, MMC or SD chưa sử dụng chế độ SPI mà đang ở chế độ mặc định. Sau khi gửi CMD0 chúng ta mới có thể tắt CRC. (tất nhiên có thể enable nó, nhưng không thực sự cần thiết.

                            Như vậy, chúng ta sẽ khởi tạo initialize MMC bằng các command trên. XIn các bác chờ chút tôi đi vệ sinh ^__________^!!!
                            Mồm chó vó ngựa

                            Comment


                            • #29
                              Bác vui tính quá, em stick luồng này lên cho mọi người đọ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


                              • #30
                                - Dạ em đi vệ sinh thật. Mất hơn 3 tiếng đồng hồ mới lên hạ sĩ 1 >.<

                                Chúng ta đang nói đến command gửi từ Atmega sang MMC, như đã nói ở bài trên, giao tiếp SPI có nghĩa là cho và nhận. MMC sẽ phản hồi lại command của uC bằng 3 response. Viết tắt là R1, R2, R3. Trong đó, các cấu trúc response như sau:
                                R1 = 0 x6 x5 x4 x3 x2 x1 x0. Trong đó, mỗi xi thông báo một trạng thái khác nhau như: (chú ý, bit 7 bao giờ cũng là 0)
                                x6: Lỗi tham số, sẽ set khi khung 4byte(đã nói ở trên) có lỗi
                                x5: Lỗi địa chỉ, sẽ set khi địa chỉ lỗi (chẳng hạn thẻ nhớ có 100 sector, các bác đọc sector 200 sẽ gây lỗi)
                                x4: Lỗi xóa (thường không có do cta không sử dụng lệnh xóa multi block) - c
                                x3: lỗi CRC (trừ lệnh CMD0, các lệnh khác không sử dụng CRC nên x3 clear)
                                x2: Xóa reset (cũng không gặp do khôgn sử dụng CMD)
                                x1: Thông báo MMC,SD có ở trạng thái chờ idle hay không. set khi idle

                                R2, R3: không sử dụng (vì không cần thiết)

                                - Một điều cần chú ý đó là: mỗi khi gửi một lệnh bất kỳ, MMC sẽ trả lại một response R1-3 nào đó, Trong các command tôi giới thiệu thì chỉ có response R1 mà thôi. Bởi vậy, sau mỗi command, chúng ta phải nhận dữ liệu response để xử lý.
                                (lại là assem, tôi không viết bằng C nhưng C rất dễ kiếm, các bác có thể tìm tha hồ!)

                                - Như vậy, đối với một cmd, chúng ta có các thông số:
                                Command(byte5) : 0x..
                                Frame (4 byte tiếp): tôi sẽ cất ở r20, r21, r22, r23 của uC
                                CRC (byte 0): 0x95 với CMD0 và 0x00 với các CMD khác.
                                response (1byte feedback)

                                - Lưu đồ khởi tạo như sau:

                                1/ Start

                                2/ Clear SS, gọi SPI_0_transfer 8 lần.
                                Ở đây, tôi gửi 0x00 qua SPI, mỗi lần 8 xung SCK, 8 lần là 64 xung SCK (lúc này SS đang clear có nghĩa MMC chưa kích hoạt, send 64 xung giúp MMC tự khởi tạo self initialize)

                                3/ Set SS, Gọi SPI_0_transfer 2 lần
                                Tôi set SS, chọn MMC và gửi tiếp 16 xung qua SCK giúp MMC chuẩn bị tinh thần về quê mẹ.

                                4/ Gửi CMD0 ( 0x40, 0x00, 0x00, 0x00, 0x00, 0x95) , chờ response. Nếu response = 0x01 là ok, nếu không là có lỗi
                                Ta nói qua một chút về 4byte frame, do CMD0 là lệnh control, không phải lệnh transfer nên 4byte này dĩ nhiên bằng 0x00. Chúng ta phải gửi CMD0 một số lần cho đến khi nhận được response hợp lý mới dừng lại (thường thì tôi làm 10 lần, còn chả biết là lần nào có response = 0x01 - không có ocsilloscope mà).

                                5/ Sau khi nhận được R1 = 0x01, ta mới gửi CMD41 là command1. Chức năng tôi đã giới thiệu ở trên. Chúng ta lại chờ một số lần để được R1 = 0x00 thì mới hoàn tất khởi tạo.

                                Đối với SD thì có một chút khác biệt, tôi đã thử làm như với MMC, cho dù có báo lỗi nhưng vẫn ghi được. Tuy nhiên, để tránh lỗi các bác phải thay đổi một chút, đó là gửi command 0x41, command 0x55 rồi mới check response. Khi nào R1 = 0x00 mới ok
                                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