This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] MSP-EXP430FR4133:使用 SPI 连接 SD 卡以读取音频.wav 文件

Guru**** 1633940 points
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1352935/msp-exp430fr4133-sd-card-interfacing-using-spi-to-read-audio-wav-files

器件型号:MSP-EXP430FR4133

大家好,我希望有一些指导,我目前正在尝试通过 SPI 与外部 SD 读卡器通信,安装了4GB 卡,在这种情况下 SDHC 会适用(我认为这是正确的)。
我已经下载了所需的 FATF32库、并将其包含在我的代码中、同时还下载了适用于大多数电路板的第三方 MSP430库、并为 SPI 配置正确选择了引脚 I/O。 Im 在执行某些 FATF 功能时感到很棘手,并想知道是否有人可以帮助我:)。  

我在下面链接了我的代码、之后我上传了我遇到的错误。  

使用 IAR Embedded Workbench IDE  

#include "msp430.h"
#include "msp430_spi.h"  // Include your SPI library
#include "ff.h"         // Include FatFs library for SD card access
#include "diskio.h"     // Include low-level disk I/O functions
#include "userconfig.h"
#include "stdio.h"


#define BUFFER_SIZE 512  // Define buffer size for reading data from SD card
#define SPI_CS BIT3  // Chip select pin

#define CMD0 0x40
#define CMD8 0x48
#define ACMD41  (41 | 0x80)

#define R1_IDLE_STATE 0x01
#define CMD58 0x3A

// Function prototypes
uint8_t send_command(uint8_t cmd, uint32_t arg);
uint8_t read_response(uint8_t *response, uint8_t num_bytes);


// Function prototypes
void sd_card_init();

int main(void) {
    FRESULT result;          // FatFs function result
    FATFS fs;                // File system object
    FIL file;                // File object
    BYTE buffer[BUFFER_SIZE];  // Data buffer for reading from file

    // Disable watchdog timer
    WDTCTL = WDTPW + WDTHOLD;

    // Initialize MSP430 SPI
    spi_init();

    // Initialize SD card
    sd_card_init();

    // Mount the SD card
    result = f_mount(&fs, "", 0);
    if (result != FR_OK) {
        // Error handling
        return 1;
    }

    // Open the text file for reading
    result = f_open(&file, "Test.txt", FA_READ);
    if (result != FR_OK) {
        // Error handling
        return 1;
    }

    // Read data from the file
    UINT bytesRead;
    result = f_read(&file, buffer, BUFFER_SIZE, &bytesRead);
    if (result != FR_OK) {
        // Error handling
        f_close(&file);
        return 1;
    }

    // Close the file
    f_close(&file);

    // Process the data read from the file
    // For example, you can print it to the console
    int i;
    for (i = 0; i < bytesRead; i++) {
        putchar(buffer[i]);  // Assuming UART is used for output
    }

    // End of program
    return 0;
}

// Initialize SD card
void sd_card_init() {
    // Chip select low to select SD card
    P1OUT &= ~SPI_CS;

    // Delay for at least 74 clock cycles (about 1 ms)
    __delay_cycles(1000);

    // Send CMD0 (GO_IDLE_STATE) command
    send_command(CMD0, 0);

    // Send CMD8 (SEND_IF_COND) command
    send_command(CMD8, 0x000001AA);  // CMD8 with argument 0x1AA (voltage range 2.7-3.6V)

    // Read R7 response to CMD8
    uint8_t response[5];
    if (read_response(response, 5) != 0) {
        // Error handling
        return;
    }

    // Verify that SD card is version 2.x and voltage range is supported
    if ((response[2] != 0x01) || (response[3] != 0xAA)) {
        // Error handling
        return;
    }

    // Send ACMD41 (SD_SEND_OP_COND) command until card is ready
    // (loop until card returns R1_IDLE_STATE indicating initialization complete)
    while (send_command(ACMD41, 0) != R1_IDLE_STATE);

    // Send CMD58 (READ_OCR) command to read OCR register
    send_command(CMD58, 0);

    // Read R3 response to CMD58
    if (read_response(response, 5) != 0) {
        // Error handling
        return;
    }

    // Verify SDHC or SDXC card (check CCS bit in OCR)
    if (response[1] & 0x40) {
        // SDHC or SDXC card detected
    } else {
        // Standard capacity SD card detected
    }

    // Chip select high to deselect SD card
    P1OUT |= SPI_CS;
}

	Error[e46]: Undefined external "f_read" referred in main (C:\Users\*****\Documents\SPI_Code\Debug\Obj\main.r43).			

对于所有函数'f_open f_close f_read 等、都会发生此错误。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好, Jakub

    检查您在 main.c 标题中包含的库。

    确认存在这些未定义的外部函数。

    此致、

    赫利克

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    大家好、Helic、所有 f_functions 都应该位于 ff.h 或 diskio.h 中、因为这些 f_functions 都是 FATF 库的外部函数、我可以看到这些文件中有一些定义、这就是为什么我对它为什么说未定义的外部函数感到困惑的原因。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好, 

    链接器似乎未正确处理 ff.h 中的所有函数。

    这行代码未显示任何无法找到文件的错误?

    #include "ff.h"         // Include FatFs library for SD card access

    此致、

    赫利克

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    嗨、这行代码确实没有显示任何错误

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好,Jakub

    我已经给您发送了一封电子邮件。

    此致、

    赫利克

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好, 

    ff.h 存储在工程的根文件夹中、如果设置了以下包含路径、CCS 应会找到该路径:

    我尝试在 CCS 中构建此项目、结果为:

    DRESULT disk_read (BYTE pdrv, BYTE* buff, LBA_t sector, UINT count);
    DRESULT disk_write (BYTE pdrv, const BYTE* buff, LBA_t sector, UINT count);

    "..\diskio.h",第31行:错误#20:标识符"LBA_t"未定义
    "..\diskio.h",第32行:错误#20:标识符"LBA_t"未定义

    此项目中没有定义 LBA_t。 我尝试在项目文件夹中搜索此类型、但未找到任何内容。

    此致、

    赫利克