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.

[参考译文] TMS320F28379D:下载到 RAM 和闪存时、SPI 的工作方式不同

Guru**** 2387080 points
Other Parts Discussed in Thread: LAUNCHXL-F28379D, DAC81408, TMS320F28379D, C2000WARE
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1037741/tms320f28379d-spi-works-differently-when-downloading-to-ram-and-to-flash

器件型号:TMS320F28379D
主题中讨论的其他器件:LAUNCHXL-F28379DDAC81408C2000WARE

您好!

我尝试使用 LAUNCHXL-F28379D 的 SPI 模块与 DAC81408进行通信。  由于 DAC81408需要24位的输入数据、我 将 SPI 模块的输出配置为8位、并计划持续输出三组数据来控制 DAC81408。 当我将代码下载到 TMS320F28379D 的 RAM 时、系统工作正常。 但是、如果我 将代码下载到闪存、系统将失败。 我发现问题是、当我将代码下载到闪存时、SPI 模块无法连续输出。

以下是我的 SPI 初始化代码。

    // GPIO59 是  SPIA SOMI。
    GPIO_setMasterCore (59、 GPIO_CORE_CPU1);
    GPIO_setPinConfig (GPIO_59_SPISOMIA);
    GPIO_setPadConfig (59、 GPIO_PIN_TYPE_PULLUP);
    GPIO_setQualificationMode (59、 GPIO_QUAL_ASYNCx);
    // GPIO58 是  SPIA SIMO。
    GPIO_setMasterCore (58、 GPIO_CORE_CPU1);
    GPIO_setPinConfig (GPIO_58_SPISIMOA);
    GPIO_setPadConfig (58、 GPIO_PIN_TYPE_PULLUP);
    GPIO_setQualificationMode (58、 GPIO_QUAL_异 步);
    // GPIO61 是  SPIA STE。  \CS
    GPIO_setMasterCore (61、 GPIO_CORE_CPU1);
    GPIO_setPinConfig (GPIO_61_SPISTEA);
    GPIO_setPadConfig (61、 GPIO_PIN_TYPE_PULLUP);
    GPIO_setQualificationMode (61、 GPIO_QUAL_ASYNCO);
    // GPIO60 是  SPIA CLK。
    GPIO_setMasterCore (60、 GPIO_CORE_CPU1);
    GPIO_setPinConfig (GPIO_60_SPICLKA);
    GPIO_setPadConfig (60、 GPIO_PIN_TYPE_PULLUP);
    GPIO_setQualificationMode (60、 GPIO_QUAL_异 步);
    // 必须 在     配置 SPI 之前将其复位  
    SPI_disableModule (SPIA_BASE);

    // SPI 配置。  使用  25MHz SPICLK 和 8位 字 大小。  无   延迟的上升沿
    SPI_setConfig (SPIA_BASE、 DEVICE_LSPCLK_FREQ、 SPI_PROT_POL0PHA0、 SPI_MODE_MASTER、 25000000、  8);
    SPI_enableHighSpeedMode (SPIA_BASE);
    SPI_disableLoopback (SPIA_BASE);
    SPI_setEmulationMode (SPIA_BASE、 SPI_emulation_free_run);
    SPI_disableFIFO (SPIA_BASE);

    // 中断 配置
    SPI_clearInterruptStatus (SPIA_BASE、 SPI_INT_RXFF);
    SPI_clearInterruptStatus (SPIA_BASE、 SPI_INT_RX_overrun);

    // 配置 完成。  启用  模块。
    SPI_enableModule (SPIA_BASE);

然后、为了进行测试、在主循环中执行以下代码以输出三组8位 SPI 数据。

    SPI_writeDataNonBlocking (SPIA_BASE、 0xAA00);
    SPI_writeDataNonBlocking (SPIA_BASE、 0xAA00);
    SPI_writeDataNonBlocking (SPIA_BASE、 0xAA00);
    DEVICE_DELAY_US (50L);
 

现在、如果我将代码下载到 RAM 中、可以持续输出24位0xAAAAAA、如下图所示。


然后、如果我将代码下载到闪存、 输出仅为三组8 位、 如 下图所示。

因此、我是否可以询问、如果我希望在将代码下载到闪存时持续输出 n 组8位 SPI 数据以形成一组8n 位数据、该怎么办?

非常感谢!

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

    黄 耀华、您好!

    如果您已将 STE 引脚配置为由 SPI 模块控制、则在每次传输后会将其拉高。 对于 RAM、由于取指令速度更快、因此下一个发送指令会在 STE 拉高之前发生。

    我建议您通过软件控制 STE 引脚。 您可以将该引脚配置 为通用输出引脚、而不是 SPI_STE 引脚、并使用 GPIO 数据寄存器将其拉高或拉低。 您可以参考 C2000ware 中提供的 SPI EEPROM 示例。

    此致、

    Veena

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

    您好、Veena、

    感谢您的回复。 我将使用 GPIO 来控制\CS 引脚以实现稳定性。

    此外、我还想问一些有关 C2000 MCU 中代码执行的问题吗?

    如果我在构建配置中选择 CPU1_FLASH、 则会预定义_FLASH。 然后、在 device.c 中、将激活以下代码。 这些代码是否意味着项目最终将从闪存复制到 RAM 以执行? 如果是、我的项目似乎最终将在 RAM 上运行、那么、为什么 SPI 结果会有所不同?

    再次感谢你。

    此致、

    Jony

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

    尊敬的 Jony:

    应用程序中有一些标记为 ramfuncs 的函数。 只有这些文件才会从 RAM 复制到闪存。

    例如:  

    在闪存驱动程序中、我们有以下指令将 Flash_initModule 保留在 .TI.ramfunc 段下

    #pragma CODE_SECTION (Flash_initModule、".TI.ramfunc");

    您可以根据需要使用此 pragma 将其他函数移至.TI.ramfunc 段/

    在 cmd 文件中、我们告诉链接器将代码加载到闪存中并从 RAM 运行。 所有其他函数、它们是.text 段的一部分、将驻留在闪存中并从闪存运行。

       .TI.ramfunc      : load = flash_BANK0_SEC1,
                          运行 = RAMLS4
                          Load_start (RamfuncsLoadStart)、
                          load_size (RamfuncsLoadSize)、
                          Load_End (RamfuncsLoadEnd)、
                          RUN_START (RamfuncsRunStart)、
                          run_size (RamfuncsRunSize)、
                          RUN_END (RamfuncsRunEnd)、
                          PAGE = 0、 ALIGN (4)
    此致、
    Veena
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Veena、

    感谢你的帮助。 我现在明白了。

    此致、

    Jony