Lập trình STM32 SDIO đọc ghi dữ liệu vào thẻ nhớ SD card

stm32f407 Sdio

Trong bài này chúng ta cùng học cách lập trình STM32 SDIO, một chuẩn giao tiếp rât tiện lợi với tốc độ cao khi làm việc với thẻ nhớ. Cùng với đó là cách sử dụng thư viện FatFS với STM32, đây là thư viện middle ware tiêu chuẩn khi đọc/ghi file mà ST cung cấp cho người dùng

Bài 2 phần STM32F407 trong serie Học STM32 từ A tới Z

Chuẩn giao tiếp SDIO là gì?

SDIO dùng để giao tiếp giữa Bus ngoại vi APB2 và MultiMediaCards(MMC) đó là thẻ nhớ SD, SDIO và thiết bị CE-ATA.

Vậy MMC là gì?

MMC là viết tắt của Thẻ MultiMedia. Nó là 1 kiểu bộ nhớ NAND flash để lưu trữ dữ liệu được giới thiệu lần đầu tiên vào năm 1997 bởi Siemens AG và SanDisk. Đối với các ứng dụng nhúng ở mức vi điều khiển, thẻ MMC/SD là bộ nhớ thích hợp cho các ứng dụng cần lưu trữ dữ liệu vì phần cứng kết nối với thẻ MMC/SD đơn giản, hỗ trợ giao tiếp SPI và bộ nhớ dung lượng lớn (có thể nâng lên đến 32GB).

SD card

Bộ nhớ của thẻ MMC / SD được tổ chức theo khối, tương tự như ổ cứng (hardisk) trong máy tính.

Nhìn chung MMC và SD giống nhau về mặt cấu trúc vật lý và phương thức giao tiếp. Điểm khác nhau lớn nhất của 2 loại card này là về tính năng bảo mật dữ liệu và tốc độ giao tiếp.

SD card xuất hiện sau MMC card nên SD có nhiều tính năng và tốc độ cao hơn MMC. Tuy nhiên, đối với việc ghi-đọc MMC và SD ở tốc độ thấp bằng các vi điều khiển (như ARM) thì sự khác nhau của 2 loại card này là không đáng quan tâm.

Khối SDIO trong STM32F407

Trong STM32F407 chúng ta có 1 khối SDIO. Khối này bao gồm:

  • Bus APB2 có thể kết nối với DMA để tăng tốc độ truyền nhận dữ liệu
  • Khối SDMMC adapter: giúp kết nối với thẻ nhở được điều khiển bởi các chân CK, MD và D.

STM32 SDIO Block diagram

Chi tiết trong khối SDMMC Adapter

STM32 SDMMC adapter

Truyền nhận dữ liệu từ thẻ nhớ SD/SDIO được thực hiện trong các khối dữ liệu SDIO chỉ hộ trợ mode giao tiếp 1bit ( mặc định ) và 4bit . SDIO 4 bit có tốc độ truyền nhận rất nhanh . Nếu sử dụng kèm theo DMA thì tốc độ xử lý sẽ rất nhanh SDIO trở nên phổ biến bằng cách có được tính năng kết nối bus SD đơn giản và hỗ trợ các chế độ tốc độ bus cao hơn.

Trong bài này chúng ta sẽ xét tới chế độ 4 bit.

Đầu tiên các bạn nối các chân của SDIO vào thẻ nhớ như sau:

sdio 4 bit

Ý nghĩa của các chân:

  • Các chân D0 D1 D2 D3 là các chân dữ liệu , tối đa là 4 bit. Với chế độ 1bit sẽ mặc định là chân D0 ,các chân dữ liệu có trở kéo lên
  • Chân CMD (Command) chọn gửi lệnh hay Data
  • Chân GND và 3.3(V) là chân cấp nguồn
  • CLK là chân cấp xung clock

Chi tiết về SDIO trên STM32 chúng ta đọc tài liệu: STM32F4xx reference manual

Thư viện FATFS

FatFS là một loại module hệ thống tệp FAT chung cho các hệ thống nhúng. fatFS được viết phù hợp với ANCI C và tách biệt với lớp I/O nên nó độc lập với phần cứng.

FatFS nằm ở tầng Middleware giữa tầng hardware và Application trong hệ thống nhúng. Nghĩa là chúng không phụ thuộc vào phần cứng cũng không phụ thuộc vào phần mềm.

Các lệnh FATFS chúng ta hay sử dụng chủ yếu là:

  •  f_mount(): Register/Unregister a work area
  • f_open(): Open/Create a file
  • f_close(): Close a file
  • f_read(): Read a file
  • f_write(): Write a file
  • f_lseek(): Move read/write pointer, Expand a file size
  • f_truncate(): Truncate a file size
  • f_sync(): Flush cached data
  • f_opendir(): Open a directory

Các bạn có thể tham khảo thêm ở website: http://elm-chan.org/fsw/ff/00index_e.html

Ở đó có đủ các hàm và mẫu để sử dụng hàm đó.

Để đọc 1 file thông thường sẽ trải qua 3 bước:

Mở file – Đọc/ghi file – Đóng file.

Sau đây chúng ta sẽ cùng học cách đọc/ghi file trên thẻ nhớ sử dụng giao thức SDIO với STM32F407 nhé

Lập trình STM32 SDIO

Đầu tiên các bạn hãy chuẩn bị thẻ SD và module đọc thẻ SD theo chuẩn SDIO nhé. Module này khá khó mua đc ở VN nên có thể các bạn nên vẽ lại theo sơ đồ nguyên lý bên trên

Tiếp đó các bạn chuẩn bị một đầu đọc thẻ để test kết quả file đã ghi.

micro sd storage board l 1 5

Cấu hình trên CubeMX

Đầu tiên cấu hình SYS bật debug serial

stm32f407 sdio cubemx sys

Cấu hình xung clock là thạch anh ngoài

stm32f407 sdio cubemx rcc

Sau đó chọn clock như sau, cho xung vào là HSE 8Mhz, phần fmaster các bạn có thể tùy chọn dùng bộ nhân để config fmaster với tần số tùy ý.
Tuy nhiên xung 48Mhz phải đúng, để chúng ta tính toán SDIOCLK cho đúng.

stm32f407 sdio cubemx clock

Cấu hình SDIO là 1 bit hoặc 4 bit, đều tương tự nhau, bật ngắt tại tab NVIC

stm32f407 sdio cubemx sdio

Trong phần parameter, các bạn chọn số chia cho Clock divide để lấy tần số đọc ghi thẻ. Chúng ta để là 0 để lấy tần số đọc lớn nhất (48/2 = 24Mhz).

Tùy thuộc vào tốc độ đọc ghi thẻ nhớ, nếu thẻ cũ có thể tốc độ chậm, các bạn cần set hệ số chia cho đúng với yêu cầu của thẻ

stm32f407 sdio cubemx sdio divide

Cấu hình FATFS, chọn SDCard

stm32f407 sdio cubemx fatfs

Sau đó gencode, thì sẽ thấy 1 warning như thế này.

stm32f407 sdio

Đây là cảnh báo chưa có chân phát hiện thẻ, thực ra chân này các bạn không dùng cũng được, không vấn đề gì.
Nhưng nếu muốn detect việc thẻ nhớ được cắm vào, các bạn chọn 1 chân GPIO bất kì, mode input. Sau đó trong phần Platform của SDIO chọn chân đó là được

stm32f407 sdio cubemx detect card

Lập trình STM32 SDIO tạo và ghi file trên thẻ nhớ

Sau khi gen code, chúng ta mở ra bằng CubeMX, Sau đó khai báo các biến để phục vụ việc đọc ghi. Trong đó:

  • fatfs là biến hệ thống, mỗi biến này tương ứng với một thẻ nhớ.
  • myfile là biến tương ứng với 1 file trong thẻ, chúng ta sẽ sử dụng biến đó để thao tác như đọc, ghi, xóa…
  • fresult là biến hiển thị kết quả mỗi thao tác

Các bạn có thể chọn find to define để tìm tới nơi định nghĩa và hiểu rõ hơn về chúng.

Tiếp đó, khai báo 1 mảng để lưu dữ liệu đọc về, và 1 biến lưu số lượng byte đọc về.

stm32f407 sdio khoi tao cac bien

Trong hàm main.

Để ghi 1 file trên thẻ nhớ chúng ta sẽ có các thao tác.

  1. Mở thẻ nhớ
  2. Mở file trong thẻ nhớ đó, chọn quyền cần thao tác
  3. Ghi vào file đó
  4. Đóng file đó.

stm32f407 sdio ghi du lieu

Ở đây quyền FA_CREATE_ALWAYS chính là mở file, nếu không có file đó thì sẽ tạo ra file đó rồi mở, sau đó cho quyền FA_WRITE ghi vào file.

Kết quả

Sau khi lâp trình xong, chúng ta Build và vào chế độ debug. Sau đó view biến fresult, nếu kết quả là FA_OK thì có nghĩa chúng ta làm đúng.
Một lưu ý nhỏ là chúng ta nên đặt tên file không có kí tự đặc biệt, sẽ không bị báo lỗi nhé!

stm32f407 sdio ghu du lieu thanh cong

Sau đó, rút thẻ ra. Cắm vào máy tính để đọc file.

Lập trình STM32 SDIO đọc file trên thẻ nhớ

Trong quá trình mở thẻ nhớ, chúng ta sẽ thêm 1 vài kí tự vào file, sau đó lập trình để đọc lại file đó.

Đọc dữ liệu cũng tuân thủ các bược:

  • Mở thẻ nhớ
  • Mở file, cấp quyền đọc
  • Đọc file, lưu vào 1 mảng, nếu muốn đọc hết cả thẻ nhớ các bạn truyền vào f_size.
  • Đóng thẻ

stm32f407 sdio doc du lieu

Kết quả

Build và nạp vào chế độ debug, view các biến kết quả các bạn sẽ thấy như sau:

stm32f407 sdio ket qua

Sau chữ khue nguyen creator mình chỉ cho kí tự xuống dòng (0x0A), nhưng khi đọc và ghi luôn có kí tự dấu cách (0x0A), vậy nên sẽ bị sai 1 chút.
Để sửa lỗi này các bạn vào FATFS sửa như sau:

stm32f407 sdio cubemx fatfs config

Như vậy thì khi đọc, ghi dữ liệu sẽ không bị thừa kí tự dấu cách nữa.

Các bạn có thể tham khảo thêm các hàm và ví dụ khác về fatfs ở website: http://elm-chan.org/fsw/ff/00index_e.html

Kết

STM32 SDIO là một ngoại vị được dùng rất nhiều trong các ứng dụng dùng thẻ nhớ. Chúng ta có thể dùng thẻ nhớ để làm rất nhiều việc như lưu trữ các file có độ nặng cao, âm thanh, hình ảnh, lưu log của cảm biến….

Vậy nên hãy cố gắng sử dụng thành thạo nhé! Đừng quên gia nhập Hội Anh Em Nghiện Lập trình để giao lưu và học hỏi nhé!!!

 

5/5 - (1 bình chọn)

Trả lời

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *