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.

[参考译文] TMS320F28335:在921k 波特下进行 SCI 到 RS485传输、具有闪存流水线问题

Guru**** 2589280 points
Other Parts Discussed in Thread: SYSBIOS

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1284446/tms320f28335-sci-to-rs485-transmission-at-921k-baud-with-flash-pipelining-issue

器件型号:TMS320F28335
Thread 中讨论的其他器件:SYSBIOS

我将一个 RS -485收发器连接到 SCI-B TX/RX 引脚、并以921600的波特率配置。

SYSCLKOUT 被配置为60MHz (20Mhz OSC、PLLCR[DIV]= 6、PLLSTS[DIVSEL]= 2)。

LSPCLK 被配置为15Mhz (LOSPCP [LSPCLK]= 2、SYSCLK / 4)。

闪存流水线已使用以下函数进行配置、并在 main 之前调用。 我还确保它从 RAM 运行。

void init_flash (void)
{
  EALLOW
    
  //启用闪存管道模式以提高性能
  //从闪存执行的代码。
  FlashRegs.FOPT.bit.ENPIPE = 1

  //         注意事项
  //闪存操作所需的最小等待状态
  //在给定的 CPU 速率下,必须由 TI 进行表征。
  //请参考数据表以了解最新信息。

  // 150 MHz 使用5个(+1)个 SYSCLK 周期,100个使用3个(+1)个 SYSCLK 周期
  //这意味着我们每个25MHz 需要1个 SYSCLK 的等待状态

  //设置闪存的分页等待状态
  FlashRegs.FBANKWAIT.bit.PAGEWAIT = 2

  //设置闪存的随机等待状态
  FlashRegs.FBANKWAIT.bit.RANDWAIT = 2

  // 150 MHz 使用8个(+1)个 SYSCLK 周期,100个使用5个(+1)个 SYSCLK 周期
  //这意味着我们每个16.667MHz 需要1个 SYSCLK 的等待状态

  //设置 OTP 的等待状态
  FlashRegs.FOTPWAIT.bit.OTPWAIT = 4
  //         注意事项
  //只应使用这2个寄存器的默认值
  FlashRegs.FSTDBYWAIT.bit.STDBYWAIT = 0x01FF
  FlashRegs.FACTIVEWAIT.bit.ACTIVEWAIT = 0x01FF
    
  EDIS

  //强制管道冲洗以确保写入
  //配置的最后一个寄存器在返回之前发生。

  ASM (" RPT #7 || NOP");

启用闪存流水线后、流量中会出现差距、如下面的示波器图所示:

这两个间隙宽度约为60us/16.67Mhz、并出现两次。 使用示波器光标测量的宽度似乎反映了 SYSCLK 在60MHz/16.67速率下的配置方式、但我不确定这些参数是如何影响闪存流水线的、或者这是否是红色错误。

当闪存流水线被禁用时、我不会遇到字节之间的这些间隙、并且通信量是正常的。

保存要发送的每个字节的缓冲器被 分配到一个通过 XINTF 引脚连接的外部 RAM 芯片。

是否有关于此闪存流水线可能导致此问题的任何想法?

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

    进一步说明:目标波特率为921600、但实际上是937500、因为 SCI-B 波特率寄存器关心配置的 BRR 值为  1.

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

    您好、Jack、

    我联系了闪存专家、在这方面、60us 之间的周期明显长于 SCI 中10位空闲线多处理器模式的空闲周期、因此这是闪存延迟传输的情况。

    很抱歉耽误了时间。

    此致、

    文斯

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

    嗨、Vince、  

    感谢您的回复。 对于如何调试闪存延迟传输、以缩小可能导致此问题的闪存数据的范围、您有什么提示或建议吗?

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

    您好、Jack:

    Unknown 说:
    关于此闪存流水线如何导致这个问题的任何想法?

    我不确定您的代码是什么样的、但如果您有循环或分支、这会导致闪存流水线刷新、从而导致额外的周期。 这可能是你看到的,虽然我不能保证。

    您的代码需要从闪存运行吗? 您是否可以使用 memcpy 将其编程到闪存、然后在 RAM 上运行?

    此致、

    阿米尔·奥马尔

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

    如果 ISR 代码已经从 RAM 运行、是否可能仍会有分支或循环导致闪存流水线清空? 我在 TX ISR 中使用循环来保持 FIFO 已满、并设置 TXFFIL sci 寄存器、以便在 FIFO 有空间存储另一个字节时触发中断。

    我已确保它使用的全局变量存储在外部 RAM 中。 我使用以下命令初始化 HWI:  

    Hwi_create (...);在 c 语言代码中更早。
    将 Hwi 初始化代码移至 app.cfg 文件会有什么好处吗? 另外、如果我在 Hwi_Params 中使用 arg 参数、这是否会在 SYSBIOS 中导致闪存具有任何功能?  
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    如果 ISR 代码已从 RAM 运行,分支或循环可能仍会导致闪存管道清空?

    CPU 可能会发生这种情况、我不确定。 如果问题似乎侧重于从 RAM 执行程序指令、那么我会将此问题转交给相应的专家。

    将 Hwi 初始化移到 app.cfg 文件是否有任何好处? 另外、如果我在 Hwi_Params 中使用 arg 参数、这是否会在 SYSBIOS 中导致闪存具有任何功能?  [/报价]

    这更像是一个 SYS BIOS 问题、但在我向该专家讲述之前  、您是否介意告诉我您的任何代码是否从闪存运行、 还是在程序开始时所有代码都加载到 RAM 中、并只是为了 POR 而保留在闪存中?

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

    代码库中的某些代码确实会从闪存运行、通常是低优先级代码、但我们在程序开始时将 HWI ISR 加载到 RAM 中、例如 SCI TX ISR。 最终启动 SCI 端口传输的应用代码从闪存运行、 但一旦请求了 SCI 传输、SCI 驱动程序就会设置 SCI TX ISR、以处理从存储在外部 RAM 中的 FW 缓冲器到 SCI 寄存器之间在它们发送和接收时的转换。

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

    您可能需要在事务的整个期间验证程序是否从 RAM 运行。 如果它在任何时刻跳转到执行/读取闪存中的内容、那么如果 SCI 外设出于某种原因等待代码(但我认为 传输应独立于代码执行)、则可能会有延迟。