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.

[参考译文] LAUNCHXL-F280049C:F280049C Luanchpad 无法与 SPISD 卡模块连接

Guru**** 2460850 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1503035/launchxl-f280049c-f280049c-luanchpad-unable-to-interface-with-spisd-card-module

器件型号:LAUNCHXL-F280049C

工具/软件:

我一直在尝试使用 FTF 和 SDISP 接口库集成 SPISD 模块。 一些它是如何工作的。 我是一个初学者,我恳请在这方面提供一些信息。

void sd_init ()

uint16_t i;
对于(I = 0;I < 10;I++) SPI_SEND_BYTE (0xFF);
uint16_t r = sd_cmd (0、0);
while (r!= 0x01) r = sd_cmd (0、0);

R = SD_cmd (8、0x1AA);

对于(i = 0;i < 4;i++) spi_recv_byte ();

执行{
sd_cmd (55、0);
R = SD_cmd (41、0x40000000);
} while (r!= 0x00);
}

我的代码卡在这个块中...它没有返回。 我正在使用这个 SPISD 接口。

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

    我可以进一步推动这一点。 第一个问题是我一直在尝试手动切换 Chip Select。 它与//gpio_setPinConfig (GPIO_57_SPIA_STE)冲突; 每当我声明它时、手动芯片选择不会切换。 现在所有 CLK MOSI 和 CS 都根据要求切换、但 SD 卡没有响应... 请在这方面提供进一步的指导。 我一直尝试使用 CS 1发送74个字节、但 SD 卡没有响应。 我使用3.3V 电源和 GND..SIMO 数据没有来自 SD 卡。

    void initSPI (void){
    scia_send_string ("Init SPI Start\r\n");

    //为 SPI 配置 GPIO 引脚
    GPIO_setPinConfig (GPIO_16_SPIA_SIMO);// SPI MOSI
    GPIO_setPinConfig (GPIO_17_SPIA_SOMI);// SPI MISO
    GPIO_setPinConfig (GPIO_56_SPIA_CLK);// SPI 时钟
    //gpio_setPinConfig (GPIO_57_SPIA_STE);// SPI 片选(STE)

    //配置 CS 引脚(确保 CS 是用于手动控制的 GPIO 引脚)
    GPIO_setDirectionMode (SPI_CS_PIN、GPIO_DIR_MODE_OUT);
    GPIO_setPadConfig (SPI_CS_PIN、GPIO_PIN_TYPE_STD);
    GPIO_writePin (SPI_CS_PIN、1);//初始将 CS 设置为高电平

    scia_send_string ("GPIO 配置完成\r\n");

    //禁用用于配置的 SPI 模块
    SPI_disableModule (SPIA_BASE);
    scia_send_string ("SPI Disabled\r\n");

    //配置 SPI 设置
    //spi_setConfig (SPIA_BASE、DEVICE_LSPCLK_FREQ、SPI_PROT_POL0PHA0、SPI_MODE_MASTER、SPI_BAUDRATE_INIT、 8);
    SPI_setConfig (SPIA_BASE、DEVICE_LSPCLK_FREQ、SPI_PROT_POL1PHA1、SPI_MODE_MASTER、SPI_BAUDRATE_INIT、 8);
    scia_send_string ("SPI Config Set\r\n");

    //设置仿真模式(可选、正常运行时可能会删除)
    SPI_setEmulationMode (SPIA_BASE、SPI_emulation_stop_midway);

    //启用 SPI 模块
    SPI_enableModule (SPIA_BASE);
    scia_send_string ("SPI Enabled\r\n");

    //手动控制 CS 引脚(在 SPI 通信之前)
    GPIO_writePin (SPI_CS_PIN、0);//将 CS 设置为低电平(开始通信)

    //在此处执行非阻塞写入的 SPI 通信
    uint16_t dataToSend = 0x1234;

    //使用非阻塞版本发送数据
    SPI_writeDataNonBlocking (SPIA_BASE、dataToSend);//非阻塞:不等待

    //此时、数据被写入 SPI 缓冲区、但仍在后台传输。

    //手动控制 CS 引脚(在 SPI 通信后)
    GPIO_writePin (SPI_CS_PIN、1);//将 CS 设置为高电平(结束通信)

    scia_send_string ("SPI 通信完成\r\n");
    }

    byte disk_initialize(void){
    字节 ty = 0、buf[4];
    UINT tmr;
    int i;
    uint16_t k;
    scia_send_string ("Disk Init Start\r\n");
    GPIO_writePin (SPI_CS_PIN、1);
    if (GPIO_readPin (SPI_CS_PIN)= 0){
    scia_send_string ("NAG CS 被拉至低电平\r\n");
    }其他{
    scia_send_string ("CS NAG 拉至高电平。\r\n");
    }
    setSPIBaudrate (SPI_BAUDRATE_INIT);
    device_delay_US (10000);//允许上电
    K=spiInitSpiMode();
    //对于(i = 0;i < 10;i++) spiTransferByte (0xFF);

    GPIO_writePin (SPI_CS_PIN、0);
    if (GPIO_readPin (SPI_CS_PIN)= 0){
    scia_send_string ("NAG CS 被拉至低电平\r\n");
    }其他{
    scia_send_string ("CS NAG 拉至高电平。\r\n");
    }
    if (send_cmd (0、0、0x95)== 1){// CMD0:进入空闲状态
    scia_send_string ("CMD0 OK\r\n");

    if (send_cmd (8、0x1AA、0x87)= 1){// CMD8:检查电压
    对于(i = 0;i < 4;i++) buf[i]= spiReceiveByte ();// R7

    如果(buf[2]== 0x01 && buf[3]== 0xAA){
    scia_send_string ("SDv2 detected\r\n");

    //等待空闲状态(ACMD41、带 HCS)
    对于(tmr = 1000;tmr;tmr--){
    如果(send_cmd (55、0、0x01)<= 1 && send_cmd (41、0x40000000、0x01)= 0)
    休息;
    DEVICE_DELAY_US (1000);
    }

    if (tmr && SEND_cmd (58、0、0x01)== 0){// CMD58:读取 OCR
    for (i = 0; i < 4; i++) buf[i]= spiReceiveByte();
    Ty =(buf[0]& 0x40)? (CT_SD2 | CT_BLOCK ): CT_SD2;
    }
    }
    }其他{
    scia_send_string ("SDv1或 MMC 检测到\r\n");

    if (send_cmd (55、0、0x01)<= 1 && send_cmd (41、0、0x01)<= 1){
    Ty = CT_SD1;
    对于(tmr = 1000;tmr;tmr--){
    if (send_cmd (55、0、0x01)<= 1 && send_cmd (41、0、0x01)=0)
    休息;
    DEVICE_DELAY_US (1000);
    }
    }其他{
    Ty = CT_MMC;
    对于(tmr = 1000;tmr;tmr--){
    if (send_cmd (1、0、0x01)=0)
    休息;
    DEVICE_DELAY_US (1000);
    }
    }

    if (tmr == 0 || send_cmd (16,512、0x01)!= 0)// CMD16:设置块大小
    Ty = 0;
    }
    }
    GPIO_writePin (SPI_CS_PIN、1);
    spiSendByte (0xFF);//多一个虚拟时钟

    CardType = ty;

    如果(ty){
    scia_send_string ("磁盘初始化成功\r\n");
    setSPIBaudrate (SPI_BAUDRATE_DATA);//切换到快速模式
    返回0;
    }其他{
    scia_send_string ("磁盘初始化失败\r\n");
    返回1;
    }
    }它总是失败

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

    您好:

    请尽量不要在帖子的文本中写出长代码块。 可以在 e2e 中嵌入/附加文件和代码摘录、当其格式类似时、很难解析原始代码。 我们过去曾遇到过大量摘录导致网站严重滞后甚至崩溃的问题。

    对于您的问题、我有2条初步建议:

    1. 如果可能、使用示波器或信号分析器验证是否已在 Rx 和 Tx 线路上成功发送信息。
    2. 使用 CCS、在代码停滞时暂停调试器、并确定变量"r"的状态。 这是否会告诉您更多信息?

    顺便说一下、当您说 SPISD 时、您指的是什么特定的库?

    此致、
    Jason Osborn