Đ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
Trang 2SD 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
Trang 3SD 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
Trang 4SD 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)
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
Trang 5- 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
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ỗ
Trang 6Hì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
Trang 7SD 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
- 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
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
Trang 8volatile int *value = (volatile int*) context;
*value = IORD_ALTERA_AVALON_PIO_EDGE_CAP( BUTTON_PIO_BASE );
}
Đ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
- 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:
Trang 9SD 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
Trang 10Giao 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
Trang 11SD Card Page 11
Bảng 4.1 Các chân trong 2 chế độ của SD Card
1 CD/DAT3 Card detect/Data line[Bit 3] CS Chip Select
3 VSS1 Supply voltage ground VSS Supply voltage ground
6 VSS2 Supply voltage ground VSS2 Supply voltage ground
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
Trang 12SD 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
Trang 13SD Card Page 13
Hình 4.3 Định dạng gói dữ liệu – dữ liệu thông thường
Trang 14SD 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
Trang 15SD 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
Trang 16SD 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
Trang 17SD 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
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
02h Bắt đầu của phân vùng( Cylinder/ Sector) (bảng dưới) 1 word
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
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
Trang 18SD 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
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
Trang 19SD 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
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
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
18h Số sector trong 1 track cho ngắt 13h 1 word
Trang 20SD Card Page 20
36h Tên loại FAT ( FAT12 hoặc FAT 16) 8 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
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)
0003 0006 0007 0000 FFFF FFFF 0000 0000 0000
Trang 21SD Card Page 21
4.1.2.2.4 Bảng Root:
Bảng 4.8 Bảng Root
Name Offset Size Description
ATTR_SYSTEM|
ATTR_VOLUME_ID
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:
Trang 22SD 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 –23Như 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
Ta chỉ quan tâm tới 2 thành ghi đặc biệt: OCR và CID