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.

[参考译文] TMS570LC4357:EMIF 地址访问问题

Guru**** 2448160 points
Other Parts Discussed in Thread: HALCOGEN

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1236900/tms570lc4357-emif-address-access-problem

器件型号:TMS570LC4357
主题中讨论的其他器件:HALCOGEN

我使用的是使用 EMIF ASYNC1的外部异步 NOR 闪存(MT28EW 1Gb)。 我有一个测试脚本、该脚本尝试向每个地址写入一种模式、并读回该模式以进行比较。 可以成功写入分配的 22位地址空间中的所有地址和从这些地址读取地址。 我希望使用 GIO 访问存储器的较高区域、以使其余地址行生效。 从较高的地址空间读取时、我看到了奇怪的行为。 我继续写入除大于0x7FFFFF 的任何地址以外的所有地址、其中 A1 (EMIF_ADDR0)应为高电平、读回0xFFFF (未写入)但无法进行比较。 该上部区域中的所有其他地址都正确回读。

此部件的 Micron 设备驱动程序在写入这些问题地址时不会产生任何故障、尽管我不完全相信这一点。  这是我们的闪存器件原理图。 我无法探测总线。

我的读写逻辑如下:  
#define MASK_ADDR (addr)  (addr 和0x7FFFFF)

#define check_a23 (addr)  (addr &(1 <<23))  
#define check_a24 (addr)  (addr &(1 << 24))  
#define check_a25 (addr)  (addr &(1 <<25))  
uint16_t FlashRad_AddrSpace ( uint32_t udAddrOff )
{
  if ( check_a23 (udAddrOff ))
    SET_EMIF_ADDR (EMIF_A23);
  if ( check_a24(udAddrOff ))
    SET_EMIF_ADDR (EMIF_A24);
  if ( check_a25(udAddrOff ))
    SET_EMIF_ADDR (EMIF_A25);
  uint16_t ucVal = base_ADDR[MASK_ADDR (udAddrOff)];

  CLEAR_EMIF_ADDR (EMIF_A23);
  CLEAR_EMIF_ADDR (EMIF_A24);
  CLEAR_EMIF_ADDR (EMIF_A25);

  返回 ucVal;
}/* EndFunction FlashRead */
void FlashWrite_AddrSpace (uint32_t udAddrOff、uint16_t ucVal)
{
  if ( check_a23 (udAddrOff ))
    SET_EMIF_ADDR (EMIF_A23);
  if ( check_a24(udAddrOff ))
    SET_EMIF_ADDR (EMIF_A24);
  if ( check_a25(udAddrOff ))
    SET_EMIF_ADDR (EMIF_A25);

  /*将 ucVal 写入闪存中的字偏移量*/
  Base_ADDR[MASK_ADDR (udAddrOff)]= ucVal;

  CLEAR_EMIF_ADDR (EMIF_A23);
  CLEAR_EMIF_ADDR (EMIF_A24);
  CLEAR_EMIF_ADDR (EMIF_A25);
将 GIO 用于额外地址引脚的逻辑中是否正确? 屏蔽地址以清除位[31-23]并使用 GIO 手动设置这些位、其行为应该与从较低地址正确读取时的行为相同? 我不理解 A1在这种情况下的行为。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    TRM 指出,可以使用 BA[0]作为高位地址(A[22])。 这是不正确的。 该器件专为功能安全应用而设计、为每个 CSx 仅实现了16MB (A[21:0])。 访问超出此范围的存储器位置将产生异常中断。  

    因此 GPIO 或 BA[0]不能用作 A[22]。  

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

    QJ:  

    我的第一个问题是关于 TRM 这一部分的具体问题:21.2.6.2。 从随附的原理图中、我的信号  EMIF_MSB_A23、EMIF_MSB_A24 和  EMIF_MSB_A25 被映射到 GIOA[4:6]。 我已在 HALCoGen 中取消选中了 BA[0]的 Pinmux。  

    我针对 SET_EMIF_ADDR 和  CLEAR_EMIF_ADDR 的宏手动切换 GIO 引脚相应的。 这些引脚在访问前设置、在访问后清除。 我旨在通过在访问存储器位置之前屏蔽地址来避免中止。 对于大于16MB 空间的任何地址、此方法会成功执行、但 EMIF_ADDR0 = 1的地址除外。 附加的是 XLSX、我在其中打印了前512次访问写入和回读失败的地址。

    (问题1)我的初始假设是、对于我的应用、BA[1]用作 A0、EMIF_ADDR21用作 A22、我是否正确? (问题2)存储器位置0x800800000是我应应用此使用 GIO 的方法来扩展覆盖范围的第一个地址。   

    虽然我已经引用了这个主题、但我知道它与 TMS570LS 相关、  

    TMS570LS3137:EMIF:使用 GPIO 增加地址线以访问大型存储器-基于 Arm 的微控制器论坛-基于 Arm 的微控制器- TI E2E 支持论坛

    e2e.ti.com/.../A1-Issue.xlsx

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    (问题1)在我最初的假设中,对于我的应用程序,BA[1]作为 A0而 EMIF_ADDR21作为 A22是正确的吗?

    是的、正确。

    [报价 userid="554359" url="~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1236900/tms570lc4357-emif-address-access-problem/4675479 #4675479"](问题2)内存位置0x800000是我应该应用这种方法使用 GIO 扩大覆盖范围的第一个地址。   [/报价]

    CS2的第一个内存位置是0x60000000。

    地址应为0x6100_0006

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

    感谢您的答复。 为确保我了解地址选择0x6100_0006。 为什么额外的偏移量为0x6?

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

    您的存储器为16位宽、因此 EMIF_BA[1]或 Memory_A[0]是半字(16位)地址。  

    物理地址引脚: ... EMIF_A[1]  EMIF_A[0] EMIF_BA[1]    

    逻辑存储器地址:   B1000       b0100       b0010

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

    我现在意识到、我通过显示16位闪存地址来错误表示原始 XLSX 文件。 这在我的代码中用作从0x6000_0000开始的 uint16_t ptr 的偏移量。 我已更正我的文件并重新附加。 通过重新分析 MCU 地址访问、我现在看到、当 A2被置位时、写入回读故障总是会发生。 为什么会这样呢? 所有其它地址访问(16位对齐)正确回读。  e2e.ti.com/.../5621.A1-Issue_5F00_v2.xlsx

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

    不要回答您的问题。 为什么 A2会影响回读值? 写入和读取操作使用相同的地址、因此回读数据应为写入数据。

    对于 NOR 闪存、CMD 应首先写入/读取、然后是数据。 CMD 编程是否正确?

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

    请参阅我的 NOR 示例:

    https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1213601/tms570lc4357-example-code-for-emif-to-interface-nor-flash?tisearch=e2e-sitesearch&keymatch=NOR%2520AND%2520EMIF#