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.

[参考译文] TM4C1290NCPDT:EPI 主机模式计时

Guru**** 2537320 points


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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1265145/tm4c1290ncpdt-epi-host-mode-clocking

器件型号:TM4C1290NCPDT

对于旧系统升级、我们要将 TM4C1290连接到 FPGA 和两个 Duart 芯片。 我们将对芯片选择使用地址解码。 双曲由 tl16c752提供。

我们最初查看 GPIO 模式、但发现时序与 Duart 的读取/写入要求不匹配。  

如果我们使用异步主机模式、我们可以输出时钟以在外部使用吗、这是否仍符合读取/写入/数据/地址线更改的时序?  

系统时钟为外部时钟、EPI 模块将其设置为不进行修改即可使用。 从输入到输出的预期传播延迟是多少?

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

    您好!

    如果我们使用异步主机模式、我们可以输出时钟以在外部使用吗、这是否仍符合读取/写入/数据/地址线更改的时序?  

    [/报价]

    在 异步主机模式下、可以产生 EPICLK、尽管由于不需要时钟的异步协议的性质、外部器件通常不使用它。 请参阅数据表说明。 异步接口信号是针对 EPICLK 生成的。  

    Unknown 说:
    系统时钟是外部时钟、并且将 EPI 设置为未经修改即可使用该时钟。 [/报价]

    你是说系统时钟是外部时钟? EPICLK 是内部生成的时钟。 EPI 模块不以任何外部(片外)生成的时钟作为参考时钟。  

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

    我知道波特时钟提供外部时钟、但它不是来自系统时钟吗?

     如果系统时钟设置为外部时钟源而不使用 PLL、那么在 分频值未设置 EPICLk =(分频器= 0)的情况下 EPI 时钟是否与系统时钟相等? SYSCLK:(SYSCLK /(((分频器/ 2)+ 1)∗2)。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我知道波特时钟提供外部时钟,但不是源自系统时钟吗?

    可以。

    如果系统时钟设置为外部时钟源但未使用 PLL,我认为如果除数未设置 EPIClk =(分频器=0),EPI 时钟将等于系统时钟? SYSCLK:(SYSCLK /((分频器/ 2)+ 1)∗2)。

    也许我错了外部时钟源的意思。 如果您将外部时钟源(相对于整个 MCU)视为 MCU 器件外部的时钟源、则不存在这样的时钟源。 MCU 系统时钟源只能来自 PLL 或其中一个振荡器(例如 MOSC、PIOSC、内部30kHz OSC 或外部32.768kHz OSC)。 如果  是将外部时钟源(相对于 EPI 模块)作为 EPI 模块的参考时钟、则选择是。 EPI 模块使用内部产生的系统时钟进行分频、以便生成 EPICLK。  

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

    好的、因此 MOSC  外部30.72MHz 时钟源(SYSCTL_OSC_MAIN | SYSCTL_USE_OSC)输入应给出一个 30.72MHz EPI 时钟输出。 是这样。

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

    如果您使用的是晶体、请注意以下限制。 如果向 MCU 提供单端时钟、则只能达到30.72Mhz (不知道为什么 EPICLK 具有这个特定频率)。  

    主振荡器(MOSC)。 主振荡器通过外部晶体提供频率精确的
    这两种方式之一:外部单端时钟源连接到 OSC0输入管脚、或
    外部晶体连接在 OSC0输入和 OSC1输出引脚之间。 如果 PLL 正在
    使用时、晶振值可以是5 MHz 到25 MHz (包括)之间的任意频率。 请参阅
    建议的晶振值和 PLL 寄存器编程见。 如果 PLL
    没有被使用、晶体可以是4 MHz 到 CLB 之间的任何一个支持的频率
    25 MHz。 单端时钟源范围从直流到
    部分。

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

    我们使用连接到30.72MHz 上 OSC0输入引脚的外部单端时钟源作为系统时钟。  

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

    如果使用单端时钟输入、则限制是时钟不超过最大规格频率、即120MHz。 你在这里很好。  

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

    感谢 Charles、  

    我没有从 EPI 看到30.72Mhz、好像我得到16MHz (默认?) 当输入30.72时(测量)。

    我的设置

        SysCtlMOSCConfigSet(SYSCTL_MOSC_HIGHFREQ);
        SysCtlClockOutConfig(SYSCTL_CLKOUT_MOSC | SYSCTL_CLKOUT_EN , 1);
        SysCtlClockFreqSet(SYSCTL_OSC_MAIN | SYSCTL_USE_OSC, 30720000);
        ... removed gpio assignment ...
        EPIDividerSet(EPI0_BASE, 0x00000000);		// 0x00010001 1/2 (System) = 120MHz * 0.5 = 60MHz
    	EPIModeSet(EPI0_BASE, EPI_MODE_HB16 );	// General Purpose
    	EPIConfigHB16Set(EPI0_BASE, 
                           EPI_HB16_MODE_ADDEMUX | // sets up data and address as separate, D[15:0].
                           EPI_HB16_WRWAIT_0 |   // write wait 2 EPI clocks
                           EPI_HB16_RDWAIT_0 ,   // write wait 2 EPI clocks
                           0);
        
    	EPIAddressMapSet(EPI0_BASE, 
                         EPI_ADDR_PER_SIZE_64KB | 
                         EPI_ADDR_PER_BASE_C  // set base to 0xC0000000
                         );

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

    抱歉、复制了错误的行

    SysCtlMOSCConfigSet (SYSCTL_MOSC_HIGHFREQ|SYSCTL_MOSC_SESRC  | SYSCTL_MOSC_PWR_DIS);
    尝试了两种方法。 您可以在 osc0上看到时钟  
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

      SysCtlClockFreqSet() API 不支持单端输入时钟。 现在传递的参数将导致  SysCtlClockFreqSet()认为没有振荡器源,因此默认选择了 PIOSC (16MHz)。  

    尽管在外部、您是在 OSC1保持开路的情况下驱动单端时钟输入、但请尝试让 API 误以为它是具有以下调用的25MHz MOSC。

      SysCtlClockFreqSet ((SYSCTL_XTAL_25MHz | SYSCTL_OSC_MAIN | SYSCTL_USE_OSC)、25000000);

     请显示以下寄存器的设置。 您可能需要手动写入某些字段才能使其正常工作。  

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

    (gdb) x 0x400FE0B0
    0x400fe0b0:0x03000000
    (gdb) x 0x400FE07C
    0x400fe07c:0x00000030

    EPI 时钟输出频率仍然为16MHz  

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

    好的、我手动设置

    (gdb)设置{int32_t}0x400fe0b0 = 0x03300000
    (gdb) x 0x400FE0B0
    0x400fe0b0:0x03300000

    调用之后、时钟再次正确输出到 EPI 上。 不知道为什么它以前工作了...

    应忽略   SysCtlClockFreqSet 和 HWREG (SYSCTL_RSCLKCFG_R)= 0x03300000;

    不是那么 简单... 重新写入 SysCtlClockFreqSet 和看到正确的时钟输出。