Giao tiếp thẻ nhớ SDMMC sử dụng tập lệnh thư viện FATFS

0
844

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

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.

Truyền nhận dữ liệu thẻ nhớ SD / SDIO được thực hiện trong các khối dữ liệu. Truyền nhận dữ liệu MMC được thực hiện các khối dữ liệu hoặc streams. Truyền nhận dữ liệu các thiết bị CE-ATA được thực hiện trong các khối dữ liệu

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 là một middleware cung cấp chức năng để truy cập vào khối FAT trong bài ta sẽ dùng

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

Module thẻ SD

Nội dung Project: Tạo một file .txt và ghi nội dung vào file đó. Sau đó mở file và đọc nội dung đã ghi trong file và xuất kết quả ra cổng USART1.

Hướng dẫn cấu hình:

Bước 1: Trong mục CORTEX_M7, Enable CPU Icache và CPU Dcache

Bước 2 : Cho phép debug chip qua mạch nạp ST-LINK

Bước 3: Cấu hình tần số giao động cho chip, tần số cấp cho bộ SDMMC phải là 48Mhz như hình.

Bước 4: Ở ngoại vi SDMMC1, cấu hình mode hoạt động ở chế độ 4 bit, các tham số Parameters để mặc định như hình dưới.

Bước 5: Trong mục NVIC Setting cấu hình cho phép ngắt

Bước 6: Cấu hình sử dụng DMA

Bước 7: Trong mục Middleware

1-chọn mục FATFS, tích chọn thư viện FATFS sử dụng cho ngoại vi SD card như hình dưới.

2-Các thông số khác để mặc định, thông số này thay đổi như hình.

Bước 8: Cấu hình sử dụng USART1 để debug chương trình

Bước 9: Trong tab Project Manager, đặt tên cho Project, chọn đường dẫn lưu thư mục, chọn trình biên dịch là Keilc (MDK-ARM) và chọn phiên bản sử dụng

Bước 10: Trong mục Code Generator tích chọn Generate peripheral initialization.. Sau đó tiến hành GENERATE CODE.

Code chương trình:

#include “main.h”

#include “dma.h”

#include “fatfs.h”

#include “sdmmc.h”

#include “usart.h”

#include “gpio.h”

FATFS fs;            // Work area (file system object) for logical drive

FIL fil;                             // file objects

uint32_t byteswritten;                /* File write counts */

uint32_t bytesread;                   /* File read counts */

uint8_t wtext[] = “mai van ba test”; /* File write buffer */

uint8_t rtext[100];                     /* File read buffers */

char filename[] = “test.txt”;

void SystemClock_Config(void);

void print_string(uint8_t *s);

void printf_string(uint8_t *s);

unsigned char size(unsigned char *s);

//hàm xuất 1 chuỗi ký tự ra usart1

void print_string(uint8_t *s)

{

          HAL_UART_Transmit(&huart1,s,size(s),10);

}

//hàm xuất 1 chuỗi ký tự kèm xuống dòng ra usart1

void printf_string(uint8_t *s)

{

          HAL_UART_Transmit(&huart1,s,size(s),10);

          HAL_UART_Transmit(&huart1,”\n”,1,10);

}

//hàm trả số ký tự của 1 chuỗi

unsigned char size(unsigned char *s)

{

    int count=0;

    while(s[count]!=0) count++;

    return count;

}

int main(void)

{

  SCB_EnableICache();

  SCB_EnableDCache();

  HAL_Init();

  SystemClock_Config();

  MX_GPIO_Init();

  MX_DMA_Init();

  MX_SDMMC1_SD_Init();

  MX_USART1_UART_Init();

  MX_FATFS_Init();

  /* USER CODE BEGIN 2 */

          print_string(“run application\n\r”);

          /*##-1- Register the file system object to the FatFs module ##############*/

          retSD = f_mount(&fs, “”, 0);

          if(retSD) print_string(” mount error : %d \r\n”); else print_string(“mount done\r”);

          /*##-2- Create and Open new text file objects with write access ######*/

          retSD = f_open(&fil, filename, FA_CREATE_ALWAYS | FA_WRITE);

          if(retSD) print_string(” open file error : %d\r\n”); else print_string(“open file done\r”);

          /*##-3- Write data to the text files ###############################*/

          retSD = f_write(&fil, wtext, sizeof(wtext), (void *)&byteswritten);

          if(retSD) print_string(” write file error : %d\r\n”); else print_string(“write file done\r”);

          /*##-4- Close the open text files ################################*/

          retSD = f_close(&fil);

          if(retSD) print_string(” close error : %d\r\n”); else print_string(“close done\r”);

          /*##-5- Open the text files object with read access ##############*/

          retSD = f_open(&fil, filename, FA_READ);

          if(retSD) print_string(” open file error : %d\r\n”); else print_string(“open file done\r”);

          /*##-6- Read data from the text files ##########################*/

          retSD = f_read(&fil, rtext, sizeof(rtext), (UINT*)&bytesread);

          if(retSD) print_string(” read error!!! %d\r\n”);

          else

          {

                   print_string(“read done\r”);

                   print_string(rtext);

          }

          /*##-7- Close the open text files ############################*/

          retSD = f_close(&fil);

          if(retSD)     print_string(” close error!!! %d\r\n”);

  while (1)

  {

                   HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_6);

                   HAL_Delay(100);

  }

}

Chúc các bạn thành công!

Tác giả: Mai Văn Ba

Để cập nhật tin tức công nghệ mới nhất và các sản phẩm của công ty AIoT JSC, vui lòng truy cập link: http://aiots.vn hoặc linhkienaiot.com

0 0 Phiếu bầu
Article Rating
Subscribe
Notify of
guest
0 Comments
Phản hồi nội tuyến
Xem tất cả các bình luận