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.

[参考译文] AM623:AM62x OSPI (Cadence IP)-间接写入&amp 的模式字节;禁用自定义 FPGA 协议的页边界重新寻址

Guru**** 2864540 points

Other Parts Discussed in Thread: AM623

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1630567/am623-am62x-ospi-cadence-ip-mode-byte-for-indirect-write-disabling-page-boundary-re-addressing-for-custom-fpga-protocol

器件型号: AM623

TI E2E 社区:您好、

我们使用 AM623 (Verdin AM62 SoM) 上的 OSPI 控制器、通过四通道 SPI 接口(非 NOR 闪存用例)与定制 FPGA 进行通信。 我们实施了裸机 Linux 内核驱动程序、可绕过spi-cadence-quadspi框架直接对 Cadence QSPI 寄存器进行编程。

关于控制器行为、我们有两个问题。


系统设置程序

  • 平台: AM623、Linux 6.12、Verdin AM62 SoM
  • SPI 模式: 四通道 (4-4-4)、SDR、模式 0 (CPOL=0、CPHA=0)
  • 时钟: ref_clk = 167MHz、baud_div = 3→~导线上的 21MHz (SPI 时钟:ref_clk /(2*(div+1)))
  • PHY: 已禁用(SDR 必需)
  • DAC: 禁用
  • 传输模式:
    • STIG(≤8 字节)
    • 间接(PIO,基于轮询)

FPGA SPI 协议

FPGA 需要以下帧格式:

  • 写入:
    CMD (1B) + ADDR (3B) + COUNT (1B) + DATA (N bytes) + DUMMY (1B)
  • 读取:
    CMD (1B) + ADDR (3B) + COUNT (1B) + DUMMY (10 clocks) + DATA (N bytes)

其他详细信息:

  • CMD 字节在低位中对操作码(读取= 0x00、写入= 0x80)和字宽 (1/2/4) 进行编码
  • ADDR 为 3 个字节(从器件 ID +寄存器地址)
  • count 是 1 个字节、表示字数 (data_bytes / word_width)
  • 所有相位在四通道模式(4 位)下传输

由于 Cadence OSPI 控制器本身不支持 计数字段 、我们目前使用 4 字节地址模式将计数字节打包成第 4 个地址字节。 此方法有效:FPGA 会将最后一个地址字节正确解释为计数。 STIG 模式使用自己的地址配置(寄存器)CMDCTRL、因此两种模式可以共存。


问题 1:支持写入的模式字节

我们希望通过发送 count 字节 模式字节阶段 而不是将其嵌入地址字段中。

Cadence IP 提供:

  • MODE_BIT_CONFIG_REG (0x28)→μMODE_FLD [7:0] s(模式字节值)
  • DEV_INSTR_RD_CONFIG_REG (0x04)→位 20 (MODE_BIT_ENABLE)、用于读取操作

但是、我们无法MODE_BIT_ENABLE在中找到等效位:

  • DEV_INSTR_WR_CONFIG_REG (0x08)

问题:

  • 是否可以为启用模式字节传输 间接写入操作
  • 或者、模式字节特性是否严格限制为读取?
  • 如果是、是否有任何替代机制可在间接写入期间在地址阶段和数据阶段之间插入一个额外的字节?

问题 2:禁用页面边界 Re 寻址

由于计数会编码到最低地址字节中、因此控制器会解释大地址值。

我们配置了:

  • BYTES_PER_DEVICE_PAGE(inDEV_SIZE_CONFIG_REG (0x14))=0x800(2048 字节、最大有效功率为 2)

问题:
控制器会强制执行页边界逻辑、并在越过边界时拆分传输。 这会导致:

  1. CS 置为无效并重新发出命令
  2. 协议损坏、原因是:
    • 新地址不再包含有效的计数字段
    • FPGA 会将新命令解释为单独的事务

示例:

FPGA_addr = 0x150007
COUNT = 0xFF
Addr_encode = 0x150007FF

PAGE_OFFSET = 0x150007FF % 0x800 = 0x7FF (2047)
Bytes_to_boundary = 2048 - 2047 = 1 个字节
→1 个字节之后的分页符
 

问题:

  • 是否有办法可以完全禁用 OSPI 控制器中的页边界处理?
  • 以下任何方法是否有效?
    • 设置BYTES_PER_DEVICE_PAGE为 0 或0xFFF(不起作用)
    • 一个配置位、用于禁用页面边界上的自动 CS 切换
    • 的替代用法、DEV_SIZE_CONFIG适用于非闪存器件

我们观察到:

  • 0xFFF(非 2 的幂)会导致传输损坏
  • 0也会导致问题

希望就这两个专题提供任何指导。

谢谢您、
FIDE

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

    您好、Mehmet、

    感谢您的查询和设置详细信息的总结!  

    请允许我花一些时间在内部研究和讨论您的第一季度和第二季度的任何可能解决方案。   

    由于我可能还需要联系我们的硬件和 Linux OSPI 驱动程序专家、因此我的响应可能会有一些延迟。

    我希望我能在下周中旬回复您。

    谢谢

    此致

    Anastas Yordanov

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

    Mehmet

    我假设 baud_div=3 是一个拼写错误。 对于 42MHz OSPI0_CLK、它应该是 baud_div=4。 能否确认 baud_div=4?

    BR、

    Anastas  

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

    当您将 3 设置为 MSTR_BAUD_DIV_FLD 时、实际分频器将是 (3+1)* 2=8、因此最终的 SCLK 为 ~21MHz、这是我初始消息中的错误。 谢谢你。

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

    Mehmet

    感谢您的确认。

    BR、

    Anastas

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

    您好、Mehmet、  

    很抱歉、您要花一个月的时间回复您。

    我将添加额外的 AM62x OSPI 硬件和 Linux 软件专家来帮助审核问题。

    如果您在下周中旬之前没有收到任何回复、请 Ping 此主题。

    再次感谢您的理解和耐心!

    此致

    Anastas Yordanov