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.

[参考译文] TM4C123GH6PGE:SD 卡写入问题

Guru**** 2473260 points


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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/680803/tm4c123gh6pge-sd-card-writing-issue

器件型号:TM4C123GH6PGE

大家好、

             感谢大家在我之前的问题中向我提出建议。

          现在、我要使用 SPI 通信将数据写入 SD 卡。以下代码对数据的写入非常完美、我将使用5个并行中断和 SD 卡数据在 while 循环中连续写入。 在这里、我遇到的问题是、当数据写入 SD 卡时、我的其他中断将在几毫秒后停止、并且它将立即开始。  在这里、我想要的是、当数据写入 SD 卡时、我不想干扰我的其他中断。 我附上以下代码。

//********* SDCARD


iFResult = f_mount (0、&g_sFatfs);

if (iFResult!= FR_OK)


退货(1);


iFResult = f_open (&g_sFileObject、filename、fa_write|fa_open_always| fa_read);

iFResult=f_lseek (&g_sFileObject、f_size (&g_sFileObject));


操作

iFResult = f_write (&g_sFileObject、buf2、sizeof (buf2)-1、& ui32BytesWrite);
iFResult = f_sync (&g_sFileObject);
}while (ui32BytesWrite!= sizeof (buf2)-1);

iFResult = f_write (&g_sFileObject、new_line、sizeof (new_line)-1、& ui32BytesWrite);
iFResult = f_sync (&g_sFileObject);
iFResult = f_write (&g_sFileObject、new_line、sizeof (new_line)-1、& ui32BytesWrite);
iFResult = f_sync (&g_sFileObject);
操作

iFResult = f_write (&g_sFileObject、buf1、sizeof (buf1)-1、& ui32BytesWrite);
iFResult = f_sync (&g_sFileObject);
}while (ui32BytesWrite!= sizeof (buf1)-1);

iFResult = f_write (&g_sFileObject、new_line、sizeof (new_line)-1、& ui32BytesWrite);
iFResult = f_sync (&g_sFileObject);


while (1)

strcat (buf_Rz、buffer2);

iFResult = f_sync (&g_sFileObject);


iFResult = f_write (&g_sFileObject、new_line、sizeof (new_line)-1、& ui32BytesWrite);


iFResult = f_sync (&g_sFileObject);


for (g=0;g<=2;g++)

for (h=1;h<=500;h++)

SysCtlDelay (16000);

iFResult = f_write (&g_sFileObject、buf_Rz、sizeof (buf_Rz)- 1、& ui32BytesWrite);

iFResult = f_sync (&g_sFileObject);

在调试我的代码后、我发现了这个   

iFResult = f_sync (&g_sFileObject);       是给我的其他中断造成问题

请建议我如何解决此问题。

谢谢、

此致、

Srinu.V

 

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    F_SYNC 实际上会强制写入 SD 卡、这需要一些时间才能发生。 您在中断例程中调用上述代码吗?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    海先生,

    我正在 while (1)中使用上述代码以继续执行。

    谢谢、
    此致、
    Srinu.V.
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您使用的是哪个端口? 是否来自 MMC-dk-tm4c123g.c?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    海先生,
    我使用的是端口 A 中的 SSI0、我使用的是 MMC-dk-tm4c123g.c

    谢谢、
    此致、
    Srinu.V.
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    该文件使用 ROM_SSIDataPut ()和 ROM_SSIDataGet ()。 ROM_SSIDataGet ()将等待 SSI 传输完成,但不会阻止中断。 您是如何确定 f_sync 是问题的?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    感谢主席先生提出的宝贵建议、

    我不确定 f_sync 仅会造成问题。 在我的代码中、我将观察 CCS 调试器中的输出结果以及示波器。 当编译器开始执行时、当编译器执行 iFResult = f_sync (&g_sFileObject)指令时、我的 PWM 会在毫微秒至毫秒之间停止工作、并且在该指令执行完成后、我的 PWM 再次进入正常的先前状态、我正在使用 PWM 中断来生成 PWM 信号。
    请建议我的代码中有任何错误。

    我的主时钟是

    SysCtlClockSet (SYSCTL_SYSDIV_4 | SYSCTL_USE_PLL | SYSCTL_OSC_MAIN| SYSCTL_XTAL_16MHz);

    //为100Hz 中断配置 SysTick。 FatFs 驱动程序需要一个10ms 的周期。

    ROM_SysTickPeriodSet (SysCtlClockGet ()/100);
    ROM_SysTickEnable();
    ROM_SysTickIntEnable();


    无效
    SysTickHandler (空)

    //
    //调用 FatFs tick 计时器。
    //
    disk_timerproc();



    我将上述指令用于时钟信号、请向我建议时钟信号的任何不匹配、或向我建议所需的任何其他指令。

    我附加了调试器输出的图像、当 SD 卡开始写入 CPU 复位启用时( 几毫微秒到几毫秒时间)、我的 PWM 中断停止几毫微秒到毫秒、然后再次写入 CPU 复位禁用(毫秒内) PWM 状态将会正常。此过程将持续进行。

    我请求您建议我如何避免此问题。

    谢谢、

    此致、

    Srinu.V

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我很困惑。 您圈出了用于发出 CPU 复位的图标、并将其标记为"启用"。 您的系统是否定期复位? 这将解释 PWM 将被中断的原因。 如果您在"ResetISR"函数的开头放置一个断点、您可以看到您的代码是否正在复位。 然后、您可以查看系统控制 RESC (复位原因)寄存器以确定复位源。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    是的、先生、

    在我的代码 CPU 复位中、periodically.in 中发生了这种情况、我认为我的所有中断都只是暂停、并且将再次启动。
    它在 start_up.ccs 中停止复位 ISR。

    我请求您向我建议如何解决此问题。

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

    是否启用了看门狗? SYSCTL_RESC 寄存器中的值是多少(系统控制复位原因)?

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

    海先生,

          感谢您的宝贵建议。

    我附加 了 SYSCTL_RESC 寄存器的快照。 请您找到附件。

    当复位发生时、我的编译器转到 startup_ccs.c 中的以下函数

    无效

    ResetISR (空)

      //

      //跳转到 CCS C 初始化例程。  这将启用

      //浮点单元,因此不需要在此处执行此操作。

      //

      _asm ("  .global _c_int00\n"

         "  b.w  _c_int00");

    我请求您向我建议如何解决此问题。

    谢谢、

    此致、

    Srinu.V.