Đề tài Đọc dữ liệu từ SD Card và hiển thị lên LCD sử dụng Kit DE2 của ALTERA

MỤC LỤC 1. Giới thiệu 1.1. Giới thiệu thành viên 1.2. Tổng quan hệ thống 1.3. Phần việc cụ thể 1.4. Kết quả đạt được 2. Giới thiệu công nghệ sử dụng 2.1. Phần cứng 2.1.1. SD Card 2.1.2. Kit DE2 2.2. Phầm mềm 2.2.1. Quatus II 2.2.2. Nios II 3. Sơ đồ khối của hệ thống 3.1. SD Card 3.2. Khối xử lý Nios II 3.3. Khối hiển thị 4. SD Card 4.1.1. Sơ đồ chân và các chế độ của SD Card 4.1.2. Định dạng lưu trữ trong SD Card 4.2. Các thanh ghi trong SD Card 4.2.1. OCR (operation conditions register) 4.2.2. CID 4.3. Cách gửi lệnh và nhận phản hồi 4.3.1. CRC 4.3.2. Command 4.3.3. Response 4.4. Phương pháp truyền nhận dữ liệu 4.4.1. Card Initialization and Card Initializatio 4.4.2. Data transfer Mode 4.4.3. Read Data 4.5. Đọc ghi một file dữ liệu vào trong SD card 4.5.1. Đọc một file 4.5.2. Ghi một file 5. LCD 16x2 6. Kết luận 7. Tài liệu tham khảo 8. Phụ lục A: Các hàm sử dụng trong hệ thống

pdf36 trang | Chia sẻ: lvcdongnoi | Lượt xem: 3150 | Lượt tải: 3download
Bạn đang xem trước 20 trang tài liệu Đề tài Đọc dữ liệu từ SD Card và hiển thị lên LCD sử dụng Kit DE2 của ALTERA, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
SD Card Page 1 TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI ESRC Lab 618 Đề tài: Đọc dữ liệu từ SD Card và hiển thị lên LCD sử dụng Kit DE2 của ALTERA Nhóm sinh viên thực hiện: Group 3- K52 Vũ Hữu Tiệp Lê Thái Hưng Nguyễn Duy Linh Lê Anh Văn Hà Nội, 1 - 2011 SD Card Page 2 SD Card Group 3 – K52 Contents 1. Giới thiệu ................................................................................................................. 4 1.1. Giới thiệu thành viên .......................................................................................... 4 1.2. Tổng quan hệ thống ............................................................................................ 5 1.3. Phần việc cụ thể .................................................................................................. 5 1.4. Kết quả đạt được ................................................................................................ 5 2. Giới thiệu công nghệ sử dụng ................................................................................... 5 2.1. Phần cứng ........................................................................................................... 5 2.1.1. SD Card ....................................................................................................... 5 2.1.2. Kit DE2 ....................................................................................................... 5 2.2. Phầm mềm.......................................................................................................... 6 2.2.1. Quatus II ...................................................................................................... 6 2.2.2. Nios II .......................................................................................................... 6 3. Sơ đồ khối của hệ thống ........................................................................................... 9 3.1. SD Card .............................................................................................................. 9 3.2. Khối xử lý Nios II............................................................................................. 10 3.3. Khối hiển thị ..................................................................................................... 10 4. SD Card.................................................................................................................. 10 4.1.1. Sơ đồ chân và các chế độ của SD Card....................................................... 10 4.1.2. Định dạng lưu trữ trong SD Card ............................................................... 16 4.2. Các thanh ghi trong SD Card ............................................................................ 22 4.2.1. OCR (operation conditions register) ........................................................... 23 4.2.2. CID ............................................................................................................ 23 4.3. Cách gửi lệnh và nhận phản hồi ........................................................................ 24 4.3.1. CRC ........................................................................................................... 24 SD Card Page 3 4.3.2. Command .................................................................................................. 25 4.3.3. Response .................................................................................................... 27 4.4. Phương pháp truyền nhận dữ liệu ..................................................................... 30 4.4.1. Card Initialization and Card Initializatio .................................................... 30 4.4.2. Data transfer Mode .................................................................................... 31 4.4.3. Read Data .................................................................................................. 32 4.5. Đọc ghi một file dữ liệu vào trong SD card ....................................................... 33 4.5.1. Đọc một file ............................................................................................... 33 4.5.2. Ghi một file................................................................................................ 33 5. LCD 16x2............................................................................................................... 34 6. Kết luận .................................................................................................................. 34 7. Tài liệu tham khảo .................................................................................................. 35 8. Phụ lục A: Các hàm sử dụng trong hệ thống: ......................................................... 36 SD Card Page 4 1. Giới thiệu 1.1. Giới thiệu thành viên Thông tin cá nhân của các thành viên Nhóm 1 Vũ Hữu Tiệp (Nhóm trưởng) Mobile: 0975 936 743 Mail: vuhuutiep@gmail.com Công việc chính : ngắt nút bấm và hiển thị LCD, cấu trúc bảng FAT. Nguyễn Duy Linh Mobile: 0979 468 289 Mail: linhnd89@gmail.com Công việc chính: Tìm hiểu cấu trúc bảng FAT. Lê Thái Hưng Mobile: 0972 186 249 Mail: hung.kstn.k52@gmail.com Công việc chính: Viết các thủ tục đọc dữ liệu trong SD Card. Lê Anh Văn Mobile: 0936 845 488 Mail: vanla3190@gmail.com Công việc chính: Tìm hiểu các chế độ, thanh ghi, thủ tục đọc thẻ SD. SD Card Page 5 1.2. Tổng quan hệ thống Đề tài lớn: Đọc dữ liệu từ SD card ( file ảnh, âm thanh) dung Kit DE2 và hiển thị lên màn hình VGA. Công việc của nhóm: Giao tiếp giữa Kit DE2 va SD card. Đọc file text trong SD card và hiển thị lên màn hình LCD. 1.3. Phần việc cụ thể - Tìm hiểu về cấu trúc SD card, cấu trúc bảng FAT, các thanh ghi, cách nhận và gửi lệnh, phương pháp truyền nhận dữ liệu. - Xây dựng hệ thống NIOS II điều khiển, thực hiện lệnh giao tiếp với SD card. - Giao tiếp và hiển thị lên màn hình LCD. 1.4. Kết quả đạt được Giao tiếp với SD card dung SD Mode, đọc file txt và hiển thị lên màn hình LCD. Dùng phím bấm để tìm file và chọn file cần hiển thị. 2. Giới thiệu công nghệ sử dụng 2.1. Phần cứng 2.1.1. SD Card SD card là thiết bị lưu trữ rất phổ biến hiện nay được sử dụng cho nhiều mục đích khác nhau như ảnh, film, dữ liệu…trên nhiều thiết bị khác nhau ( máy ảnh số, máy quay phim, máy nghe nhạc, điện thoại…). Trong đề tài này, chúng tôi sử dụng 1 SD Card có dung lượng 2G, định dạng FAT16. 2.1.2. Kit DE2 DE2 ( Development and Education ) la một công cụ cho việc thiết kế nâng cao các thiết bị đa phương tiện, lưu trữ và mạng. DE2 sử dụng công nghệ state-of- the-art trong cả phần cứng và các công cụ thiết kế nhờ máy tính giúp mở rộng phạm vi ứng dụng. DE2 có nhiều tính năng phù hợp với cả việc sử dụng trong các phòng lab và các hệ thống số tinh vi. Altera cung cấp các công cụ hỗ SD Card Page 6 trợ phù hợp cho DE2, gồm có các hướng dẫn, các bài lab trên DE2, và các bài minh họa… 2.2. Phầm mềm 2.2.1. Quatus II Trong đề tài, chúng tôi sử dụng SOPC Builder của Quatus II để tạo ra 1 vi xử lý mềm. 2.2.2. Nios II Để hiểu Nios II là chương trình dùng để làm gì, chúng ta hãy làm một phép so sánh. Chẳng hạn, với vi điều khiển PIC, IC(phần cứng) được so sánh với công việc mà SOPC Builder tạo ra còn PICC(chương trình lập trình cho PIC) sẽ được so sánh với Nios II. Vậy, Nios II chính là chương trình lập trình cho vi xử lý mềm mà SOPC tạo ra. Hình 2.1. Tổng quan về SOPC và Nios II Khi học một vi điều khiển mới, chúng ta sẽ quan tâm đến một số vấn đề: - Điều khiển vào ra - Trễ - Ngắt Bây giờ chúng ta sẽ đi vào từng vấn đề. 2.2.2.1. Điều khiển vào ra trong Nios II Trong mục này, chúng ta sẽ quan tâm đến việc đọc và ghi dữ liệu vào các thanh ghi như thế nào. SD Card Page 7 - Để tìm địa chỉ của các thanh ghi, chúng ta tìm các định nghĩa của chúng trong file system.h trong thư mục /projectname_syslib[system_0]/Debug/system_desciption Ví dụ #define BUTTON_PIO_BASE 0x00681090 //Định nghĩa địa chỉ cho các nút bấm #define LED_GREEN_BASE 0x00681080 //Định nghĩa địa chỉ cho các LED GREEN #define LED_RED_BASE 0x00681070 - Tiếp theo, chúng ta quan tâm đến 2 macro đọc / ghi dữ liệu từ / vào các thanh ghi. Bảng 2.1. Macro đọc ghi dữ liệu trong Nios II Macro Cách sử dụng IORD(BASE, REGNUM) Đọc giá trị của thanh ghi tại Offset REGNUM trong 1 device có địa chỉ cơ sở là BASE. IOWR(BASE, REGNUM, DATA) Ghi giá trị DATA vào thanh ghi tại địa chỉ offset REGNUM trong 1 device có địa chỉ BASE. BUTTON, SWITCH, LEDR, LEDG có REGNUM = 0 và được định nghĩa lại trong thư viện altera_avalon_pio_regs.h cho dễ sử dụng: #define IORD_ALTERA_AVALON_PIO_DATA(base) IORD(base, 0) #define IOWR_ALTERA_AVALON_PIO_DATA(base, data) IOWR(base, 0, data) 2.2.2.2. Hàm trễ Trong Nios II có 2 hàm trễ được xây dựng sẵn là msleep và usleep SD Card Page 8 2.2.2.3. Xử lý ngắt trong Nios II Ngắt trong Nios II khá giống với ngắt trong PIC. Với phạm vi của đề tài, chúng tôi chỉ thực hiện ngắt nút bấm. Xét đoạn code sau: #include "altera_avalon_pio_regs.h" #include "system.h" #include volatile int button = 0; void buttons_isr( void* context, alt_u32 id) { volatile int *value = (volatile int*) context; *value = IORD_ALTERA_AVALON_PIO_EDGE_CAP( BUTTON_PIO_BASE ); IOWR_ALTERA_AVALON_PIO_EDGE_CAP( BUTTON_PIO_BASE, 0 ); } void buttons_interrupt_enable() { IOWR_ALTERA_AVALON_PIO_EDGE_CAP( BUTTON_PIO_BASE, 0 ); //kiem tra //status xem ngat nao xay ra va ghi 0x0 de tai thiet lap ngat alt_irq_register( BUTTON_PIO_IRQ, (void *) &button, buttons_isr ); IOWR_ALTERA_AVALON_PIO_IRQ_MASK( BUTTON_PIO_BASE, 0x3 ); //Cho //phep ngat 2 phim cuoi } Đoạn code trên thực hiện công việc ngắt nút bấm, khi bấm 1 trong 4 nút KEY0-KEY3. - Hàm void buttons_isr( void* context, alt_u32 id) là chương trình con phục vụ ngắt. Khi có ngắt nút bấm xảy ra, nút được bấm sẽ tương ứng với giá trị trả về của value, cụ thể: Bảng 2.2. Giá trị tương ứng với các nút bấm khi khởi tạo ngắt Key is pressed Value KEY0 0x01 KEY1 0x02 KEY2 0x04 KEY3 0x08 - Hàm void buttons_interrupt_enable() là hàm khởi tạo ngắt. Ta quan tâm tới một hàm quan trọng: SD Card Page 9 alt_irq_register( BUTTON_PIO_IRQ, (void *) &button, buttons_isr ); Câu lệnh này thực hiện công việc: Khi có ngắt nút bấm, thực hiện công việc được mô tả trong chương trình con phục vụ ngắt void buttons_isr( void* context, alt_u32 id), giá trị trả về của hàm này được lưu trong biến toàn cục button. Để xác định nút bấm nào được enable ngắt, ta xét câu lệnh cuối cùng: IOWR_ALTERA_AVALON_PIO_IRQ_MASK( BUTTON_PIO_BASE, DATA ); Theo thứ tự từ KEY3 đến KEY0, để enable ngắt, ta cho bit thứ 4, 3, 2, 1 của DATA bằng 1. 3. Sơ đồ khối của hệ thống Avalon bus NIOS II Core LCD Controler SRAM Controler SD card Controler SDRAM Controler SD Card LCD Key Hình 3.1. Sơ đồ khối của hệ thống 3.1. SD Card SD Card có dung lượng 2G, có chứa sẵn một vài file text. SD Card Page 10 3.2. Khối xử lý Nios II Thực hiện công việc điều khiển, giao tiếp với thẻ và LCD. 3.3. Khối hiển thị LCD 1602 là LCD có sẵn trong kit DE2.. 4. SD Card 4.1.1. Sơ đồ chân và các chế độ của SD Card 4.1.1.1. Sơ đồ chân Giao tiếp trong SD Card dựa trên giao tiếp bằng 9 chân ( Clock, Command, 4 chân Data, 3 chân nguồn) có tần số làm việc lớn nhất là 50MHz sử dụng điện áp thấp. Khối điều khiển giao tiếp SD Card cũng hỗ trợ giao tiếp với thẻ Multimedia ( thực chất khác biệt giữa SD Card và Multimedia Card là quá trình khởi tạo) Hình 4.1. Sơ đồ chân thẻ SD SD Card Page 11 Bảng 4.1. Các chân trong 2 chế độ của SD Card Pin SD mode SPI mode Name Desciption Name Description 1 CD/DAT3 Card detect/Data line[Bit 3] CS Chip Select 2 CMD Command/Response DI Data in 3 VSS1 Supply voltage ground VSS Supply voltage ground 4 VDD Supply voltage VDD Supply voltage 5 CLK Clock SCLK Clock 6 VSS2 Supply voltage ground VSS2 Supply voltage ground 7 DAT0 Data line[Bit 0] DO Data out 8 DAT1 Data line[Bit 1] 9 DAT2 Data line[Bit 2] 4.1.1.2. Các chế độ của SD Card  SD mode SD mode có 4 đường truyền dữ liệu Data[0]- Data[4] và 1 đường truyền lệnh CMD. Giao tiếp qua SD bus chủ yếu dựa trên các lệnh và tín hiệu phản hồi , khởi tạo bằng bit bắt đầu và bit kết thúc.  Lệnh (command) : là tín hiệu điều khiển việc giao tiếp được host truyền đi tới các SD card. 1 command gồm 48bits chứa mã lệnh, các đối số và mã CRC(7). Comand được truyền trên đường CMD.  Phản hồi (response): là tín hiệu do Card gửi trả lại host sau mỗi command nhận trước đó. Cấu trúc của Response thường gồm 48 hoặc 136 bits bao gồm nội dung phản hồi và mã CRC( 7 hoặc 16). Tín hiệu phản hồi cũng được truyền qua đường CMD. SD Card Page 12 Hình 4.2. Định dạng gói Respones  Dữ liệu (data): dữ liều được truyền hai chiểu từ card đến host và ngược lại. Host trong chế độ SD sử dụng 1 hoặc cả 4 đường Data để truyền dữ liệu. Dữ liệu luôn được truyền theo từng khối (block), kết thúc mỗi block là mã CRC. SD Card hỗ trợ truyền từng block và truyền nhiều block trong một lượt. Có 2 dạng gói dữ liệu được sử dụng trong SD mode o 8 bit-width: dữ liệu được truyền theo từng byte, trong đó byte LSB (Least Significant Byte) được gửi trước, MSB cuối cùng. Tuy nhiên trong từng byte , MSB (Most significant bit) lại được gửi trước và LSB cuối cùng. SD Card Page 13 Hình 4.3. Định dạng gói dữ liệu – dữ liệu thông thường SD Card Page 14 o Wide width data: Hình 4.4. Định dạng gói dữ liệu – độ rộng dữ liệu  Quá trình đọc: bắt đầu khi host gửi yêu cầu đến card, card sẽ gửi trả bằng tín hiệu Response sau đó dữ liệu sẽ được card gửi (tùy vào lệnh mà dữ liệu sẽ gồm nhiều block hay chỉ 1 block) , cuối cùng host phát lệnh dừng đọc Hình 4.5. Quy trình đọc một block dữ liệu SD Card Page 15 Đọc nhiều block: Hình 4.6. Quy trình đọc nhiều block dữ liệu  Quá trình ghi: tương tự như quá trình đọc, sau khi host gửi command , nếu card gửi response chấp nhận và host sẽ gửi dữ liệu Hình 4.7. Quy trình ghi một block dữ liệu Ghi nhiều block: Hình 4.8. Quy trình ghi nhiều gói dữ liệu  SPI mode: Chế độ SPI sử dụng một đường dữ liệu và 1 đường tín hiệu CS nên có nhược điểm là tốc độ chậm hơn chế độ SD mode. Chế độ SPI trong giao tiếp với SD Card được thực hiện dựa trên chế độ SD Mode ( sử dụng phương thức giao tiếp và một số lệnh). Khác với chế độ SD Mode dựa trên SD Card Page 16 lệnh (command) và chuỗi bit truyển, dùng bit khởi đầu và kết thúc; SPI Mode chủ yếu dựa trên cơ sở byte .Mỗi lệnh hay khối dữ liệu đều tạo bởi các byte và căn theo chu kì của 8 xung clock (tín hiệu CS). Giao tiếp giữa host và card được điều khiển bới host (host điều khiển xung CS). Qua trình đọc và ghi trong chế độ SPI giống như trong chế độ SD. 4.1.2. Định dạng lưu trữ trong SD Card Trong project ta chỉ quan tâm đến FAT16 do dung lượng thẻ nhớ nhỏ hơn 2GB.Với SD Card, ta chỉ dùng 1 phân vùng partion (tức là chỉ dùng mục 1.1.2.2) Đơn vị lưu trữ nhỏ nhất trên đĩa là sector gồm 512 byte. Ta chỉ thao tác trên đơn vị này mà không thể đọc ghi dữ liêu từng đơn vị byte một. Để quản lí đĩa và theo dõi sector nào đã sử dụng và sector nào còn trống có thể cấp phát cho các file mới, DOS sử dụng một cấu trúc gọi là bảng FAT. FAT là viết tắt của "File Allocation Table" tạm dịch là "Bảng cấp phát tập tin". FAT được giới thiệu lần đầu tiên vào năm 1977 với phiên bản FAT12. Sau đó là các phiên bản FAT16 và FAT32. 4.1.2.1. Cấu trúc ổ đĩa cứng sử dụng FAT16 4.1.2.1.1. Master Boot Record: Nằm ở sector đầu tiên của đĩa cứng ở cylinder 0, Head 0, Sector 1. Nó chứa đoạn code đầu tiên mà máy tính chạy sau khi khởi động và bắt đầu quản lý các chương trình trong đĩa cứng. Nó còn chứa bảng phân vùng để xác định các phân vùng khác nhau trong đĩa cứng. Nếu có lỗi xảy ra ở 512 byte này thì nguy cơ thay ổ cứng mới là rất lớn ! Bảng 4.2. Master Boot Record Offset Mô tả Kích thước 000h Mã thực thi ( boots computer) 446 bytes 1BEh Chỉ mục phân vùng đầu tiên 16 byte 1Ceh Chỉ mục phân vùng thứ hai 16 byte 1Deh Chỉ mục phân vùng thứ ba 16 byte 1Eeh Chỉ mục phân vùng thứ tư 16 byte 1Feh 2 byte đánh dấu ( 55h AAh) 2 byte SD Card Page 17 4.1.2.1.2. Chỉ mục phân vùng (Partion) Bảng 4.3. Chỉ mục phân vùng Offset Mô tả Kích thước 00h Trạng thái hiện thời của phân vùng( 00h= không hoạt động, 80h= hoạt động) 1 byte 01h Bắt đầu của phân vùng( Head) 1 byte 02h Bắt đầu của phân vùng( Cylinder/ Sector) (bảng dưới) 1 word 04h Loại phân vùng(bảng dưới) 1 byte 05h Kết thúc của phân vùng(Head) 1 byte 06h Kết thúc của phân vùng( Cylinder/ Sector) 1 word 08h Số sector giữa MBR và sector đầu tiên của phân vùng 1 double word 0Ch Số sector trong phân vùng 1 double word 4.1.2.1.3. Mã hóa cylinder/Sector Để lấy được Sector từ mục trên ta thực hiên phép AND với 3Fh ( lấy 6 bit cuối) Để lấy được số Cylinder ta lấy byte cao thực hiện phép OR với byte thấy đã được dịch trái 2 lẩn sau khi AND với C0h Bảng 4.4. Cấu trúc Cylinder/Sector 15 14 … 9 8 7 6 5 … 1 0 Cylinder bit 7 -> 0 Cylinder bit 9+8 Sector bit 5->0 4.1.2.1.4. Loại Phân vùng Bảng 4.5. Loại phân vùng Giá trị Mô tả 00h Không sủ dụng 01h FAT12 04h FAT16 (phân vùng nhỏ hơn 32MB) 05h Phân vùngMS-DOS mở rộng 06h FAT 16( phân vùng lớn hơn 32MB) 0Bh FAT32 0Ch Giống như 0Bh, nhưng sử dụng LBA1 13h Extensions SD Card Page 18 0Eh Giống như 06h, nhưng sử dụng LBA1 13h Extensions 0Fh Giống như 05h, nhưng sử dụng LBA1 13h Extensions 4.1.2.1.5. Đọc nhiều phân vùng: Vì FAT 16 giới hạn 2GB cho mỗi partion, vì vậy nên đĩa cứng thường phải quản lý nhiều phân vùng . Phân vùng đầu tiên là phân vùng chính( primary partion) và các phân vùng còn lại được lưu trong phân vùng mở rộng ( Extended Partition). Chỉ mục phân vùng đầu tiên chỉ đến phân vùng chính, chỉ mục thứ hai trong bảng lưu địa chỉ phân vùng mở rộng. Để đọc các phân vùng này đầu tiên phải đọc sector đầu tiên của các phân vùng mở rộng, Sector này giống hệt như MBR nhưng không có các đoạn code. Và trong bảng chỉ mục phân vùng, chỉ mục phân vùng đầu tiên sẽ chỉ đến phân vùng mở rộng thứ hai, chỉ mục phân vùng tiếp theo sẽ chỉ đến phân vùng mở rộng khác giống như trên. Trong phân vùng mở rộng, địa chỉ sẽ được tính lại từ bảng MBR mới  MBR của đĩa cứng: o Chỉ mục thứ nhất: Chỉ đến phân vùng 1 o Chỉ mục thứ hai: Chỉ đến phân vùng mở rộng  MBR của phân vùng mở rộng: o Chỉ mục thứ nhất: Chỉ đến phân vùng 2 o Chỉ mục thứ hai: Chỉ đến các phân vùng khác sau phân vùng 2 Tại đây ta có Giá trị giữa MBR đến sector đầu tiên của phân vùng ( lưu tại địa chỉ offset 08h trong bảng Chỉ mục phân vùng) và Số Sector của phân vùng (lưu tại địa chỉ offset Och) sẽ được tính từ bảng MBR mới mà không phải từ MBR của đĩa cứng Nếu muốn đọc phân vùng tiếp theo ta lại đến bảng MBR kế  MBR của các phân vùng tiếp: o Chỉ mục thứ nhất: Chỉ đến phân vùng 3 o Nếu không có phân vùng nào nữa thì để trống SD Card Page 19 4.1.2.2. Cấu trúc của Partion sử dụng FAT16 4.1.2.2.1. Mô tả đĩa cứng FAT 16 Bảng 4.6. Loại phân vùng Offset Mô tả Bắt đầu của phân vùng Boot Sector Bắt đầu + số sector được định trước (reserved sector) Bảng FAT Bắt đầu + số sector được định trước + ( Số sector trong bảng FAT*2) Bảng Root (Root Directory Entry) Bắt đầu + số sector được định trước + ( Số sector trong bảng FAT*2) + ((Số Root Directory Entry lớn nhất*32)/ Số byte trong 1 Sector) Vùng dữ liệu (Bắt đầu tại cluster thứ 2) 4.1.2.2.2. FAT16 Boot Record Nằm ở sector đầu tiên của tất cả các partion Bảng 4.7. FAT16 Boot Record Offset Ý nghĩa Kích thước 00h Lệnh nhảy đến mã khởi động 3 bytes 03h Tên hãng sản xuất 8 bytes 0Bh Số byte trong sector 1 word 0Dh Số sector trong 1 cluster 1 byte 0Eh Sector được bảo vệ 1 word 10h Số bản copy của bản FAT 1 byte 11h Số chỉ mục trong phần root 1 word 13h Số sector trong phân vùng nhỏ hơn 32MB 1 word 15h Mô tả phương tiện lưu trữ ( f8h cho đĩa cứng) 1 byte 16h Số sector cho bảng FAT 1 word 18h Số sector trong 1 track cho ngắt 13h 1 word 1Ah Số head 1 word 1Ch Số sector ẩn trong phân vùng 1 double word 20h Số sector trong phân vùng 1 double word 24h Số ổ luận lý trong phân vùng 1 word 26h Extended signature(29h) 1 byte SD Card Page 20 27h Số serial của phân vùng 1 double word 2Bh Tên của phân vùng 11 byte 36h Tên loại FAT ( FAT12 hoặc FAT 16) 8 byte 3Eh Code 448 byte 1FEh 2 byte đánh dấu ( 55h AAh) 2 byte 4.1.2.2.3. Bảng FAT - Ý nghĩa của Cluster Một Cluster là một tập hợp các Sector chứa thông tin trong đĩa cứng.Một Cluster 16K chứa 32 Sector (512*32=16384). Mỗi một Cluster được biểu diễn bằng một ô trong bảng FAT. Khi nhìn vào số của các ô trong bảng FAT ta có thế biết được cluster đó đã có dữ liệu hay chưa, dữ liệu đã kết thúc hay chưa, nếu chưa thì ở cluster nào sau nó. Tất cả dữ liệu trong 1 phân vùng đều bắt đàu từ cluster thứ hai (ngay sau Root Directory). Nếu ô có giá trị 0 thì cluster ứng với nó không có dữ liệu, nếu ô có giá trị FFFFh thì đó là ô cuối cùng trong chuỗi dữ liệu. Mỗi một file trong thẻ SD phải được lưu bắt đầu từ 1 cluster. Ngoài ra file có thể trải dài trên nhiều cluster khác nhau (không nhất thiết liên tục) Bảng FAT lập ra để chỉ ra khi đọc 1 file, chương trình cần đọc ở những cluster nào. Bảng 4.8. Ý nghĩa của các mã FAT Mã FAT Ý nghĩa 0000h Cluster trống 0002h-FFEFh Cluster đã có dữ liệu, chỉ đến cluster tiếp theo của file FFF0h-FFF6h Cluster định trước ( reserved cluster) FFF7h Cluster lỗi FFF8h-FFFFh Cluster đã có dữ liệu, Cluster cuối cùng của file Ví dụ: bảng FAT có 2 file, 1 file ở cluster (2,3,6), file còn lại ở (4,7) 2 3 4 5 6 7 8 9 10 0003 0006 0007 0000 FFFF FFFF 0000 0000 0000 SD Card Page 21 4.1.2.2.4. Bảng Root: Bảng 4.8. Bảng Root Name Offset Size Description DIR_Name 0 11 Tên của file DIR_Attr 11 1 Mô tả file ATTR_READ_ONLY 0x01 ATTR_HIDDEN 0x02 ATTR_SYSTEM 0x04 ATTR_VOLUME_ID 0x08 ATTR_DIRECTORY 0x10 ATTR_ARCHIVE 0x20 ATTR_LONG_NAME ATTR_READ_ONLY| ATTR_HIDDEN| ATTR_SYSTEM| ATTR_VOLUME_ID DIR_NTRes 12 1 Luôn khởi tạo là 0 DIR_CrtTimeTenth 13 1 Có giá trị hợp lệ từ 0 – 200. Tương đương với 2 giây (10 milisecond – một đơn vị). Chứa giá trị giây của thời điểm tạo file DIR_CrtTime 14 2 Chứa thời điểm tạo file DIR_CrtDate 16 2 Chứa ngày tạo file DIR_LstAccDate 18 2 Chứa thời điểm cuối cùng truy nhập DIR_FstClusHI 20 2 Chứa 2 byte đầu của địa chỉ file (hay 2 byte đầu tiên của số thứ tự của sector đầu tiên chứa file). Luôn luôn là 0 đối với FAT16 DIR_WrtTime 22 2 Chứa thời gian cuối cùng ghi thẻ DIR_WrtDate 24 2 Chứa ngày cuối cùng ghi thẻ DIR_FstClusLO 26 2 Chứa 2 byte thấp của địa chỉ file. DIR_FileSize 28 4 Kích thước file. DIR_Name[0]: Nhận giá trị 0x00, 0xE5: Entry này rỗng. Nếu tên file bắt đầu là 0xE5 thì DIR_Name[0] = 0x05. DIR_Name[0] không thể là 0x20. Kí tự ‘.’ Không được biểu diễn trong trường này Ngoài ra, DIR_Name không có các kí tự sau: SD Card Page 22  Giá trị nhỏ hơn 0x20 ngoại trừ kí tự đăc biệt 0x05 như nói ở trên  0x22, 0x2A, 0x2B, 0x2C, 0x2E, 0x2F, 0x3A, 0x3B, 0x3C, 0x3D, 0x3E, 0x3F, 0x5B, 0x5C, 0x5D, 0x7C Date and Time: Ngày: gồm có 2 byte (tức 16 bit) dựa trên cơ sở ngày 01/01/1980 như sau  Bit 0 – 4: Ngày: giá trị 1 – 31  Bit 5 – 8: Năm: giá trị từ 1 – 12  Bit 9 – 15: Sô lượng năm tính từ 1980. Khoảng giá trị 0 – 127 (tức là từ 1980 – 2107) Thời gian: gồm có 2 byte (16 bit)  Bit 0 – 4: cứ 2 giây / đơn vị. Giá trị hợp lệ 0 – 29 (tức là 0 – 58 giây)  Bit 5 – 10: Phút: giá trị từ 0 – 59  Bit 11 – 15: Giờ: giá trị hợp lệ từ 0 –23 Như vậy, giá trị có thể biểu diễn được từ 00:00:00 đến 23:59:58 4.2. Các thanh ghi trong SD Card Bảng 4.9. Các thanh ghi của SD Card Tên Độ rộng Mô tả CID 128 Chỉ số của Card; nếu có nhiều Card, mỗi Card sẽ có một CID khác nhau. RCA 16 Relative card address; địa chỉ hệ thống của một Card. DSR 16 Driver Stage Register; để cấu hình driver đầu ra của Card CSD 128 Card Specific Data; thông tin về điều kiện hoạt động của Card. SCR 64 SD Configuration Register; OCR 32 Thanh ghi điều kiện hoạt động SSR 512 SD Status; thông tin về các tính chất của Card. CSR 32 Card Status; Ta chỉ quan tâm tới 2 thành ghi đặc biệt: OCR và CID. SD Card Page 23 4.2.1. OCR (operation conditions register) Là 1 thanh ghi 32 bit lưu thông tin về điện áp của card. Thêm vào đó, thanh ghi này còn bao gồm cả các bit thông tin trạng thái (status information bits). 1 bit trạng thái được set nếu thủ tục khởi tạo card được hoàn thành. Thanh ghi này còn bao gồm 1 bit trạng thái khác chỉ ra trạng thái lưu trữ của card sau khi (set power up status bit).  Lưu thông tin điện áp Bit 7 của OCR được định nghĩa cho Dual Voltage Card và mặc định đặt tới 0. Nếu một Dual Voltage Card không nhận CMD8, bit 7 OCR trong response sẽ là 0 và ngược lại.  2 bit trạng thái (status information bits) Bit 31: bit trạng thái cấp điện của card . Bit này = 1 nếu thủ tục cấp điện cho card đã được hoàn thành. Bit 30: bit lưu trạng thái lưu trữ (CCS). =1 nếu card là High Capacity SD Memory Card và ngược lại. bit này là hợp lệ nếu card được cấp điện và bit 30 = 1. Sở dĩ có bit này vì có 1 chuẩn riêng cho High Capacity SD Memory Card. 4.2.2. CID Là 1 thanh ghi 128 bit. Nó chưa thông tin để nhận dạng card (card indentification information) được sử dụng trong pha card identification. Mỗi card (trong hệ thống có thể có nhiều card) sẽ có một chỉ số duy nhất. Cấu trúc của thanh ghi CID được định nghĩa trong bảng sau Bảng 4.10. Các trường CID Tên Trường Độ rộng CID slice Manufacturer ID MID 8 [127:120] OEM/Application ID O OID 16 [119:104] Product name PNM 40 [103:64] 1 vài trường khác SD Card Page 24 4.3. Cách gửi lệnh và nhận phản hồi 4.3.1. CRC CRC được dùng làm mã chống lỗi cho 1 từ mã cần truyền đi. Chúng được tính toán và thêm vào cuối từ mã cần truyền. Khi nhận, máy thu sẽ tính toán kiểm tra có lỗi không. Nếu có, có thể dừng thao tác hoặc yêu cầu đầu thu gửi lại. Việc tính toán mã CRC được thực hiện như sau: - Xét 1 từ mã sinh độ dài m. Xét đa thức sinh tương ứng G(x) có bậc m-1. - Với mỗi từ mã cần truyền đi có độ dài n. Viết đa thức từ mã tương ứng M(x). - Đa thức CRC là đa thức dư R(x) trong phép chia ( ) ( ), là một đa thức bậc m-2. - Từ được truyền đi là từ tương ứng với đa thức ( ) ( ) ( ) - Khi kiểm tra, nếu không có lỗi trong khi truyền, đa thức T(x) sẽ chia hết cho G(x). Ta làm một ví dụ đơn giản để tính mã CRC trong trường hợp m = 4. 10010001110000 1011 00100001110000 1011 001101110000 Từ mã ban đầuthêm 4 bit 0 Từ mã sinh - số chia Kết quả (lại đưa vào phép tính tiếp theo) Số chia được dịch sang phải cho tới khi gặp bit 1 đầu tiên(màu đỏ) ……... Hình 4.9. Ví dụ về mã CRC Kết quả của phép tính thứ nhất lại được đưa vào làm số bị chia cho phép tính tiếp theo. Lúc này ta dịch số chia sang trái cho đến khi gặp bit 1 đầu tiên tương ứng của số bị chia như trong ví dụ trên. Quá trình được dừng lại khi tất cả các bit từ bit thứ 4 trở về trước của kết quả bằng 0. Chúng ta có thể nhận thấy đây cũng chính là cách thực hiện phép chia đa thức trong hệ module 2. Trong SD Card, CRC được sử dụng để bảo vệ Command, respones và việc truyền dữ liệu khỏi lỗi trên bus SD Card. CRC được tạo ra cho mọi Command và kiểm tra cho mọi response trên đường CMD. Đối với khối dữ liệu (data blocks), mỗi khi chuyển 1 khối dữ liệu thì một CRC cũng được sinh ra và kèm vào cuối của đoạn Command, response hoặc đoạn dữ liệu đó. Có 2 loại mã CRC được sử dụng trong SD Card là: SD Card Page 25  CRC7 CRC7 được sử dụng cho tất cả các Command và tất cả các response ngoại trừ kiểu response R3. CRC7 là một giá trị 7-bit và được tính như sau: Đa thức sinh: G(x) = Đa thức từ mã: M(x) = ( ) ( ) ( ) CRC[6…0] = phần dư ( ( ) ) ( )  CRC16 Trong trường hợp 1 đường DAT được sử dụng, CRC16 được sử dụng để bảo vệ 1 khối dữ liệu được chuyển đi. CRC16 là một giá trị 16-bit và được tính như sau: Đa thức sinh: G(x) = Đa thức từ mã: M(x) = ( ) ( ) ( ) CRC[15…0] = phần dư ( ( ) ) ( ) 4.3.2. Command Để điều khiển SD Card, Vi xử lý sẽ gửi các Command đến SD Card qua đường CMD trong chế độ SD. Đối với SD Card, có rất nhiều Command được sử dụng, tuy nhiên, trong giới hạn đề tài, chúng ta chỉ xét một vài Command được sử dụng. Chúng ta sẽ đi vào tìm hiểu các kiểu Command. 4.3.2.1. Command Types (Các kiểu Command) Có 4 kiểu Command được định nghĩa để điều khiển SD Card:  Broadcast Command (bc), không có response.  Broadcast Commands with Response (bcr)  Addressed (point-to-point) Commands (ac): không truyền dữ liệu trên đường DAT  Addressed (point-to-point) Data Transfer Commands (adtc): có truyền dữ liệu trên đường DAT. 4.3.2.2. Command Format Độ dài của mỗi Command là 48 bit. Cấu trúc của mỗi Command như sau: SD Card Page 26 Bảng 4.11. Cấu trúc mỗi Command 0 1 bit5…bit0 bit31…bit0 bit6…bit0 1 Start bit, always 0 Host Số hiệu cmd Argument CRC7 End bit, always 1. 4.3.2.3. Command Classes Có rất nhiều Command, chúng được chia thành 11 loại theo bảng sau: Bảng 4.12. Card Command Classes 0 1 2 3 4 5 6 7 8 9-11 Số hiệu CMD Basic Reserved Block Read Reserved Block Write Erase Write Protection Lock Card Application Specific Reserved CMD0 + CMD2 + CMD3 + CMD4 + CMD7 + CMD9 + CMD10 + CMD12 + CMD13 + CMD15 + CMD16 + + + CMD17 + CMD18 + CMD24 + CMD25 + CMD27 + CMD28 + CMD29 + CMD30 + CMD32 + CMD33 + CMD38 + CMD42 + CMD55 + CMD56 + ACMD6 + SD Card Page 27 ACMD13 + ACMD22 + ACMD23 + ACMD41 + ACMD42 + ACMD51 + 4.3.2.4. Thông tin chi tiết về các Command Các bảng sau mô ta chi tiết một số lệnh được sử dụng trong đề tài: Bảng 4.13. Basic Command Số hiệu cmd Kiểu Argument Kiểu rsp Tóm tắt Mô tả lệnh CMD0 Bc [31:0] bit đệm =’0’ - Go_idle_state Reset tất cả các thiết bị về trạng thái rỗi CMD1 Yêu cầu thẻ gửi nội dung thông tin của thanh ghi OCR CMD2 Bcr [31:0] bit đệm =’0’ R2 All_send_cid Hỏi mọi thiết bị để gửi số hiệu card của chúng trên đường CMD CMD3 Bcr [31:0] bit đệm =’0’ R6 CMD55 ac [31:16] RCA [15:0] bit đệm R1 APP_CMD Trước mỗi lệnh acmd (lệnh có chức năng đặc biệt) ta phải dùng lệnh cmd55 này. CMD8 Bcr [31:12]reserved bits [11:8]supply coltage [7:0]checkpattern R7 SEND_EXT_CSD Yêu cầu thẻ gửi thông tin các thanh ghi CSD(Card Specific Data) dưới dạng block dữ liệu. CMD9 ac [31:16]RCA [15:0] stuffbits R2 SEND_CSD Yêu cầu thẻ gửi thông tin cụ thể của thanh ghi CSD. CMD16 Thiết lập độ lớn tính theo byte của một block dữ liệu, giá trị mặc này được lưu trong CSD CMD17 Đọc một block dữ liệu 4.3.3. Response SD Card Page 28 Tất cả các phản hồi được gửi qua đường CMD. Độ dài của mỗi response phụ thuộc vào kiểu response. Một response luôn luôn bắt đầu là bit ‘0’, tiếp theo là bit chỉ hướng của dòng dữ liệu trên đường CMD, ‘1’ nếu hướng là host-card, ‘0’ là hướng ngược lại. Trong những bảng dưới đây, một giá trị được ký hiệu là ‘x’ nếu nó là khu vực biến. Tất cả các response ngoại trừ kiểu R3 đều được bảo vệ bởi 1 byte CRC. Bit kết thúc luôn luôn là 1. Có 5 kiểu response trong SD Card. 4.3.3.1. R1 (normal response Command) Độ dài 48 bit. Các bit 45:40 chỉ ra số hiệu CMD tương ứng. Trạng thái của Card được lưu trong 32 bit 39:8. Chú ý rằng nếu việc truyền dữ liệu quá phức tạp, một tín hiệu báo bận có thể xuất hiện trên được dữ liệu sau sự truyền 1 block dữ liệu. Host sẽ kiểm tra việc bận này sau khi truyền 1 block. Trạng thái của card sẽ được mô tả sau. Bảng 4.14. Response R1 Vị trí 47 46 [45:40] [39:8] [7:1] 0 Độ rộng (bits) 1 1 6 32 7 1 Giá trị ‘0’ ‘0’ X X X ‘1’ Mô tả start bit transmission bit command index card status CRC7 end bit 4.3.3.2. R1b R1b chính là R1 với với 1 tín hiệu báo bận được truyền trên đường dữ liệu. Card có thể bận sau khi nhận lệnh. Host sẽ kiểm tra bận cho mọi response. 4.3.3.3. R2 (Thanh ghi CID, CSD) Độ dài 136 bit. Nội dung của thanh ghi CID được gửi như là 1 response cho các lệnh CMD2 và CMD10. Nội dung của thanh ghi CSD được gửi như là response của CMD9. Chỉ có các bit [127…1] trong thanh ghi CID hay CSD được truyền, bit[0] của nó được thay thế bằng bit cuối của response ‘1’. Bảng 4.15. Response R2 Vị trí 135 134 [133:128] [127:1] 0 Độ dài 1 1 6 127 1 Giá trị ‘0’ ‘0’ ‘111111’ X ‘1’ Mô tả Start bit Transmission bit Reserved CID hoặc CSD, CRC7 End bit SD Card Page 29 4.3.3.4. R3 (Thanh ghi OCR) Độ dài 48 bit. Nội dung của thanh ghi OCR được như là phản hồi cho lệnh ACMD41. Bảng 4.16. Response R3 Vị trí 47 46 [45:40] [39:8] [7:1] 0 Độ rộng (bits) 1 1 6 32 7 1 Giá trị ‘0’ ‘0’ ‘111111’ X ‘1111111’ ‘1’ Mô tả start bit transmission bit Reserved OCR Reserved end bit 4.3.3.5. R6 (Published RCA response) Độ dài 48 bit. Bit [45:40] chỉ ra số hiệu CMD tương ứng. 16 bit đầu của trương argument được sử dụng cho Published RCA number. Bảng 4.17. Response R6 Vị trí 47 46 [45:40] [39:8] [7:1] 0 Độ dài 1 1 6 16 16 7 1 Giá trị ‘0’ ‘0’ x x x x ‘1’ Mô tả start bit transmission bit command index Published RCA[31:16] mới [15:0] card status bit: 23,22,19,12:0 CRC7 End bit 4.3.3.6. R7 (Card interface condition) Độ dài 48 bit. Thông tin về điện áp được gửi như là response của CMD8. Bit [19:16] chỉ ra khoản điện áp mà card hỗ trợ. Nếu card phù hợp với nhưng điện áp cung cấp thì nó trả lại R7 response. Trong loại response này, card phản hồi cả khoảng điện áp và check pattern set trong trường argument. Bảng 4.18. Response R7 Vị trí 47 46 [45:40] [39:20] [19:16] [15:8] [7:1] 0 Độ dài 1 1 6 20 4 8 7 1 Giá trị ‘0’ ‘0’ ‘001000’ ‘00000h’ x x x ‘1’ Mô tả start bit transmission bit command index Reserved bit Voltage accept Echo-back of check pattern CRC7 End bit Bảng 4.19. Voltage accepet trong R7 SD Card Page 30 Voltage accepted Value Definition 0000b Không được định nghĩa 0001b 2.7-3.6 V 0010b Bảo vệ cho khoảng điện áp thấp 0100b Reserved 1000b Reserved Còn lại Không được định nghĩa 4.4. Phương pháp truyền nhận dữ liệu 4.4.1. Card Initialization and Card Initializatio Ban đầu, ta khởi tạo cho các chân và chế độ cho các đường command và data - Gửi lệnh, nhận dữ liệu - Kéo chân CLK, CMD lên cao và DATA xuống thấp Lệnh CMD0 – lệnh này không có phản hồi. - Lệnh này là lệnh Reset mềm có tác dụng set card về trạng thái Idle. - Sau lệnh này, đường CMD sẽ ở trạng thái chờ lệnh tiếp theo. Những card được khởi tạo sẽ được mặc định có địa chỉ tương đối relative card address (RCA=0x0000). Lệnh CMD55 (APP_CMD) – phản hồi R1 - Lệnh này báo hiệu cho card biết lệnh tiếp theo là lệnh dạng application specific command (lệnh ACMD41). - RCA được sử dụng cho CMD55 ở trạng thái nghỉ sẽ là địa chỉ mặc định của card là 0x0000. Lệnh ACMD41(SEND_RELATIVE_ADDR)–phản hồi R3 - Lệnh này cần thiết để host có thể nhận dạng và loại bỏ những thẻ không phù hợp với mức điện áp VDD đòi hỏi của host. - Bit báo bận trong OCR sẽ được card sử dụng để báo cho host biết quá trình khởi tạo ACMD41 hoàn tất hay chưa (giá trị Bắt đầu Khởi tạo các chân Chế độ gửi lệnh, nhận dữ liệu Gửi CMD0 CMD55 ACMD41 Lỗi CMD2 Tốt CMD3 SD Card Page 31 0 nếu đang khởi tạo, 1 nếu đã hoàn tất) Host sẽ lặp lại việc phát lệnh ACMD41 liên tục cho đến khi bit báo bận bằng 1. - Bằng việc hiện set thanh ghi OCR (operation conditions register) về 0 trong đối số của ACMD41, host có thể hỏi và xác định khoảng giá trị trước khi đưa card có khoảng giá trị làm việc không phù hợp về trạng thái inactive. - Sau khi lệnh này được gửi thành công, card chuyển sang trạng thái Ready Lệnh CMD2 (ALL_SEND_CID) – phản hồi R2 - Khi host gửi lệnh này đi, tất cả các card phải gửi địa chỉ ID về cho host (địa chỉ này được lưu trong thanh ghi CID – card indentification number về host. - Sau khi lệnh này được gửi card chuyển sang trạng thái Indentification Lệnh CMD3 (SEND_RELATIVE_ADDR) – phản hồi R6 - Khi host gửi lệnh này, tất cả các card sẽ gửi các địa chỉ tương đối (RCA) đến cho host. Địa chỉ này sẽ được sử dụng cho chế độ truyền dữ liệu (data transfer) ở sau. Địa chỉ này ngăn hơn so voi địa chỉ CID. - Một khi địa chỉ RCA được gửi đi, card sẽ chuyển sang trạng thái Stand-by. - Nếu muốn gán giá trị RCA khác cho SD, host có thể gửi lệnh CMD3 khác tới card. Địa chỉ RCA cuối cùng sẽ là địa chỉ RCA của card. 4.4.2. Data transfer Mode Cho đến hết quá trình khởi tạo card, host sẽ yêu cầu tần số fOD bởi vì một vài card có thể có tần số làm việc hạn chế trong suốt quá trình khởi tạo. Trong quá trình truyền dữ liệu, host có thể hoạt động ở dải tần số fPP. Lệnh CMD9 (SEND_CSD) – phản hồi R2 - Host gửi lệnh SEND_CSD (CMD9) để lấy dữ liệu quan trọng của card (lưu trong thanh ghi CSD – Card Specific Data) như độ dài block, bộ nhớ của card, … - Chú ý: Lệnh CMD9 phải đi kèm với địa chỉ RCA của card muốn chọn. Địa chỉ này có được dựa vào phản hồi của lệnh CMD3 phía trên. - Sau lệnh này, ta có thể sử dụng thêm lệnh SET_DSR (CMD4). - Tần số clock sau lệnh này sẽ được chuyển từ fOD sang fPP CMD9 (kèm RCA) CMD7 (kèm RCA) CMD16 SD Card Page 32 Lệnh CMD7 (SEND_CSD) – phản hồi R1 - Lệnh CMD7 được sử dụng để đưa card trong các card đã kết nối được và chuyển nó thành chế độ Transfer. - Tương tự lệnh CMD9, cần truyền thêm tham số RCA của card được chọn. Ngoài ra, khi lệnh CMD7 được gửi với địa chỉ RCA=0x0000, thì tất cả card đều được chuyển về trạng thái Stand-by - Sau lệnh này, host và card được chọn sẽ kết nối trực tiếp với nhau. Lệnh CMD16 (SET_BLOCK_LENGTH) – phản hồi R1 - Sau khi gửi 2 lệnh trên, ta có thể gửi thêm các lệnh khác. Song ở mức độ đọc thẻ SD ta chỉ cần đề cập đến lệnh này. - Tác dụng của lệnh là xác định độ dài của block truyền phù hợp với loại thẻ SD sử dụng. 4.4.3. Read Data Ở đây ta chỉ xét quy trình đọc dữ liệu của 1 block 512byte. Việc đọc dữ liệu của 1 file lưu trên thẻ SD tất nhiên sẽ là việc đọc nhiều liên tiếp Lệnh CMD17 (BLOCK_READ) – phản hồi R1 - Gửi lệnh này đi kèm theo số thứ tự của block cần đọc. - Đặc biệt chú ý: tham số của lệnh CMD17 cho biết địa chỉ của byte dữ liệu đầu tiên của block cần đọc. Tham số này có độ dài 4byte - Ví dụ, khi muốn đọc block thứ 1 ta phải truyền tham số là địa chỉ byte dữ liệu đầu tiên là 0x00 0x00 0x02 0x00 (9 số 0 ở cuối, 29 = 512). - Nếu biên cmd_buffer chứa lệnh cần truyền thì lệnh sẽ là cmd_buffer[0] = 0x51 cmd_buffer[1] = 0x00 cmd_buffer[2] = 0x00 cmd_buffer[3] = 0x02 cmd_buffer[4] = 0x00 Đọc 1 block CMD17 (kèm số thứ tự block cần đọc) Kiểm tra dữ liệu Đọc dữ liệu (1 block = 512byte) Có Gửi 16 xung clock chờ Không SD Card Page 33 - Chờ cho cho đến khi tồn tại dữ liệu trên đường Data. - Đọc toàn bộ 512 byte dữ liệu của block. Các byte dữ liệu này được đọc khi chân clock ở mức cao. - Ta cần sử dụng 1 biến con trỏ để lưu 512 byte dữ liệu được đọc vào. Ở đây, dùng biên *buff Kết thúc đọc dữ liệu 1 block - Sau khi đọ xong 1 block ta cần gửi 16 xung clock chờ cho tin hiệu trên dây Data kết thúc. 4.5. Đọc ghi một file dữ liệu vào trong SD card Do thẻ SD chỉ là 1 partion nên khi đọc hay ghi ta chỉ quan tâm đến bảng FAT, Root là đủ. 4.5.1. Đọc một file Quy trình việc đọc file như sau: - Tìm kiếm file và header của file trong bảng Root - Tìm trong bảng Fat các cluster chứa dữ liệu - Đọc các cluster tìm được và lấy dữ liệu Ở đây, các chương trình cần thiết cho việc đọc SD_card được ghi trong file FAT16.h. Gồm các chương trình sau - GetTime chuyển 2 byte lsb, msb thành giờ phút - GetDay chuyển 2 byte lsb, msb thành ngày tháng năm - GetHeader chuyển 32 byte (độ dài một entry trong bảng Root) lưu trong con trỏ *root thành các thông tin header của file (nếu có) lưu trong con trỏ *entry - PrintHeader in các thông tin của file đang xét lưu trong con trỏ *entry lên LCD và trên console. - GerData lấy dữ liệu của file sử dụng bảng fat lưu ở mảng fat[], sử dụng thông tin về file lưu trong con trỏ *entry. Sau đó lưu dữ liệu này vào trong mảng data[] - PrintData in dữ liệu của file đang xét lên trên console sử dụng mảng data[] 4.5.2. Ghi một file Phần này chúng tôi hy vọng sẽ hoàn thành trong thời gian tới. SD Card Page 34 5. LCD 16x2 Các thủ tục: khởi tạo, hiển thị, tọa độ con trỏ được thực hiện theo chuẩn của LCD. Trong Nios II, ta quan tâm đến các định nghĩa sau: // THE REGISTER MAP // // 7 6 5 4 3 2 1 0 Offset // +-----+-----+-----+-----+-----+-----+-----+-----+ // RS = 0 | Command Register (WRITE-Only) | 0 // +-----+-----+-----+-----+-----+-----+-----+-----+ // RS = 0 | Status Register (READ -Only) | 1 // +-----+-----+-----+-----+-----+-----+-----+-----+ // RS = 1 | Data Register (WRITE-Only) | 2 // +-----+-----+-----+-----+-----+-----+-----+-----+ // RS = 1 | Data Register (READ -Only) | 3 // +-----+-----+-----+-----+-----+-----+-----+-----+ #define LCD_write_cmd(data) IOWR(LCD_16207_0_BASE, 0, data) #define LCD_read_cmd() IORD(LCD_16207_0_BASE, 1) #define LCD_write_data(data) IOWR(LCD_16207_0_BASE, 2, data) #define LCD_read_data() IORD(LCD_16207_0_BASE, 3) Thông tin về Offet của các thanh ghi trong LCD 1602 được lấy trong file: C:\altera\91sp1\ip\altera\sopc_builder_ip\altera_avalon_lcd_16207\inc\altera_avalon_l cd_16207_regs.h 6. Kết luận Sau một kỳ làm việc, cùng với sự giúp đỡ nhiệt tình của các thành viên trong phòng lab ESRC 618, chúng tôi đã hoàn thành việc đọc dữ liệu trong thẻ SD, minh họa bằng cách hiển thị lên LCD1602 trong KIT DE2. Qua đề tài này, chúng tôi đã học được rất nhiều thứ: Cách xây dựng hệ thống SOPC trong Quatus II, cách sử dụng Nios II để lập trình cho vi xử lý mềm được tạo ở trên, cách đọc thẻ SD và đặc biệt là học được cách làm việc nhóm hiệu quả. Trong thời gian tới, nhóm sẽ hoàn thành phần Ghi và Format dữ liệu trong thẻ. Hy vọng rằng sau đề tài này, chúng tôi sẽ tiếp tục hoàn thành tốt các công việc trong kỳ tới! SD Card Page 35 7. Tài liệu tham khảo - SD Specifications Part1: Physical Layer Simplified Specification Version 2.00. SD Group, Matsushita Electric Industrial Co.,Ltd.(Panasonic), SanDick Corporation, Toshiba Corporation, Techical Committee, SD Card Association. - SD Specification Part A2: SD Host Controller Simplified Specification Version 2.00. Techical Committee, SD Card Association. - TriFlash with Secure Digital (SD) Interface Product Manual (Preliminary). Corporate Headquarters. - Nios II Software Developer’s Handbook. - - - My First Nios II Software Tutorial.pdf - SD_Card_Interface_for_SoPC_Builder.pdf - Datasheet 1602. SD Card Page 36 8. Phụ lục A: Các hàm sử dụng trong hệ thống: Các hàm sử dụng Chức năng Thư viện Các hàm con sử dụng trong hàm này void Ncr(void); Chuyển card về chế độ nhận dữ liệu SD_Card.h void Ncc(void); Tạo mẫu 8 clock SD_Card.h BYTE response_R(BYTE); Xử lý phản hồi từ card SD_Card.h BYTE send_cmd(BYTE *); Gửi command đến card SD_Card.h BYTE SD_read_lba(BYTE *buff, UINT32 lba, UINT32 seccnt); Đọc dữ liệu của seccnt sector trên SD Card bắt đầu từ sector thứ lba và lưu vảo trong buffer SD_Card.h Ncc();Ncr(); send_cmd(); BYTE SD_card_init(void); Khởi tạo giao tiếp với SD Card SD_Card. Ncr();Ncc();response_R();send_cmd(); void GetTime(int lsb, int msb, int *sec, int *min, int *hour); Đọc thời gian khởi tạo của 1 file trên SD Card FAT16.h void GetDay(int lsb, int msb, int *day, int *mon, int *year); Đọc ngày tháng năm khởi tạo của 1 file trên SD Card FAT16.h int GetHeader(fi *entry, BYTE root[]); Đọc thông tin về ngày tháng năm khởi tạo, thời gian khởi tạo, địa chỉ, kích thước của 1 file lưu trong mảng root[] FAT16.h void GetTime();void GetDay(); void PrintHeader(fi *entry); Hiển thị thông tin của file len man hinh console FAT16.h void GetData(fi *entry, BYTE fat[], BYTE data[]); Đọc dữ liệu chứa trong 1 file của SD Card, lưu thông tin về file trong mảng fat[] và lưu dữ liệu của file trong mảng data[] FAT16.h SD_read_lba(); void PrintData(fi *entry, BYTE data[]); Hiển thị dữ liệu của file len man hinh console FAT16.h void LCD_Init(); Khởi tạo LCD LCD.h void LCD_Show_Text(char* Text); Hiển thị một chuỗi kí tự lên LCD LCD.h void LCD_GoTo(int x, int y); Hiển thị tại vị trí tọa độ (x,y) trên LCD LCD.h void LCD_Display(char *text1, char *text2) Hiển thị text 1 tại dòng 1 và text 2 trên dòng 2 của LCD LCD.h LCD_GoTo();LCD_Show_Text(); void LCD_Display2(char *text1, char *text2, int cursor) Hiển thị text 1 tại dòng 1 và text 2 trên dòng 2 của LCD, hiển thị thêm dấu nháy tại đầu dòng 1 LCD.h LCD_GoTo();LCD_Show_Text(); void buttons_isr( void* context, alt_u32 id Chương trình con phục vụ ngắt Interrupt.h void btn_int(void) Khởi tạo ngắt Duyệt hết tất cả các file trên SD Card và trả về số file tìm được Interrupt.h int ScanFile() Duyệt hết tất cả các file trên SD Card và trả về số file tìm được hello_world.c GetHeader(); void BlockData(BYTE data[], BYTE strres[], int i) Lấy 16 kí tự của nội dung file bắt đầu tại block có chỉ số I - dung de hien thi 1 dong tren LCD hello_world.c void ShowData(int index) Hiển thị nội dung của file hello_world.c GetData();BlockData();LCD_Display(); void ShowFile() Hiển thị các file trong SD Card hello_world.c LCD_Display2();ShowData(); int Init() Khởi tạo chương trình, kiểm tra xem có giao tiếp với SD Card hay không hello_world.c SD_read_lba();LCD_Init();btn_int();al t_irq_register(); SD_card_init()

Các file đính kèm theo tài liệu này:

  • pdfĐọc dữ liệu từ SD Card và hiển thị lên LCD sử dụng Kit DE2 của ALTERA.pdf