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.
工具/软件: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; }
大家好、 我们已经为熟悉此领域的 C2000工程师之一分配了此任务。 他们在周二之前都不在办公室、因此您应该会听到他们的声音。
我们没有现成的示例、但我发现一些相关帖子可能会有所帮助。
此致
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 上的参考
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)。 我将订购新模块、稍后再试。如果该模块工作正常、我将在此处更新。