CHƢƠNG 5 : ỨNG DỤNG ĐỌC DỮ LIỆU TỪ SDCARD
5.3 XÂY DỰNG SDCARD
Hình 5.3-1 biểu diễn sơ đồ khối của ứng dụng SD Card.
Trước tiên, vào phần mềm Quartus II tạo một project. Sau đó, chọn họ và thiết bị.
Hình 5.3-2: Chọn nơi lưu, đặt tên project và tên thư mục
Hình 5.3-3: Chọn họ và thiết bị
Trong project này, chúng ta sẽ thực hiện tạo một hệ thống SOPC bằng cách sử dụng SOPC Builder. Hệ thống này sẽ được tạo ra bằng file Verilog HDL, đặt tên cho hệ thống là DE3_SOPC.
Hình 5.3-4: Tạo hệ thống phần cứng
Ta tạo một hệ thống SOPC gồm: CPU, RAM, JTAG UART, System ID, Timer, pio_led, pio_button, pio_sd_clk, pio_sd_cmd, pio_sd_dat và pll:
Đầu tiên, ta chọn Processor/Nios II Processor: CPU là bộ xử lý trung tâm, điều khiển hoạt động của hệ thống.
Tiếp theo, ta chọn Memories and Memory Controllers/On-Chip/On-Chip Memory (RAM or ROM): RAM dung để lưu trữ dữ liệu và lệnh chương trình.
Sau khi tạo bộ nhớ RAM xong, quay trở lại CPU để gán RAM cho nó.
Hình 5.3-7: Gán bộ nhớ RAM cho CPU
Tiếp theo, chọn Interface Protocols/Serial/JTAG UART: JTAG UART có chức năng kết nối với máy chủ để nạp chương trình hệ thống xuống board DE3 thông qua cổng USB Blaster.
Hình 5.3-8: Cấu hình JTAG UART
Chọn Peripherals/Debug and Performance/System ID Perpheral: System ID là module cung cấp một số tác dụng nhận dạng hệ thống phần cứng trên board DE3.
Tùy thuộc vào thời gian delay cần thiết kế mà ta có thể thay đổi giá trị trong Period, đơn vị trong Units. Ta vào Peripherals/Microcontroller Peripherals/Interval Timer:
Hình 5.3-10: Cấu hình Timer
Giao thức PIO sẽ thiết kế 5 mạch kết nối gồm: 1 ngõ ra 24 bit (LED RGB), 1 ngõ vào (button), 1 ngõ ra (SD_CLK), 1 ngõ vào ra (SD_CMD) và 1 ngõ vào ra (SD_DAT).
Hình 5.3-11: Cấu hình PIO
Hình 5.3-13: Cấp xung clock ngõ ra 50Mhz
Để biên dịch hệ thống, ta cần gán địa chỉ nền cho các core đã thiết kế. Chọn System/Auto-Assign Base Addresses
Kết quả sau khi gán địa chỉ nền:
Hình 5.3-15: Tạo hệ thống thành công
Sau khi xây dựng hệ thống hoàn chỉnh, bắt đầu gán chân cho hệ thống và nạp xuống board. Quay lại phần mềm Quartus II vào File chọn Add/Remove Files in Project sẽ xuất hiện hộp thoại, chỉ đến file .v.
Hình 5.3-16: Thêm file .v
Để gán chân chân cho hệ thống, ta vào File/New chọn Block Diagram/ Schematic File. Vào Symbol Tool để lấy sơ đồ khối hệ thống (DE3_SOPC).
Sau đó, ta thực hiện gán chân cho hệ thống, vào Pin Tool để lấy ngõ vào, ngõ ra, ngõ vào ra. Vào Assignments/Import Assignments… dẫn tập tin DE3_SDCARD.qsf để xác định chân cụ thể. Lưu ý: gán chân chỗ ngõ vào/ra/hai chiều.
Hình 5.3-17: Gán chân cho hệ thống
Hình 5.3-18: Biên dịch thành công
Sau khi biên dịch xong, nhấp vào Programmer, chọn Start để nạp file DE3_SDCARD.sof xuống board DE3. Kết quả nạp xuống board thành công.
Hình 5.3-19: Nạp xuống board thành công
Khi nạp xuống board thành công, tiến hành viết chương trình ứng dụng cho hệ thống phần cứng đã được thiết kế bằng chương trình Nios II Software Build Tools for Eclipse.
Ta chọn đường dẫn nơi lưu trữ phần mềm ứng dụng:
Hình 5.3-21: Chọn nơi lưu trữ phần mềm
Sau khi đã chọn đường dẫn, cửa sổ soạn thảo chương trình ứng dụng được tạo ra. Vào File/New chọn Nios II Application and BSP from Template.
Hình 5.3-23: Tạo ứng dụng mới dựa trên code có sẵn
Chương trình ứng dụng sử dụng code mẫu có sẵn và đánh đoạn code thay thế code có sẵn theo ý muốn.
#include <stdio.h>
#include "terasic_lib\terasic_includes.h" #include "terasic_fat\FatFileSystem.h" #include "terasic_sdcard\SDCardDriver.h"
bool Fat_Test(FAT_HANDLE hFat, char *pDumpFile){ bool bSuccess;
int nCount = 0;
FAT_BROWSE_HANDLE hBrowse; FILE_CONTEXT FileContext;
bSuccess = Fat_FileBrowseBegin(hFat, &hBrowse); if (bSuccess){
while(Fat_FileBrowseNext(&hBrowse, &FileContext)){ if (FileContext.bLongFilename){
alt_u8 *pData8;
pData16 = (alt_u16 *)FileContext.szName; pData8 = FileContext.szName; printf("[%d]", nCount); while(*pData16){ if (*pData8) printf("%c", *pData8); pData8++; if (*pData8) printf("%c", *pData8); pData8++; // pData16++;} printf("\n"); }else{
printf("[%d]%s\n", nCount, FileContext.szName);} nCount++;}}
if (bSuccess && pDumpFile && strlen(pDumpFile)){ FAT_FILE_HANDLE hFile;
hFile = Fat_FileOpen(hFat, pDumpFile); if (hFile){
char szRead[256];
int nReadSize, nFileSize, nTotalReadSize=0; nFileSize = Fat_FileSize(hFile);
if (nReadSize > sizeof(szRead)) nReadSize = sizeof(szRead); printf("%s dump:\n", pDumpFile);
while(bSuccess && nTotalReadSize < nFileSize){ nReadSize = sizeof(szRead);
if (nReadSize > (nFileSize - nTotalReadSize)) nReadSize = (nFileSize - nTotalReadSize); if (Fat_FileRead(hFile, szRead, nReadSize)){ int i;
for(i=0;i<nReadSize;i++){ printf("%c", szRead[i]);} nTotalReadSize += nReadSize;}
else{ bSuccess = FALSE;
printf("\nFaied to read the file \"%s\"\n", pDumpFile);}} // while if (bSuccess) printf("\n");
Fat_FileClose(hFile);} else{ bSuccess = FALSE;
printf("Cannot find the file \"%s\"\n", pDumpFile); }} return bSuccess;}
int main()
const alt_u32 LED_GREEN_PATTERN = 0xFF00FF; const alt_u32 LED_RED_PATTERN = 0x00FFFF; FAT_HANDLE hFat;
printf("========== DE3 SDCARD Demo [13/04/2015]\n"); while(1){
IOWR_ALTERA_AVALON_PIO_DATA(PIO_LED_BASE, LED_BLUE_PATTERN); hFat = Fat_Mount(FAT_SD_CARD, 0);
if (hFat){
printf("sdcard mount success!\n");
printf("Root Directory Item Count:%d\n", Fat_FileCount(hFat)); Fat_Test(hFat, "test.txt");
Fat_Unmount(hFat);
IOWR_ALTERA_AVALON_PIO_DATA(PIO_LED_BASE, LED_GREEN_PATTERN); }else{
printf("Failed to mount the SDCARD!\nPlease insert the SDCARD into DE3 board and press BUTTON3.\n");
IOWR_ALTERA_AVALON_PIO_DATA(PIO_LED_BASE, LED_RED_PATTERN); } // wait users to press BUTTON3
while ((IORD_ALTERA_AVALON_PIO_DATA(PIO_BUTTON_BASE) & 0x08) == 0x08); IOWR_ALTERA_AVALON_PIO_DATA(PIO_LED_BASE, LED_BLUE_PATTERN); usleep(400*1000); // debounce
} // while return 0;}
Sau đó, ta thực hiện biên dịch chương trình ứng dụng, nhấp chuột phải vào DE3_SDCARD chọn Build Project.
Hình 5.3-25: Biên dịch chương trình thành công
Để chạy chương trình ứng dụng, nhấp chuột phải lên DE3_SDCARD chọn Run As/Run Configuration để tạo New_configuration, sau đó Run để chạy chương trình xuống board.
Hình 5.3-26: Chạy chương trình ứng dụng
Kết quả khi chạy chương trình là “HAI QUYEN & HONG HANH [10/5/2015]”.
Hình 5.3-27: Kết quả chạy thành công
Khi chương trình thực thi, nó phát hiện thẻ SD được chèn vào. Nếu một thẻ SD được tìm thấy, nó sẽ kiểm tra thẻ SD có định dạng hệ thống tập tin FAT hay chưa. Nếu một
hệ thống tập tin FAT được tìm thấy, nó sẽ tìm kiếm tất cả các file trong thư mục gốc của hệ thống tập tin FAT và lúc này đèn xanh lá sẽ được sáng.
Hình 5.3-28: Phát hiện thẻ SD thành công
Mặt khác, LED màu đỏ sáng nếu chương trình không thành công phân tích các hệ thống tập tin FAT hoặc không có thẻ SD được tìm thấy trong các ổ cắm thẻ SD của Board DE3. Nếu người dùng nhấn button3 của Board DE3, chương trình sẽ thực hiện quá trình trên một lần nữa.