Đề tài: Nghiên cứu, thiết kế hệ thống phát thanh thông tin qua mạng 3G/4G (P2)

Tiếp tục trong chuỗi bài viết xây dựng các chức năng cơ bản của hệ thống phát thanh thông tin sử dụng vi điều khiển STM32. Tại phần 1, mình đã hướng dẫn các bạn thực hiện việc phát âm thanh bằng PWM và DAC trên vi điều khiển STM32. Phần này mình sẽ tiếp tục hướng dẫn các bạn giao tiếp thẻ nhớ SD Card bằng SPI và sử dụng hệ thống FATFS.

Phần 2. Giao tiếp thẻ nhớ SD Card bằng SPI và sử dụng hệ thống FATFS

1. Tìm hiểu về thẻ nhớ microSD (TF card) và module thẻ nhớ

1.1 Thẻ nhớ microSD

Thẻ nhớ SD là thẻ nhớ dựa trên công nghệ bộ nhớ flash bán dẫn. Để đáp ứng các yêu cầu về công nghệ, người ta liên tục giảm kích thước của thẻ nhớ SD xuống. Thẻ nhớ miniSD hoặc microSD ngày nay có kích thước nhỏ hơn nhiều so với thẻ SD tiêu chuẩn, trong khi vẫn tương thích được với các chức năng của thẻ SD tiêu chuẩn. Thẻ nhớ microSD có 8 chân (ít hơn một chân VSS so với thẻ SD tiêu chuẩn) như hình vẽ:

Năm 2006, bộ thông số kỹ thuật SD spec Ver2.0 của thẻ SD được phát hành bởi SDA và các thẻ này có thể có dung lượng từ 4GB trở lên. Các thẻ nhớ tuân thủ theo bộ thông số này được gọi là thẻ SDHC (SD dung lượng cao). Về hình thức thì vẫn giống với thẻ SD bình thường, nhưng hệ thống tệp được thay đổi từ FAT12 và FAT16 thành FAT32. Trên thẻ nhớ SDHC có các thông số bạn cần quan tâm cho dự án của bạn như tốc độ ghi (2MB/s, 4MB/s, … được khoanh tròn) và có ghi thêm ký hiệu SDHC.

1.2. Module thẻ nhớ SD

Module thẻ nhớ SD mình sử dụng là loại module cho thẻ microSD giao tiếp SPI. Để giao tiếp STM32 với thẻ nhớ SD thì có thể sử dụng SDIO và SPI. Về tốc độ, thì SDIO có tốc độ cao hơn so với SPI (tốc độ đọc ghi khoảng 1 – 2MB/s). Tuy nhiên, không phải vi điều khiển nào cũng có SDIO, vì vậy mình sử dụng SPI vì sự phổ biến của nó. Ngoài ra, các bạn có thể tìm đọc bài viết về giao tiếp SPI của Tapit tại đây.

2. Giới thiệu về FATFS
FATFS là một hệ thống tệp FAT chung cho các hệ thống nhúng nhỏ, nó được viết bằng ngôn ngữ ANSI C (C89) và hoàn toàn độc lập với các lớp I/O (các bạn tham khảo hình ảnh bên dưới). Vì vậy mà nó có thể độc lập với các bộ xử lý khác nhau mà không cần phải sửa đổi. FATFS tích hợp trong STM32CubeIDE có thể thuận tiện hơn trong sử dụng với vi điều khiển STM32. Nó hỗ trợ FAT12, FAT16 và FAT32, hỗ trợ nhiều phương tiện lưu trữ, có thể đọc ghi nhiều tệp.

Nguồn: https://www.st.com/

Để tìm hiểu thêm về FATFS và các API của nó, các bạn có thể truy cập vào đường dẫn: http://elm-chan.org/fsw/ff/00index_e.html

3. Hướng dẫn thực hành giao tiếp module thẻ nhớ SD với vi điều khiển STM32

3.1. Sơ đồ nối chân

Mình sử dụng khối ngoại vi SPI1 để giao tiếp giữa STM32 với module thẻ nhớ SD. 

STM32 Module SD Card
PB0 CS
PA5 SCK
PA7 MOSI
PA6 MISO
5V VCC
GND GND

3.2. Cấu hình và viết chương trình trên STM32CubeIDE

Các bạn tạo mới một project, hoặc tiếp tục sử dụng project mình đã hướng dẫn ở phần 1.

Bước 1: Cấu hình SYSClock Configuration như hình ảnh bên dưới.

Bước 2: Cấu hình UART1 để hiển thị dữ liệu lên màn hình máy tính. Các bạn cần kết nối thêm với các USB-TTL để có thể giao tiếp giữa vi điều khiển và máy tính.

  • Mode: Asynchronous
  • Baudrate: 115200 Bits/s
  • Word Length: 8 bit, không sử dụng bit Parity (bit chẵn lẻ)
  • Stop bits: 1

Bước 3: Cấu hình SPI1 ở chế độ Full-Duplex Master

  • Data Size: 8 bit
  • Prescaler: 16
  • Các thông số còn lại giữ nguyên

Bước 4: Sử dụng chân PB0 làm chân GPIO Output, kết nối với chân CS của module thẻ nhớ.

Bước 5: Vào Middleware, cấu hình FATFS, tick vào ô User-defined.

  • USE_LFN: chọn Enable with static working buffer on the BSS
  • MAX_SS: 4096
  • Còn lại giữ mặc định

Bước 6: Nhấn vào biểu tượng sinh code.

Bước 7: Các bạn thêm các thư viện: fatfs_sd.h và SD.h vào mục Core > Inc; fatfs_sd.c và SD.c vào mục Core > Src; user_diskio.c vào FATFS > Target.

Link thư viện các bạn vào đây để tải: https://bit.ly/3hqncoS

Bước 8: Các bạn vào Core > Src mở file stm32f3xx_it.c và thêm các phần mã code như sau:

Bước 9: Trong file fatfs_sd.h, các bạn kiểm tra lại chân IO mà các bạn đã khai báo dùng để kết nối với chân CS của module thẻ nhớ đã đúng chưa, nếu chưa đúng thì sửa lại.

Bước 10: Trong file fatfs_sd.c, các bạn thêm thư viện sau tương ứng với vi điều khiển mà bạn đang dùng, nếu bạn dùng F1 hay F4 thì chỉ cần sửa lại là được, ở đây mình sử dụng F3.

Bước 11: Các bạn mở file SD.c để đọc các hàm cơ bản để làm việc với thẻ nhớ. Các hàm chức năng bên trong các bạn xem thêm ở đường dẫn mình đã giới thiệu ở mục 2.

Mình sẽ sử dụng UART1, kết nối với máy tính, sử dụng phần mềm Hercules để hiển thị thông tin.

  • Hàm SD_getSpaceInfo(); biết được thông tin về bộ nhớ của thẻ nhớ.

Mình sử dụng thẻ nhớ 4GB, và thẻ còn trống khá nhiều.

  • Hàm SD_createFile(); tạo mới một file, mình sẽ tạo mới một file là Tapit.txt

Khi file đã được tạo thành công, thì sẽ hiện lên Hercules, đồng thời khi kiểm tra biến res (biến trả về kết quả của nhiệm vụ) sẽ có giá trị là FR_OK.

  • Hàm SD_write(); ghi vào file
  • Hàm SD_read(); đọc nội dung của file

Nội dung của bộ đệm đã được ghi vào trong file Tapit.txt, sau đó hàm SD_read(); đã đọc và in dữ liệu đọc được đó ra màn hình.

  • Hàm SD_updateFile(); dùng để ghi tiếp nội dung vào file

Các bạn có thể thấy được là chuỗi “Xin chao tat ca cac ban” đã được ghi tiếp vào file. Hàm SD_read(); đã đọc nội dung và in ra màn hình như các bạn có thể thấy.

  • Hàm SD_removeFile(); hàm này được dùng để xoá một file. Nếu file không có sẵn thì nó sẽ báo về là file không tồn tại.

Trong thư viện, thì mình đã viết các hàm thao tác cơ bản với thẻ nhớ, các bạn có thể phát triển thêm dựa trên thư viện này.

Như vậy mình đã giới thiệu xong phần giao tiếp cơ bản giữa vi điều khiển STM32 với module thẻ nhớ. Dựa trên các thao tác cơ bản với thẻ nhớ, mình sẽ phát triển việc ghi và đọc ra một file có kích thước lớn sẽ như thế nào. Các bạn hãy theo dõi tiếp phần sau nha!