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.

[参考译文] SN74V263:SN74V263 写入/读取问题:FF 标志和读取周期时序

Guru**** 2644745 points

Other Parts Discussed in Thread: SN74V263

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

https://e2e.ti.com/support/logic-group/logic/f/logic-forum/1568312/sn74v263-sn74v263-write-read-issue-ff-flag-and-read-cycle-timing

器件型号: SN74V263

工具/软件:

您好、

我正在开发一个在标准模式下使用 SN74V263 FIFO、输入和输出总线宽度为 9 位的项目。 我的写入和读取操作以及状态标志存在问题。

我的系统使用外部 50MHz 振荡器来驱动 WCLK 引脚、该引脚会将数据写入 FIFO。 我的微控制器 (MCU) 是在 120MHz 上运行的 PIC (1 个机器周期= 60MHz)。


问题:

1.写入期间:
我已配置 HF 和 FF 标志的更改通知中断。 当 HF = 0 时、我会设置 WREN = 1、但 FF 标志也会变为低电平、表示写入没有停止。

我正在使用以下代码结构进行写入操作:

void enable_fifo_write(void)
{
    // Disable reading from FIFO
    FIFO_REN = 1;

    // Enable writing into FIFO
    FIFO_WREN = 0;

    // Perform Partial Reset
    FIFO_PRS = 0;
    fifo_usec_delay(1);
    FIFO_PRS = 1;

    // Clear interrupt flag

    // Enable change notification interrupt for FF, EF and HF flags

    // Enable CN interrupt globally

    // After the first write is performed,
    // EF goes high after two low-to-high transitions on RCLK
    FIFO_RCLK = 1;
    FIFO_RCLK = 0;

    FIFO_RCLK = 1;
    FIFO_RCLK = 0;
}

2.读取期间:
我尝试在 FIFO 已满 (FF = 0) 时执行读取操作、但标志状态不变、尤其是 FF 标志。

根据我的理解、当 FIFO 已满 (FF = 0) 时、单次读取操作将导致 FF 在 2 个 RCLK 转换后从低电平变为高电平。

我甚至尝试读取 FIFO 大小达到最大值、但没有观察到标志 (FF、HF 和 EF) 有任何变化。

我正在使用以下代码结构进行读取操作:

void read_data_from_fifo(void)
{
    uint16_t readcount = 8200;

    while(readcount-- > 0)
    {
        fifo_read_init();
        raw_data = fifo_read_start();
    }
}

void fifo_read_init(void)
{
    FIFO_REN = 0;
    __asm__ volatile("nop");
    
    FIFO_OE = 1;
    __asm__ volatile("nop");
    
    FIFO_RCLK = 0;
    __asm__ volatile("nop");
    
    // REN should be LOW when the RCLK goes from LOW->HIGH.
    FIFO_RCLK = 1;
    __asm__ volatile("nop");
}

void fifo_read_start(void)
{
    uint16_t read_data;
    
    // When RCLK is HIGH, OE should go from HIGH-> LOW before reading from the port.
    FIFO_OE = 0;
    
    // REN should go high while RCLK is HIGH
    FIFO_REN = 1;
    
    __asm__ volatile("nop");
    
    FIFO_RCLK = 0;
    __asm__ volatile("nop");
    
    // By this time tOLZ time has elapsed and data on Q0-Qn are valid.
    // Read 9-bit data from the FIFO's output port
    read_data = PORTD & 0x01FF;
    
    return read_data;
}


我的分析

  1. 在主复位期间、我已将器件正确配置为标准模式。
  2. 我担心、尽管我的 MCU 在 120MHz 下运行 (1 个机器周期= 60MHz)、但速度太慢无法跟上 50MHz 写入时钟、并且 FIFO 在我的软件可以做出反应之前已满。
  3. 我相信我的读取功能可能不符合 SN74V263 的时序要求。

您能否提出标准模式下单字或连续读取的正确信号序列建议、同时密切注意 REN、OE 和 RCLK 的时序要求?

感谢您的帮助。

此致、

Tanuj Kumar

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

    尊敬的 Tanuj:

    让我与我们的团队讨论这个问题、看看我们能否找到解决方案。

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

    您好、Albert、

    只是跟进这个问题。  您能否提供最新信息、或者让我知道是否需要我本人提供进一步的详细信息?

    此致、

    Tanuj Kumar

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

    尊敬的 Tanuj:

    对 延迟深表歉意。 E2E 收件箱中似乎已经丢失了数据。  

    下面是该器件使用情况的时序图。 您的信号更改是否有任何内置延迟、或者它们是否以尽可能快的速度背靠背发生?

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

    您好、Albert、

    这很好,但使这个 FIFO 成为我们的项目是非常重要的。

    我指的是图 8 和图 10。 但这并没有解决读取问题。

    我想在标准模式 (FWFT/SI = 0) 下从 FIFO 读取数据、我能够将数据写入 FIFO、并且相应的标志将根据硬件规范进行更新。

    下面是为 5 个读取周期捕获的代码片段:

    我认为、当 FIFO 已满 (FF = 0) 时、一次成功读取可能会导致 FF 变为高电平、但没有发生这种情况。

    此波形看起来与您建议的波形类似。

    有什么我做错了吗?

    此致、

    Tanuj Kumar

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

    尊敬的 Tanuj:

    您设置和保持时间是多少? 特别是写入和读取使能之间。  我无法根据您的代码确定。

    该问题听起来像是时序违例、因为在中、在执行其他操作之前未设置信号。  

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

    您好、Albert、

    我们   电路板的标准模式下使用 SN74V263、在这种情况下、 外部 自由运行   的 50MHz 时钟会从 加电状态持续驱动 WCLK。  主机 MCU  无法选通 或禁用 此时钟。

    在写入操作期间:  FIFO 已满 (FFn)、半满 (HFN) 和空 (EFN) 标志都按预期更改、确认:

    1. 使来自 MCU 的 WEN 和 WCLK 信号正确对齐和时序、即使没有显式的时钟控制也是如此。
    2. 我们可靠地满足数据表中的数据设置和保持要求 (TDS、TDH)。

    注意:我们没有在 WCLK 或数据线上直接使用分接线进行物理信号捕获。

    我 附上了分析器的波形、其中显示了 FIFO 写入和读取周期、FIFO 写入周期、TENS(启用设置时间)和 tENH(启用保持时间)。

     

    初始化代码:

    static inline void initialise_fifo_std_mode(void)
    {
        FIFO_REN  = 1;
        FIFO_OE   = 1;
        FIFO_RCLK = 0;
        FIFO_WREN = 1;
        FIFO_SEN  = 1;
        FIFO_FWFT = 0;  // Standard mode
        FIFO_RS = 0;
        clock_delay(1);
        FIFO_RS = 1;
    }
    

    写入示例:

    static inline void enable_fifo_write_std_mode(void)
    {
        FIFO_PRS = 0;
        fifo_usec_delay(1);   
        FIFO_PRS = 1; 
        FIFO_REN = 1;
        RED_LED  = 0;
        FIFO_WEN = 0;
        FIFO_RCLK = 1; __asm__ volatile("nop");
        FIFO_RCLK = 0; __asm__ volatile("nop");
        FIFO_RCLK = 1; __asm__ volatile("nop");
        FIFO_RCLK = 0;
    }
    

    阅读示例:

    static inline void enable_fifo_read_std_mode(void)
    {
        uint16_t read_data;    
        unsigned int count;
        
        FIFO_WEN  = 1;
        FIFO_OE   = 0;
        FIFO_REN  = 0;
        FIFO_RCLK = 0;
        __asm__ volatile("nop");
        __asm__ volatile("nop");
        for(count = 0; count < 5; count++)
        {
            FIFO_RCLK = 1;   
            __asm__ volatile("nop");
            FIFO_RCLK = 0;
            __asm__ volatile("nop");
            read_data = PORTD & 0x01FF;
            __asm__ volatile("nop");
        }
        FIFO_OE  = 1;
        FIFO_REN = 1;
        RED_LED  = 0;
        while(1) { RED_LED = ~RED_LED; fifo_msec_delay(100); }
    }

    尽管写入操作成功(通过标志转换进行验证)、但我们在读取期间仍会遇到问题:FIFO 在突发读取周期期间不会更新 FFn 标志或正确地使读取指针前进。 我们已经在信号转换之间使用基于 NOP 的延迟来验证时序 、每个延迟~40ns、应满足或超出数据表的要求(TENS、tENH 等)。

    请查看我们的方法和代码、并建议在给定这种始终运行的 WCLK 场景的情况下、还有哪些其他措施可能会阻止 FIFO 在读取期间更新其状态?

    此致、

    Tanuj Kumar

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

    尊敬的 Tanuj:

    如果没有 WRCLK 和数据、就很难看到完整的画面。  

    我目前的理解是、写入是有效的、可以设置正确的标志、但是、读取并不会将正确的标志 (FF) 设置为低电平。  

    可以看到 WRCLK 会持续切换、 可能写入速度太快、而覆盖读取、即 RCLK 对 WRCLK 来说太慢了。  

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

    您好、Albert、  

    执行读取时、WEN 引脚设置为高电平。 因此、即使 RCLK 与 WCLK 相比速度较慢、也无法进行写入操作。
    此外、当 FIFO 已满时、FFn 标志变为低电平、从而抑制进一步的写入操作。 如果读取操作 成功执行、我们预计会在跟踪中看到 FFn 标志转换为高电平、因为单次成功读取应该会使 FIFO 不再满。 但是、未观察到这种变化。

    OE、REN 和 RCLK 之间是否存在任何可能导致不触发读取周期的特定时序要求、即使 REN 和 RCLK 看似正确也是如此? 在我们的应用程序中、OE 在之前设定为低电平、并在每次读取操作期间保持低电平。 这是建议的程序、还是 OE 时序或操作存在可能影响读取行为或内部标志状态的细微差别?

    我知道仅从波形诊断问题可能具有挑战性、但您能否 回顾我们的步骤并确认我们触发读取操作的程序是否正确?

    此致、

    Tanuj Kumar

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

    尊敬的 Tanuj:

    老实说、在执行方面、我看不到一个明显的问题。 根据我的理解、OE 信号设置正确。  

    正如快速测试一样、是否实际读取了正确的数据(忽略 FF 信号)?

    为了进一步帮助解决此问题、是否有任何方法可以实际探测 WCLK 和数据输入?  

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

    您好、Albert、

    感谢您确认实现。

    问题与 RT(重新传输模式)引脚有关、我没有驱动它。

    连接 RT 线路的默认引脚状态为低电平 (0)、实际上是启用了重新发送模式。

    一旦我将其禁用、FIFO 读取就开始按预期工作。

    我将分享更新后的初始化代码以供参考、希望这对其他人也有帮助。

    static inline void initialise_fifo_std_mode(void)
    {
        // Set initial state for control signals
        FIFO_REN  = 1;
        FIFO_OE   = 1;
        FIFO_RCLK = 0;
        FIFO_RT   = 1;  //Disable retransmitting of data
        FIFO_WREN = 1;
        FIFO_SEN   = 1;
        FIFO_FWFT   = 0;    // Standard mode
        
        // Reset FIFO
        FIFO_RS = 0;
        __asm__ volatile ("nop");
        FIFO_RS = 1;
    }



    此致、

    Tanuj Kumar