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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1269389/tm4c1290ncpdt-i-do-not-see-the-epi-data-or-address-line-toggle-where-did-it-go-wrong

器件型号:TM4C1290NCPDT

使用如下的 EPI 外设设置:

    //
    // Enable all the GPIO peripherals.
    //
    SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA);
    SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB);
    SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOC);
    SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOD);
    SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOE);
    SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF);
    SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOG);
    SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOH);
    SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOJ);
    SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOK);
    SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOL);
    SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOM);
    SysCtlPeripheralEnable(SYSCTL_PERIPH_GPION);
    SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOP);
    SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOQ);
    SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOR);
    SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOS);
    SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOT);

    //
    // Init. EPI0 Bus (General Purpose) (16 bits Data [0..15] + 12 bits Addr [16..27], WR[28], RD[29], FRAME[30], CLK[31])
    //
    SysCtlPeripheralEnable(SYSCTL_PERIPH_EPI0);
    // Wait for GPIO change
    //while(SysCtlPeripheralReady(SYSCTL_PERIPH_EPI0)){};
	GPIOPinConfigure(GPIO_PK0_EPI0S0); // PK0 18 / PH0 29  D0
	GPIOPinConfigure(GPIO_PK1_EPI0S1); // PK1 19 / PH1 30  D1
	GPIOPinConfigure(GPIO_PK2_EPI0S2); // PK2 20 / PH2 31  D2
	GPIOPinConfigure(GPIO_PK3_EPI0S3); // PK3 21 / PH3 32  D3
	GPIOPinConfigure(GPIO_PK7_EPI0S24); // PK7 59   A8
	GPIOPinConfigure(GPIO_PK6_EPI0S25); // PK6 60   A9
	GPIOPinConfigure(GPIO_PK5_EPI0S31); // PK5 61 CLK
	GPIOPinTypeEPI(GPIO_PORTK_BASE, EPI_PORTK_PINS);
	GPIOPinConfigure(GPIO_PC7_EPI0S4); // PC7 22 D4
	GPIOPinConfigure(GPIO_PC6_EPI0S5); // PC6 23 D5
	GPIOPinConfigure(GPIO_PC5_EPI0S6); // PC5 24 D6
	GPIOPinConfigure(GPIO_PC4_EPI0S7); // PC4 25 D7
	GPIOPinTypeEPI(GPIO_PORTC_BASE, EPI_PORTC_PINS);
    GPIOPinConfigure(GPIO_PA6_EPI0S8); // PA8 40 D8
    GPIOPinConfigure(GPIO_PA7_EPI0S9); // PA9 41 D9
	GPIOPinTypeEPI(GPIO_PORTA_BASE, EPI_PORTA_PINS);
	GPIOPinConfigure(GPIO_PG1_EPI0S10); // PG1 50 D10
	GPIOPinConfigure(GPIO_PG0_EPI0S11); // PG0 49 D11
	GPIOPinTypeEPI(GPIO_PORTG_BASE, EPI_PORTG_PINS);
	GPIOPinConfigure(GPIO_PM3_EPI0S12); // PM3 75 D12
	GPIOPinConfigure(GPIO_PM2_EPI0S13); // PM2 22 D13
	GPIOPinConfigure(GPIO_PM1_EPI0S14); // PM1 22 D14
	GPIOPinConfigure(GPIO_PM0_EPI0S15); // PM0 22 D15
	GPIOPinTypeEPI(GPIO_PORTM_BASE, EPI_PORTM_PINS);
	GPIOPinConfigure(GPIO_PL0_EPI0S16); // PL0 81 A0 
	GPIOPinConfigure(GPIO_PL1_EPI0S17); // PL1 82 A1 
	GPIOPinConfigure(GPIO_PL2_EPI0S18); // PL2 83 A2 
	GPIOPinConfigure(GPIO_PL3_EPI0S19); // PL3 84 A3 
	GPIOPinConfigure(GPIO_PL4_EPI0S26); // PL4 84 A10
	GPIOPinTypeEPI(GPIO_PORTL_BASE, EPI_PORTL_PINS);
	GPIOPinConfigure(GPIO_PQ0_EPI0S20); // PQ0 05 A4 
	GPIOPinConfigure(GPIO_PQ1_EPI0S21); // PQ1 06 A5 
	GPIOPinConfigure(GPIO_PQ2_EPI0S22); // PQ2 11 A6 
	GPIOPinConfigure(GPIO_PQ3_EPI0S23); // PQ3 27 A7 
	GPIOPinTypeEPI(GPIO_PORTL_BASE, EPI_PORTL_PINS);
	GPIOPinConfigure(GPIO_PB2_EPI0S27); // pin 91 A11
	GPIOPinConfigure(GPIO_PB3_EPI0S28); // pin 92 /WE (/rd hb16)
	GPIOPinTypeEPI(GPIO_PORTB_BASE, EPI_PORTB_PINS);
    
	GPIOPinConfigure(GPIO_PP2_EPI0S29); // pin    GPIO RD (HB16 /WR) 
	//GPIOPinConfigure(GPIO_PP3_EPI0S30); // pin 22 D5
	GPIOPinTypeEPI(GPIO_PORTP_BASE, EPI_PORTP_PINS);

	// General Purpose Init
	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_1 |   // write wait 2 EPI clocks
                       EPI_HB16_RDWAIT_1 ,   // write wait 2 EPI clocks
                       0);
    
	EPIAddressMapSet(EPI0_BASE, 
                     EPI_ADDR_PER_SIZE_64KB | 
                     EPI_ADDR_PER_BASE_C  // set base to 0xC0000000
                     );

我可以看到时钟以30.72MHz 的频率正确输出。 配合以下测试程序使用:

int
main(void)
{
    volatile int32_t ui32Loop;
   //
    // Make sure the main oscillator is enabled. The system must have a 25MHz crystal attached to the OSC
    // pins. The SYSCTL_MOSC_HIGHFREQ parameter is used when the crystal
    // frequency is 10MHz or higher. SYSCTL_MOSC_SESRC for single ended osc iput (no crystal)
    //
    #if 1// CLK_EX
    SysCtlMOSCConfigSet(SYSCTL_MOSC_HIGHFREQ|SYSCTL_MOSC_SESRC  | SYSCTL_MOSC_PWR_DIS);
    SysCtlClockOutConfig(SYSCTL_CLKOUT_MOSC | SYSCTL_CLKOUT_DIS , 1);
    //SysCtlClockOutConfig(SYSCTL_CLKOUT_MOSC, 1);
    //SysCtlClockFreqSet(SYSCTL_OSC_MAIN | SYSCTL_USE_OSC , 30720000);
    SysCtlClockFreqSet((SYSCTL_XTAL_25MHZ | SYSCTL_OSC_MAIN | SYSCTL_USE_OSC), 25000000);
    //HWREG(SYSCTL_RSCLKCFG_R)=0x03300000;
    #elif 0
    #else // internal with pll
    SysCtlClockOutConfig(SYSCTL_DIVSCLK_EN | SYSCTL_DIVSCLK_SRC_PIOSC, 1);
    SysCtlClockFreqSet(SYSCTL_OSC_INT | SYSCTL_USE_PLL | SYSCTL_CFG_VCO_240, 30720000);
    #endif
    PinoutSet();
    

    //
    // Enable the GPIO port that is used for the on-board LED.
    //
    SYSCTL_RCGCGPIO_R = SYSCTL_RCGCGPIO_R12;

    //
    // Do a dummy read to insert a few cycles after enabling the peripheral.
    //
    ui32Loop = SYSCTL_RCGCGPIO_R;

    //
    // Enable the GPIO pin for the LED (PN0).  Set the direction as output, and
    // enable the GPIO pin for digital function.
    //
    GPIO_PORTN_DIR_R = 0x01;
    GPIO_PORTN_DEN_R = 0x01;

    //
    // Loop forever.
    //
    while(1)
    {
        volatile uint16_t *paddr=(uint16_t *)0xc0000010;
        volatile readval=0;
        //
        // Turn on the LED.
        //
        GPIO_PORTN_DATA_R |= 0x01;
        *paddr=5;
        readval=*paddr;
        //
        // Delay for a bit.
        //
        int delay=200000; //200000
        for(ui32Loop = delay; ui32Loop > 0; ui32Loop--)
        {
        }

        //
        // Turn off the LED.
        //
        GPIO_PORTN_DATA_R &= ~(0x01);

        *paddr=0x0a;
        readval=*paddr;
        //
        // Delay for a bit.
        //
        for(ui32Loop = delay; ui32Loop > 0; ui32Loop--)
        {
        }
    }
}

我可以看到/RD 和/WR 线路正确切换、但看不到 d0或 A4切换。 我哪里出了问题?

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

    您好!

    ,但看不到 d0或 A4切换

     D0映射到 EPI0S0、EPI0S0映射到 PK0。 A4映射至 EPI0S4、EPI0S4映射至 PC7。

    但是、阅读您的评论、您似乎认为 PQ0适用于 A4。 请看你的线路59。 我希望您探测的是正确的引脚、即 A4的 PC7、而不是 PQ0。  

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

    不过、对于 Host16 EPI0S20、是 A4、即 PQ0引脚5。 映射是卷积的。

    两个引脚均未根据提供的代码切换。

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

    我在您的 PortQ 代码中看不到以下行。 您需要定义  EPI_PORTQ_Pins 并调用 GPIOPinTypeEPI()以将 PQ 引脚用于 EPI。  

    GPIOPinTypeEPI (GPIO_PORTQ_BASE、EPI_PORTQ_PINS);

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

    好的、我更正了该问题、现在我可以看到 Data0。 不过 Q0上仍然缺少 A4。  

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

    您好!

     我不知道 PQ0为什么不切换。 请检查:

     -你的代码的确执行 A4地址位、所以它将改变 PQ0上的状态。

     -您可以展示您的  EPI_PORTQ_PINS 包含启用 PQ0的 GPIO_PIN_0吗?

     在 GPIO_PORTQ 的寄存器窗口中,相应的位被启用。

     -什么连接到您电路板上的 PQ0 ?  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    #define EPI_PORTQ_PINS      GPIO_PIN_3 | GPIO_PIN_2 | GPIO_PIN_1 | GPIO_PIN_0
    目前、我使用的是 TM4C1294 Launchpad 作为测试平台。 该引脚上不应有任何元素(为扩展模块 SPI 时钟保留)
     
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您能展示 GPIO_PORTQ 的寄存器转储吗?

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

    具体对于哪些寄存器、cfg reg 为0x4006652c:0x0000ffff

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

    特别是针对端口 Q 的 GPIOAFSEL、GPIODEN、GPIOPCTL。无需使用"Memory Browser"窗口。 只需打开寄存器浏览器窗口。 如果您要显示所有寄存器、则可以。 我想我上次显示了屏幕截图。 又来了。

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

    您好!

     您有任何更新吗? 我希望您已经解决了这个问题。 由于没有活动、我现在将关闭该主题帖。 如果你有任何更新、你可以直接回写、并且该线程将自动更改为"打开"状态。 。