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.

[参考译文] CCS/TMS320F28379D:通过 SPI 支持 SD 的 TMS320F28379D LaunchPadXL 接口

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

https://e2e.ti.com/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/939747/ccs-tms320f28379d-tms320f28379d-launchpadxl-interface-with-sd-via-spi

器件型号:TMS320F28379D

工具/软件:Code Composer Studio

大家好、

我使用 的是 TMS320F28379D LaunchPadXL 板 。 我想将该数据存储在 SD 卡模块上。 好的、现在。 我已经介绍了 CCS 中提供的 SD 卡接口示例、如 sd_card.c、mmc_F2837x.c、ff.c  

这是我的主代码和 Power_ON 设置多路复用器引脚。我已经将 MMC_F2837x.c   中的每个 SpicRegs 更改为 SpiaRegs。接下来我尝试使用 f_mount、f_open、f_write、f_close、但没有发生任何情况。我是否做了错误? 能不能有人建议我。我是新的、这是我的第一个开发套件。

谢谢

int
main (void)
{
INT nStatus;
fil 文件;
字 btw = 5;
FRESULT 结果;
字 bw;
char buff []={'t'、'e'、's'、't'、'n'};

//
//初始化系统控制
//
InitSysCtrl();

#ifdef _flash
//
将时间关键代码和闪存设置代码复制到 RAM
//其中包括以下函数:InitFlash();
// RamfuncsLoadStart、RamfuncsLoadSize 和 RamfuncsRunStart
//符号由链接器创建。 请参阅器件.cmd 文件。
//
memcpy (&RamfuncsRunStart、&RamfuncsLoadStart、(size_t)&RamfuncsLoadSize);

//
//调用闪存初始化以设置闪存等待状态
//此函数必须驻留在 RAM
中//
InitFlash();
#endif

//
//初始化中断控制器和矢量表
//
InitPieCtrl();
InitPieVectTable();

//
//将系统节拍设置为每秒触发100次。
//
SysTickInit();
SysTickPeriodSet (SysCtlClockGet (system_clock_speed)/ 100);
SysTickIntRegister (SysTickHandler);
SysTickIntEnable();
SysTickEnable();

//
//启用中断
//
IntMasterEnable();


//SPI-A 初始值
POWER_ON();

//FatFs
fresult = f_mount (0、&g_sFatfs);
if (fresult!= FR_OK)
{
return (fresult);
}

fresult = f_open (&file、"Test.txt"、fa_create_new);
if (fresult!= FR_OK)
{
return (fresult);
}

fresult = f_write (&file、buff、btw、&bw);
if (fresult!= FR_OK)
{
return (fresult);
}

fresult = f_close (&file);
if (fresult!= FR_OK)
{
return (fresult);
}


} 

POWER_ON 设置引脚  

void power_on (void)//编辑
{
/*
*这并不是真正打开电源、而是初始化
与 SD 卡通信所需的 SPI 端口和引脚。
*
EALLOW;
/*启用用于在 SPI 上驱动 SDC 的外设*/
CpuSysRegs.PCLKCR8.bit.SPI_A = 1;

/*
*将相应的引脚配置为 SPI 而不是 GPIO。 CS
*信号被直接驱动、以确保我们可以通过将其保持在低电平
*完成与 SD 卡的交易。
*


//解锁 SD 卡 SPI GPIO
GpioCtrlRegs.GPBLOCK.bit.GPIO58=0;
GpioCtrlRegs.GPBLOCK.bit.GPIO59=0;
GpioCtrlRegs.GPBLOCK.bit.GPIO60=0;
GpioCtrlRegs.GPBLOCK.bit.GPIO61=0;

//设置 MUX 和 DIR
GpioCtrlRegs.GPBMUX2.bit.GPIO61 = 0;//保留为 GPIO 以进行手动 CS 控制

GpioCtrlRegs.GPBGMUX2.bit.GPIO58 = 15;
GpioCtrlRegs.GPBGMUX2.bit.GPIO59 = 15;
GpioCtrlRegs.GPBGMUX2.bit.GPIO60 = 15;
GpioCtrlRegs.GPBGMUX2.bit.GPIO61 = 15;

GpioCtrlRegs.GPBMUX2.bit.GPIO58 = 15;
GpioCtrlRegs.GPBMUX2.bit.GPIO59 = 15;
GpioCtrlRegs.GPBMUX2.bit.GPIO60 = 15;
GpioCtrlRegs.GPBMUX2.bit.GPIO61 = 15;

GpioCtrlRegs.GPBDIR.bit.GPIO61=1;

//设置 GPIO 上拉禁用/启用
GpioCtrlRegs.GPBPUD.bit.GPIO58 = 0;//通常需要被拉高
GpioCtrlRegs.GPBPUD.bit.GPIO59 = 0;//通常需要被拉高
GpioCtrlRegs.GPBPUD.bit.GPIO60=0;
GpioCtrlRegs.GPBPUD.bit.GPIO61=0;

//在异步模式下设置 GPIO
GpioCtrlRegs.GPBQSEL2.bit.GPIO58 = 3;//异步输入
GpioCtrlRegs.GPBQSEL2.bit.GPIO59 = 3;
GpioCtrlRegs.GPBQSEL2.bit.GPIO60 = 3;
GpioCtrlRegs.GPBQSEL2.bit.GPIO61 = 3;

//为 CPU1配置 GPIO
GpioCtrlRegs.GPBCSEL4.bit.GPIO58=0;
GpioCtrlRegs.GPBCSEL4.bit.GPIO59=0;
GpioCtrlRegs.GPBCSEL4.bit.GPIO60=0;
GpioCtrlRegs.GPBCSEL4.bit.GPIO61=0;

//锁定 SD 卡 SPI GPIO
GpioCtrlRegs.GPBLOCK.bit.GPIO58=1;
GpioCtrlRegs.GPBLOCK.bit.GPIO59=1;
GpioCtrlRegs.GPBLOCK.bit.GPIO60=1;
GpioCtrlRegs.GPBLOCK.bit.GPIO61=1;
EDIS;


/*取消***芯片为 SD 卡和串行闪存选择的置位*/
取消选择();

/*配置 SPI C 端口*/
SpiaRegs.SPICCR.bit.SPISWRESET = 0; //将复位位位设置为低电平
SpiaRegs.SPICTL.bit.CLK_PHASE = 0;
SpiaRegs.SPICCR.bit.CLKPOLARITY = 1;
SpiaRegs.SPICTL.bit.MASTER_SLAVE = 1; //主控模式
SpiaRegs.SPIBRR.ALL = 63; //将值更新为正确设置以实现正确的比特率(电流:~500kHz)
SpiaRegs.SPICCR.bit.SPICHAR = 0x7; //将字符长度设置为8位
SpiaRegs.SPICTL.bit.TALK = 1;
SpiaRegs.SPICCR.bit.SPISWRESET = 1; //从复位中释放 SPI
SpiaRegs.SPIPRI.bit.FREE = 1;
SpiaRegs.SPIPRI.bit.Soft = 1;

/*将 DI 和 CS 设置为高电平并向卡的 SCLK 施加超过74个脉冲*/
/*才能接受本机命令。 *
//send_inition_clock_train ();

//DELAY_US (50);

PowerFlag = 1;
} 

https://www.ti.com/tool/LAUNCHXL-F28379D 开发套件

https://www.amazon.com/Module-Storage-Adapter-Interface-Arduino/dp/B07PFDFPPC/ref=sr_1_13?dchild=1&keywords=arduino+sd+card+module&qid=1599798912&sr=8-13 

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

    我在 f_open 处找到 fresult return、它的 return  FR_NOT _READY。 然后使用单步执行此函数 f_open -> auto_mount -> disk_initialize -> send_cmd -> wait_ready

    它始终是无穷大循环、因为它始终返回0x0000而不是0x00FF

    在 其他命令中、正确发送(cmd = 0x0040)

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

    大家好、 我们已经为熟悉此领域的 C2000工程师之一分配了此任务。  他们在周二之前都不在办公室、因此您应该会听到他们的声音。   

    我们没有现成的示例、但我发现一些相关帖子可能会有所帮助。

    https://e2e.ti.com/support/microcontrollers/c2000/f/171/t/837159?CCS-LAUNCHXL-F28379D-how-to-use-SD-card-in-SPI-mode-

    https://e2e.ti.com/support/microcontrollers/c2000/f/171/t/870560?CCS-LAUNCHXL-F280049C-Micro-SD-Card-interfacing-with-F280049C

    此致

    Lori

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

    您是否可以使用逻辑分析仪或示波器来确保信号看起来正常?

    您的芯片选择是否有效? 在上面共享的代码中,您好像将 GPIO61设置为 GPIO,然后将其设置回硬件 SPI CS-您需要将其保留为该代码的 GPIO。

    惠特尼

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

    我明天将为您回复的信号、但我不明白您的意思是"将 GPIO61设置为 GPIO、然后将其设置回硬件 SPI CS"哪一行将其设置回 GPIO? 一

    我使用原始代码、但它设置了 SPI-C、因此我需要更改为 SPI-A、并更改 GPIO122、123、124、125 -> GPIO58、59、60、61。

    我使用 GPIO58 (引脚14连接到 MISO)

    GPIO59 (引脚15连接到 MOSI)

    GPIO60 (引脚7连接到 CLK)

    GPIO61 (引脚19连接到 CS)

    所有 GPIO 将复用位置设置为15

    enc.e2e.ti.com/.../sprs880m.pdfe2e.ti.com/.../sprui77c.pdf 上的参考

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

    这是我的信号 CH1 MOSI、CH2 CLK、但在 MISO 无响应

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

    这是我的 SD 卡能否用于此项目?  

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

    SD 卡代码使用软件控制的芯片选择、而不是硬件选择、因此 GPIO61需要配置为 GPIO、而不是 SPI CS 引脚。 这意味着 GPIO61的 GPBGMUX2和 GPBMUX2寄存器应配置为0。 此外、请确保您已更新选择和取消选择功能以使用 GPIO61。

    惠特尼

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

    好的。 今天我回到 BASIC。我有 F2837x controlCARD、然后设置默认配置(SPI-C 和使用 GPIO 122-125)。 "我可以写入文件"、但当我使用相同的代码并使用 F2837x LaunchXL (PIN 18、17、13、12 [SPI-C])连接 SD 卡模块时。 FR_RESULT = FR_NOT 准备就绪。 这是我的代码更新。

    1.main()

    int main (void)
    {
    uint16 sdata;//发送数据
    uint16 RDATA;//接收的数据
    INT nStatus;
    fil 文件;
    FRESULT 结果;
    字符缓冲器[10];
    int i;
    字节 diskResult;
    
    
    //
    //将时钟设置为以50MHz 的频率从 PLL 运行
    //
    SysCtlClockSet (SYSCTL_OSCSRC_OSC2 | SYSCTL_PLL_ENABLE | SYSCTL_IMULT (10)|
    SYSCTL_SYSDIV (2));
    SysCtlAuxClockSet (SYSCTL_OSCSRC_OSC2 | SYSCTL_PLL_ENABLE |
    SYSCTL_IMULT (12)| SYSCTL_SYSDIV (2)); //60MHz
    
    #ifdef _flash
    //
    将时间关键代码和闪存设置代码复制到 RAM
    //其中包括以下函数:InitFlash();
    // RamfuncsLoadStart、RamfuncsLoadSize 和 RamfuncsRunStart
    //符号由链接器创建。 请参阅器件.cmd 文件。
    //
    memcpy (&RamfuncsRunStart、&RamfuncsLoadStart、(size_t)&RamfuncsLoadSize);
    
    //
    //调用闪存初始化以设置闪存等待状态
    //此函数必须驻留在 RAM
    中//
    InitFlash();
    #endif
    
    //
    //初始化中断控制器和矢量表
    //
    InitPieCtrl();
    InitPieVectTable();
    
    //
    //将系统节拍设置为每秒触发100次。
    //
    SysTickInit();
    SysTickPeriodSet (SysCtlClockGet (system_clock_speed)/ 100);
    SysTickIntRegister (SysTickHandler);
    SysTickIntEnable();
    SysTickEnable();
    
    //
    //启用中断
    //
    IntMasterEnable();
    
    //// ////////////////// -------------- 初始版本2 -------- ////////////////////////////////
    // //
    // //步骤1. 初始化系统控制:
    // // PLL、安全装置、启用外设时钟
    // //此示例函数位于 F2837xD_SYSCTRL.c 文件中。
    // //
    // InitSysCtrl();
    //
    // //
    // //步骤3. 清除所有中断:
    // //
    // Dint;
    //
    // //
    // //将 PIE 控制寄存器初始化为默认状态。
    // //默认状态为禁用所有 PIE _interrupts 和标志
    // //被清除。
    // //此函数位于 F2837xD_PIECTRL.c 文件中。
    // //
    // InitPieCtrl();
    //
    // //
    // //禁用 CPU __interrupts 并清除所有 CPU __interrupt 标志:
    // //
    // IER = 0x0000;
    // IFR = 0x0000;
    //
    // //
    // //使用指向 shell 中断的指针初始化 PIE 矢量表
    // //服务例程(ISR)。
    // //这将填充整个表,即使是_interrupt
    // //在本例中未使用。 这对于调试很有用。
    // //可以在 F2837xD_DefaultIsr.c 中找到 shell ISR 例程
    // //此函数可在 F2837xD_PieVect.c 中找到
    // //
    // InitPieVectTable();
    
    
    
    fresult = f_mount (0、&g_sFatfs);
    
    {
    fresult = f_open (&file、"0:/Test4.txt"、fa_create_new);
    f_close (&file);
    fresult = f_open (&file、"0:/Test4.txt"、fa_write);
    if (fresult!= FR_OK)
    {
    返回(1);
    }
    buff [0]='1';
    buff [1]='2';
    buff [2]='3';
    buff [3]='4';
    buff [4]='5';
    buff [5]='6';
    buff [6]='7';
    buff [7]='8';
    buff [8]='9';
    buff [9]='0';
    fresult = f_write (&file、buff、10、(UINT *)_nStatus);
    
    if (fresult!= FR_OK)
    {
    //return (1);
    }
    // fresult = f_sync (&file);
    
    f_sync (&file);
    f_close (&file);
    }
    

    2.power_on();

    静态
    空 POWER_ON (空)//编辑
    {
    //
    *这并不是真正打开电源、而是初始化
    与 SD 卡通信所需的 SPI 端口和引脚。
    *
    EALLOW;
    /*启用用于在 SPI 上驱动 SDC 的外设*/
    CpuSysRegs.PCLKCR8.bit.SPI_C = 1;
    
    /*
    *将相应的引脚配置为 SPI 而不是 GPIO。 CS
    *信号被直接驱动、以确保我们可以通过将其保持在低电平
    *完成与 SD 卡的交易。
    *
    
    
    //解锁 SD 卡 SPI GPIO
    GpioCtrlRegs.GPDLOCK.bit.GPIO122 = 0;
    GpioCtrlRegs.GPDLOCK.bit.GPIO123 = 0;
    GpioCtrlRegs.GPDLOCK.bit.GPIO124 = 0;
    GpioCtrlRegs.GPDLOCK.bit.GPIO125 = 0;
    
    //设置 MUX 和 DIR
    GpioCtrlRegs.GPDMUX2.bit.GPIO125 = 0;//保留为 GPIO 以进行手动 CS 控制
    
    GpioCtrlRegs.GPDGMUX2.bit.GPIO122 = 1;
    GpioCtrlRegs.GPDGMUX2.bit.GPIO123 = 1;
    GpioCtrlRegs.GPDGMUX2.bit.GPIO124 = 1;
    
    GpioCtrlRegs.GPDMUX2.bit.GPIO122 = 2;
    GpioCtrlRegs.GPDMUX2.bit.GPIO123 = 2;
    GpioCtrlRegs.GPDMUX2.bit.GPIO124 = 2;
    
    GpioCtrlRegs.GPDDIR.bit.GPIO125 = 1;
    
    
    
    //设置 GPIO 上拉禁用/启用
    GpioCtrlRegs.GPDPUD.bit.GPIO122 = 0;//通常需要被拉高
    GpioCtrlRegs.GPDPUD.bit.GPIO123 = 0;//通常需要被拉高
    GpioCtrlRegs.GPDPUD.bit.GPIO124 = 1;
    GpioCtrlRegs.GPDPUD.bit.GPIO125 = 1;
    
    //在异步模式下设置 GPIO
    GpioCtrlRegs.GPDQSEL2.bit.GPIO122 = 3;//异步输入
    GpioCtrlRegs.GPDQSEL2.bit.GPIO123 = 3;
    GpioCtrlRegs.GPDQSEL2.bit.GPIO124 = 3;
    GpioCtrlRegs.GPDQSEL2.bit.GPIO125 = 3;
    
    //为 CPU1配置 GPIO
    GpioCtrlRegs.GPDCSEL4.bit.GPIO122 = 0;
    GpioCtrlRegs.GPDCSEL4.bit.GPIO123 = 0;
    GpioCtrlRegs.GPDCSEL4.bit.GPIO124 = 0;
    GpioCtrlRegs.GPDCSEL4.bit.GPIO125 = 0;
    
    //锁定 SD 卡 SPI GPIO
    GpioCtrlRegs.GPDLOCK.bit.GPIO122 = 1;
    GpioCtrlRegs.GPDLOCK.bit.GPIO123 = 1;
    GpioCtrlRegs.GPDLOCK.bit.GPIO124 = 1;
    GpioCtrlRegs.GPDLOCK.bit.GPIO125 = 1;
    EDIS;
    
    
    /*取消***芯片为 SD 卡和串行闪存选择的置位*/
    取消选择();
    
    /*配置 SPI C 端口*/
    SpicRegs.SPICCR.bit.SPISWRESET = 0; //将复位位位设置为低电平
    SpicRegs.SPICTL.bit.CLK_PHASE = 0;
    SpicRegs.SPICCR.bit.CLKPOLARITY = 1;
    SpicRegs.SPICTL.bit.MASTER_SLAVE = 1; //主控模式
    SpicRegs.SPIBRR.ALL = 63; //将值更新为正确设置以实现正确的比特率(电流:~500kHz)
    SpicRegs.SPICCR.bit.SPICHAR = 0x7; //将字符长度设置为8位
    SpicRegs.SPICTL.bit.TALK = 1;
    SpicRegs.SPICCR.bit.SPISWRESET = 1; //从复位中释放 SPI
    SpicRegs.SPIPRI.bit.FREE = 1;
    SpicRegs.SPIPRI.bit.Soft = 1;
    
    /*将 DI 和 CS 设置为高电平并向卡的 SCLK 施加超过74个脉冲*/
    /*才能接受本机命令。 *
    //send_inition_clock_train ();
    
    //DELAY_US (50);
    
    PowerFlag = 1;
    } 

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

    那么、controlCARD 代码起作用了吗? 请注意、您的 SD 卡可以正常工作并与此代码兼容。 您是否确定在项目的 LaunchPad 版本中芯片选择是否正常工作?

    惠特尼

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

    我不确定、但我从中进行选择。

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

    抱歉、我是指 SPI 协议芯片选择(CS)引脚- GPIO61。 如果您看一下示波器、它是否看起来正常工作?

    惠特尼

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

    尊敬的惠特尼

    现在我正在处理另一个项目、但我认为是一个 Caused but SD 模块(https://e2e.ti.com/support/microcontrollers/c2000/f/171/t/708133?TMS320F2812-SD-card-Interface)。 我将订购新模块、稍后再试。如果该模块工作正常、我将在此处更新。