0
Tải bản đầy đủ (.doc) (90 trang)

Phần . Các module hộ trợ cho việc phát triển ứng dụng trên CooCox CoOS

Một phần của tài liệu THIẾT KẾ VÀ XÂY DỰNG ỨNG DỤNG VỚI ARM COTEXM3 TRÊN NỀN COOSRTOS (BÁO CÁO ĐỒ ÁN KỸ THUẬT MÁY TÍNH) (Trang 29 -68 )

2.1.1 SDCard 2.1.1.1 Giới thiệu

Secure Digital (SD) là chuẩn thẻ nhớ được sử dụng phổ biến trong các thiết bị di động hiện nay. Thẻ nhớ SD được phân loại chủ yếu dựa vào kích thước vật lý và dung lượng. Về kích thước, thẻ nhớ SD được phân thành 3 loại: SD, miniSD và microSD. Còn về dung lượng, cũng có 3 chuẩn dung lượng là: Standard-Capacity (SD - dung lượng lên tới 2GB), High-Capacity (SDHC - dung lượng từ 4-32GB) và Extended-Capacity (SDXC - dung lượng từ >32GB lên tới 2TB). Trong đồ án này, thẻ nhớ microSD với dung lượng 1GB được sử dụng làm bộ nhớ thứ cấp cho VĐK LPC1766. Sau đây là một số điểm cần lưu ý về chuẩn SD, hỗ trợ cho việc thực hiện đồ án.

2.1.1.2 Giao thức truyền dữ liệu

Thẻ nhớ SD giao tiếp với bên ngoài theo mô hình master-slave, trong đó thẻ nhớ luôn đóng vai trò slave, nhận tín hiệu điều khiển, xung clock từ chip bên ngoài đóng vai trò host. Một host có thể giao tiếp với nhiều thẻ nhớ cùng lúc.

Các chuỗi bit nối tiếp được trao đổi qua lại giữa thẻ nhớ và host được định dạng thành một trong ba kiểu gói: command (từ host đến card), responde (từ card vào host) và data (theo cả hai hướng).

Có 2 kiểu giao diện bus giữa host và card: SD Card Bus và SPI Bus. SD Card Bus dùng tới 4 chân Data, 1 chân Command và Responde để giao tiếp host, còn SPI Bus thì giao tiếp theo chuãn SPI, chỉ gồm 2 chân trao đổi tín hiệu. Giao diện SPI Bus được sử dụng trong đồ án này và sẽ được nói rõ hơn trong phần sau.

2.1.1.3 Sơ đồ chân

Vai trò mỗi chân của SD Card khác nhau tùy theo kiểu giao diện bus.

SD Card Bus

Pin Name Type Description

1 CD

DAT3 I/O/PP Card DetectData bit 3

2 CMD PP Command/Response

3 VSS1 S Ground

4 VCC S Supply Voltage

5 CLK I Clock

6 VSS2 S Ground

7 DAT0 I/O/PP Data bit 0 8 DAT1 I/O/PP Data bit 1

9 DAT2 Data bit 2

SPI Bus:

1 CS I Chip Select (Neg. True) 2 DI I Data In 3 VSS1 S Ground 4 VCC S Supply Voltage 5 CLK I Clock 6 VSS2 S Ground 7 DO O Data Out 8 RSV - 9 RSV - 2.1.1.4 Thanh ghi

Mỗi thẻ nhớ có một tập các thanh ghi thông tin, trong đó có 6 thanh ghi được định nghĩa trong giao diện thẻ nhớ, đó là: OCR, CID, CSD, RCA, DSR và SCR. Các thanh ghi này chỉ có thể được truy xuất thông qua các Command tương ứng.

Thanh ghi OCR (Operation Condition Register): chứa thông tin về các cấu hình điện áp của thẻ nhớ

Thanh ghi CID (Card IDentification): chứa thông tin định danh thẻ

Thanh ghi CSD (Card-Specific Data): cung cấp những thông tin liên quan đến việc truy xuất nội dung thẻ nhớ như: định dạng dữ liệu, kiểu sửa lỗi, thời gian truy xuất dữ liệu tối đa… Những thông tin về kích thước thẻ, kích thước sector, định dạng hệ thống file… cũng được rút ra từ việc truy xuất thanh ghi này, do đó đây là thanh ghi nên được tìm hiểu kỹ.

Có 2 phiên bản về cấu trúc thanh ghi CSD ứng với 2 chuẩn dung lượng Standard- và High- Capacity. Dưới đây là cấu trúc CSD theo phiên bản thứ nhất

Lưu ý: ta có thể tính được dung lượng của thẻ nhớ từ các trường C_SIZE, C_SIZE_MULT và READ_BL_LEN theo công thức sau:

Dung lượng = BLOCKNR * BLOCK_LEN

Trong đó: BLOCKNR = (C_SIZE + 1) * MULT

MULT = 2C_SIZE_MULT + 2 (C_SIZE_MULT < 8)

BLOCK_LEN = 2READ_BL_LEN (READ_BL_LEN < 12)

Thanh ghi RCA (Relative Card Address): mang địa chỉ thẻ nhớ khi ở chế độ SD Card Bus (thanh ghi này không sử dụng trong chế độ SPI Bus)

Thanh ghi DSR (Driver Stage Register): đây là thanh ghi tùy chọn, dùng để nâng hiệu suất bus.

Thanh ghi SCR (SD Card Configuration Register): cung cấp thông tin về những tính năng đặc biệt của thẻ nhớ.

2.1.2 Module SPI trong LPC1766 2.1.2.1 Giới thiệu

Module SPI được sử dụng trong đồ án, đóng vai trò trao đổi dữ liệu cấp thấp (theo từng byte) giữa VĐK và thẻ nhớ SD. Vì vậy, module SPI trong VĐK phải được cấu hình ở chế độ Master theo phương thức truyền 8 bit.

2.1.2.2 Cấu hình căn bản khi sử dụng module SPI trong LPC1766

o Cấp nguồn: ghi bit PCSPI của thanh ghi PCONP (Chú ý: khi reset, bit PCSPI = 1) o Cấp xung clock: ghi bit PCLK_SPI của thanh ghi PCLKSEL0 để cấp xung clock cho SPI

o Cấu hình chân chức năng: các chân SCK, SS, MISO và MOSI của SPI lần lượt trùng với các chân 15, 16, 17 và 18 của Port 0, do đó cần ghi các bit tương ứng trong các thanh ghi PINSEL0, PINSEL1 và FIO0DIR để thiết lập hướng và chức năng cho các chân trên

o Cấu hình ngắt: ngắt SPI được kích hoạt khi kích hoạt cờ ngắt SPI trong NVIC, đồng thời bit SPIF của thanh ghi S0SPINT được ghi lên 1.

2.1.2.3 Hệ thống thanh ghi trong SPI:

Gồm 5 thanh ghi điều khiển và 1 thanh ghi trạng thái

o Thanh ghi S0SPSR (SPI Status Register): giám sát trạng thái hoạt động của SPI, bao gồm chức năng thông thường và các điều kiện ngoại lệ.

o Thanh ghi S0SPDR (SPI Data Register): chứa các byte dữ liệu truyền đi và nhận về

o Thanh ghi S0SPCCR (SPI Clock Counter Register): điều khiển tốc độ xung clock khi ở chế độ master

Có thể tính tần số xung clock của SPI Master theo công thức sau:

SPI Clock Rate = SPI Peripheral Clock / S0SPCCR

S0SPCCR là giá trị 8 bit Counter của thanh ghi S0SPCCR, giá trị này phải là số chẵn và lớn hơn 8 để bảo đảm hoạt động chính xác của SPI

SPI Peripheral Clock được xác định theo giá trị PCLK_SPI của thanh ghi PCLKSEL0 (các bit 17:16), đó là: bằng CCLK/4 nếu PCLK_SPI = 00, bằng CCLK nếu PCLK_SPI = 01, bằng CCLK/2 nếu PCLK_SPI = 10 và bằng CCLK/8 nếu PCLK_SPI = 11 (CCLK là tần số xung clock của CPU)

o Thanh ghi S0SPINT (SPI Interrupt): chứa cờ ngắt của SPI

2.1.2.4 Hoạt động của module SPI ở chế độ Master Khởi tạo: gồm các bước sau

Các bước cấu hình cơ bản (xem phần trước)

Thiết lập giá trị thanh ghi S0SPCCR để đạt được tần số xung clock mong muốn

Thiết lập giá trị thanh ghi S0SPCR theo chế độ Master

Trao đổi dữ liệu: gồm các bước sau

Ghi dữ liệu cần truyền đi vào thanh ghi dữ liệu S0SPDR (nếu không có dữ liệu cần truyền thì có thể ghi 0xff), hành động này sẽ bắt đầu việc truyền dữ liệu ra bus

Chờ đến khi bit SPIF của thanh ghi S0SPSR được tích cực Đọc thanh ghi trạng thái S0SPSR

Đọc dữ liệu cần nhận từ thanh ghi S0SPDR (nếu không cần dữ liệu nhận thì phải xóa bit SPIF của thanh ghi S0SPSR để kết thúc việc trao đổi dữ liệu)

Trong thời gian trao đổi dữ liệu, chân CS của SPI phải luôn được tích cực

2.1.3 Giao tiếp SPI giữa SD Card và LPC1766 2.1.3.1 Cấu hình kênh giao tiếp SPI

o Đối với LPC1766: kích hoạt module SPI theo chế độ Master, truyền 8 bit o Đối với thẻ nhớ SD: thẻ nhớ phải được chuyển sang chế độ giao diện SPI Bus

2.1.3.2 Cách thức trao đổi dữ liệu trên kênh SPI

o Kênh SPI là "byte-oriented", nghĩa là tất cả các thông tin được trao đổi trên kênh đều phải có độ dài là một số nguyên byte (trong khi đó, thông tin ở chế độ SD Card là tính theo từng bit), như vậy sẽ phù hợp với chế độ giao tiếp SPI 8 bit của VĐK. Thông tin được truyền lên kênh SPI theo thứ tự từ MSB.

o Tất cả hoạt động trao đỗi thông tin trên kênh SPI đều được điều khiển bởi Host (trong trường hợp này là LPC1766). Host bắt đầu mỗi giao dịch bus bằng việc tích cực tín hiệu CS (Chip Select)

o Thẻ nhớ (đóng vai trò Slave) sẽ lấy mẫu thông tin trên kênh SPI khi tín hiệu CS được tích cực, do đó thời gian tích cực của CS phải là bội số của 8 xung clock SPI để đảm bảo thông tin được lấy mẫu chính xác.

o Thông tin trên kênh SPI được chia thành 4 loại:

Command Token: được gửi bởi Host tới thẻ nhớ, mỗi Command là một yêu cầu tới thẻ nhớ, yêu cầu đó có thể là: ghi thẻ, đọc thẻ, đọc thanh ghi …

Responde Token: luôn được gửi bởi thẻ nhớ ngay sau khi nhận Command từ Host. Có các loại định dạng Responde khác nhau tùy theo Command nhận được.

Data Block: khối dữ liệu cần được trao đổi, có thể là dữ liệu đọc từ thẻ nhớ, dữ liệu ghi vào thẻ nhớ hay nội dung một thanh ghi trong thẻ nhớ…

Control Token: điều khiển việc trao đổi Data Block.

o Quá trình giao tiếp giữa Host và thẻ nhớ luôn luôn diễn ra và lặp lại theo các bước sau:

Host gửi một Command Token tới thẻ nhớ

Thẻ nhớ phản hồi Command trên bằng cách gửi lại một Responde Token tương ứng

Trong trường hợp Command có yêu cầu đọc hay ghi dữ liệu, các Data Block và Control Token sẽ được gửi đi, từ thẻ nhớ hay từ Host tuy theo yêu cầu. Lưu ý là Data Block chỉ được di chuyển trên kênh SPI theo một hướng: từ Host tới thẻ nhớ nếu có yêu cầu ghi dữ liệu và hướng ngược lại nếu có yêu cầu đọc dữ liệu.

2.1.3.3 Định dạng thông tin a) Command Token:

Dưới đây là định dạng của một Command Token (các bit được truyền theo thứ tự từ trái sang)

Bit position 47 46 [45:40] [39:8] [7:1] 0

Width (bits) 1 1 6 32 7 1

Value ‘0’ ‘1’ x x x ‘1’

Description Start bit Transmission bit Command index Argument CRC7 End bit Trong đó:

Trường command index: xác định yêu cầu của command (Người ta thường ký hiệu Command bởi CMDx với x là command index)

Trường argument: các tham số cần thiết của yêu cầu Trường CRC7: kiểm tra lỗi theo công thức x7+x3+1 Một số Command nên biết:

CMD0: reset thẻ nhớ, đưa thẻ nhớ về trạng thái Idle CMD1: kích hoạt quá trình khởi tạo của thẻ nhớ CMD9: đọc thanh ghi CSD

CMD10: đọc thanh ghi CID

CMD12: dừng hoạt động đọc nhiều Data Block

CMD17/CMD18: đọc một/nhiều Data Block, trường argument chứa địa chỉ Data Block CMD24/CMD25: ghi một/nhiều Data Block, trường argument chứa địa chỉ Data Block CMD55: đây là Command đặc biệt, khi gặp Command này, thẻ nhớ sẽ phải chờ để nhận thêm một Command Token nữa (cùng định dạng nhưng khác loại với các Command trên, gọi là "Application Specific Command" - ký hiệu ACMDx) mới biết được yêu cầu của Host là gì.

Tùy theo Command Token, có các loại định dạng Responde Token tương ứng, đó là: R1, R2, R3, R4, R5 và R7. Định dạng R1 được sử dụng nhiều nhất, các Command được liệt kê ở trên đều được phản hồi bằng Responde R1. Định dạng R1 như sau (MSB được gửi đi đầu tiên)

MSB luôn bằng 0, các bit khác dùng để báo lỗi, bằng 0 nghĩa là không có lỗi. Ý nghĩa các lỗi là:

In idle state: thẻ nhớ đang ở trạng thái idle và đang khởi tạo Erase reset: chuỗi lệnh xóa không đúng thứ tự

Illegal command: mã lệnh không hợp lệ Com CRC error: CRC không khớp

Erase sequence error: lỗi xảy ra trong chuỗi lệnh xóa

Address error: địa chỉ Data Block không trùng khớp với độ dài của nó Parameter error: tham số không hợp lệ

c) Data Block:

Một Data Block luôn có 16 bit CRC (tính theo công thức x16+x12+x5+1) đi kèm theo sau. Chiều dài mỗi Data Block (không kể 2 byte CRC) biến thiên từ 1 đến 512 byte, mặc định là 512 byte.

d) Control Token: Gồm 4 loại sau

Data Responde Token: mỗi Data Block được ghi lên thẻ nhớ đều phải được thẻ phản hồi lại bằng một Data Responde Token. Định dạng của nó như sau

Trong đó: Status bằng 010 nếu dữ liệu được chấp nhận; 101 nếu dữ liệu bị từ chối do lỗi CRC; và 110 nếu dữ liệu bị từ chối do lỗi ghi

Start Block Token: token này được gửi ngay trước khi mỗi Data Block được gửi (cùng chiều với Data Block). Token này có giá trị là 0xFC trong trường hợp ghi nhiều Data Block và là 0xFE trong các trường hợp khác.

Stop Tran Token: trong trường hợp ghi nhiều Data Block (bằng CMD25), thẻ nhớ được quyền yêu cầu dừng ghi bằng cách gửi Stop Tran Token đến Host. Token này luôn có giá trị là 0xFD

Data Error Token: nếu hoạt động đọc bị lỗi và thẻ nhớ không thể cung cấp dữ liệu cần đọc, thay vào đó nó sẽ gửi đi một Data Error Token, có định dạng là:

4 bit cuối chỉ ra lỗi gặp phải trong hoạt đông đọc: Error - lỗi tổng quát hoặc lỗi lạ; CC Error - lỗi bộ điều khiển trong của thẻ nhớ; Card ECC Failed - không sữa lỗi được; Out of range - địa chỉ không hợp lệ.

2.1.3.4 Một số hoạt động diễn ra trên kênh SPI Quá trình khởi tạo chế độ SPI Bus cho thẻ nhớ

Host gửi CMD0 trong khi tín hiệu CS được tích cực, đây là điều kiện để thẻ nhớ chuyển sang chế độ SPI Bus, đồng thời cũng chính là yêu cầu reset thẻ nhớ

Sau khi gửi CMD0, host nhận R1. Nếu R1 khác 0x01 (bit In Idle State chưa tích cực), tức là thẻ nhớ vẫn chưa trở về trạng thái Idle, Host sẽ gửi lại CMD0 (và nhận R1) nhiều lần cho đến khi trạng thái Idle xuất hiện (R1 = 0x01)

Host gửi CMD1 để kích hoạt quá trình khởi tạo thẻ nhớ, gửi CMD1 và nhận R1 nhiều lần cho đến khi R1 khác 0x01 thì dừng (vì lúc này bit In Idle State của R1 không tích cực, chứng tỏ thẻ nhớ đã khởi tạo xong)

Đọc dữ liệu từ thẻ nhớ

Trường hợp đọc một Data Block

Host gửi CMD17 với argument là địa chỉ của dữ liệu cần đọc, sau đó nhận R1 = 0 Thẻ nhớ gửi Start Block Token (0xFE)

Thẻ nhớ gửi Data Block được yêu cầu (thường là 512 byte cùng với 2 byte CRC16) Trường hợp đọc nhiều Data Block

Host gửi CMD18 với argument là đỉa chỉ dữ liệu, sau đó nhận R1 = 0

Thẻ nhớ gửi Start Block Token cùng với Data Block nhiều lần. Các Data Block này nằm ở những vị trí liên tiếp nhau trên thẻ nhớ mà bắt đầu là vị trí được chỉ định bởi argument của CMD18

Host chủ động dừng việc nhận Data Block từ thẻ nhớ bằng cách gửi CMD12 và nhận R1

Đọc các thanh ghi: Trình tự giống với trường hợp đọc một Data Block ngoại trừ: thay

CMD17 bằng CMD9 (đọc CSD) hoặc CMD10 (đọc CID) và Data Block là nội dung của thanh ghi tương ứng.

2.2 Cấu trúc dữ liệu và hệ thống tập tin FAT

2.2.1 Cấu trúc vùng dữ liệu của thẻ nhớ

Vùng dữ liệu của thẻ nhớ là vùng có thể được đọc hoặc ghi bởi Host. Dữ liệu trong vùng này được đánh địa chỉ theo byte (bắt đầu từ 0) nhưng thường được truy xuất theo từng khối byte gọi là sector. Kích thước mỗi sector là 512 byte.

Có thể chia vùng dữ liệu thành 2 khu vực: Partition Area và Regular Area

2.2.1.1 Partition Area

Nằm ở phần đầu của vùng dữ liệu.Sector đầu tiên (sector 0) của Partition Area gồm có Master Boot Record chứa đoạn mã thực thi (được dùng cho quá trình khởi động máy tính, không có vai trò gì trong việc đọc ghi dữ liệu thẻ nhớ) và các Partition Table chứa thông tin về các phân vùng dữ liệu trên thẻ nhớ. Cấu trúc của sector 0 được mô tả như hình dưới

BP Length Field Name Contents

0 446 Master Boot Record Not Restricted 446 16 Partition Table (partition 1) Xem bảng dưới 462 16 Partition Table (partition 2) All 0x00 478 16 Partition Table (partition 3) All 0x00 494 16 Partition Table (partition 4) All 0x00

Signature Word: gồm 2 byte 0x55 và 0xaa, dùng để xác định tính hợp lệ của Partiton Area Bốn Partition Table tương ứng với (tối đa) 4 phân vùng, tuy nhiên, mỗi thẻ nhớ thường chỉ gồm một phân vùng duy nhất nên chỉ cần thông tin của Partition Table đầu tiên, 3 Partiton Table còn lại có thể gán giá trị bằng 0x00 cho tất cả các byte.

Cấu trúc của Parttion Table như sau:

BP Length Field Name Contents

0 1 Boot Indicator 0x00 or 0x80

1 1 Starting Head Numeric Value

2 2 Starting Sector/ Starting Cylinder Numeric Value

4 1 System ID 0x01 or 0x04 or 0x06

5 1 Ending Head Numeric Value

6 2 Ending Sector/ Ending Cylinder Numeric Value

8 4 Relative Sector Numeric Value

12 4 Total Sector Numeric Value

 Boot Indicator (byte 0): bằng 0x80 nếu thẻ nhớ được sử dụng để khởi động máy, hoặc bằng 0x00 nếu ngược lại

 Relative Sector (byte 8, 9, 10 và 11): số lượng sector nằm trước sector đầu tiên của phân vùng, dựa vào thông số này để xác định địa chỉ sector đầu tiên của phân vùng

Một phần của tài liệu THIẾT KẾ VÀ XÂY DỰNG ỨNG DỤNG VỚI ARM COTEXM3 TRÊN NỀN COOSRTOS (BÁO CÁO ĐỒ ÁN KỸ THUẬT MÁY TÍNH) (Trang 29 -68 )

×