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.

[参考译文] CCS/TM4C1290NCPDT:TM4C129 EPI HB8 ADMUX 不工作

Guru**** 2553260 points


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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/828584/ccs-tm4c1290ncpdt-tm4c129-epi-hb8-admux-not-working

器件型号:TM4C1290NCPDT

工具/软件:Code Composer Studio

您好!

我一直在尝试让 TM4C129上的 EPI 在多路复用的8位主机总线模式下工作、但运气不佳。 代码片段如下所示、请告诉我出错了。 在示波器上、我监视 AD0、ALE、WRn、RDN、没有任何内容切换。

////////////////////////////////////////////////////////////////////////////////////////////////////

//从链接器文件

//////////////////////////////////////////////////////////////////////////////////////////////////

--retain=g_pfnVectors

#define NOINIT_RAM_SIZE 0x10
#define FPGA_BASE 0xA0000000

存储器

   闪存(RX)                :origin = 0x00004400,         length = 0x00100000 - 0x4400
   SRAM (rwx)                :origin = 0x20000000、         length = 0x00040000 - NOINIT_RAM_SIZE
   NOINIT_RAM (rwx)         :origin = end (SRAM),          length = NOINIT_RAM_SIZE
   /*应用使用外部 FPGA 存储器映射的 reSigma 转接器*/
   FPGA (rwx)                :origin = FPGA_BASE,         length = 0x00010000


部分

   .intvecs  :> 0x00004400
   .text  :  > FLASH
   .const :  > FLASH
   .cinit :  >闪存
   .pinit :  > FLASH
   init_array:> FLASH

   .vtable  :>0x20000000
   .data  :  > SRAM
   .bss   :  > SRAM
   .sysmem  :> SRAM
   .stack :  > SRAM
   外部:> FPGA

   noinit:  > NOINIT_RAM,type = NOINIT


__STACK_TOP =__STACK + 512;

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

//EPI 初始化

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//下面的规定了当时 EPI 总线使用的 GPIO 管脚
//配置为 HostBus8模式。 使用 AD[0...7]& A[8...15]、WRn、RDN 和 ALE
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
#define EPI_PORta_Pins         0xC0   //用于地址 A[9:8]的引脚[7:6]
#define EPI_PORTB_Pins         0x04   //引脚[2]用于 RD_STROBE
#define EPI_PORTC_Pins         0xF0///   用于 AddrData AD[7:4]的引脚[4:7]
#define EPI_PORTD_Pins         0x00   //不被 EPI 使用
#define EPI_PORT_PINS         0x00   //不被 EPI 使用
#define EPI_PORTF_Pins         0x00   //不被 EPI 使用
#define EPI_PORTG_Pins         0x03   //用于 ADDR A[11:10]的引脚[0:1]
#define EPI_PORTH_PINS         0x0F   //PINS [3:0]用于 AddrData AD[3:0]
#define EPI_PORTJ_PINS         0x00   //不被 EPI 使用
#define EPI_PORTK_Pins         0x00   //不被 EPI 使用
#define EPI_PORTL_Pins         0x07   //用于 Addr[18:16]的引脚[2:0]
#define EPI_PORTM_Pins         0x0F   //用于 Addr[15:12]的 PIN[0:3]
#define EP_PORTN_Pins         0x00   // EP 未使用
#define EPI_PORTP_Pins         0x0C   ///PIN[2]用于 WR_STROBE、PIN[3]用于 ALE
#define EPI_PORTQ_PINS         0x00   //不被 EPI 使用

   //启用所有 GPIO 组。
   MAP_SysCtlPeripheralEnable (SYSCTL_Periph_GPIOA);
   MAP_SysCtlPeripheralEnable (SYSCTL_Periph_GPIOB);
   MAP_SysCtlPeripheralEnable (SYSCTL_Periph_GPIOC);
   MAP_SysCtlPeripheralEnable (SYSCTL_Periph_GPIOD);
   MAP_SysCtlPeripheralEnable (SYSCTL_Periph_GPIOE);
   MAP_SysCtlPeripheralEnable (SYSCTL_Periph_GPIOF);
   MAP_SysCtlPeripheralEnable (SYSCTL_Periph_GPIOG);
   MAP_SysCtlPeripheralEnable (SYSCTL_Periph_GPIOH);
   MAP_SysCtlPeripheralEnable (SYSCTL_Periph_GPIOJ);
   MAP_SysCtlPeripheralEnable (SYSCTL_Periph_GPIOK);
   MAP_SysCtlPeripheralEnable (SYSCTL_Periph_GPIOL);
   MAP_SysCtlPeripheralEnable (SYSCTL_Periph_GPIOM);
   MAP_SysCtlPeripheralEnable (SYSCTL_Periph_GPION);
   MAP_SysCtlPeripheralEnable (SYSCTL_Periph_GPIOP);
   MAP_SysCtlPeripheralEnable (SYSCTL_Periph_GPIOQ);

/*
   GPIOPadConfigSet (GPIO_Porta_base、EPI_Porta_Pins、GPIO_Strength _8mA、GPIO_PIN_TYPE_STD);
   GPIODirModeSet (GPIO_Porta_base、EPI_Porta_Pins、GPIO_DIR_MODE_HW);
   GPIOPadConfigSet (GPIO_PORTB_BASE、EP_PORTB_Pins、GPIO_Strength _8mA、GPIO_PIN_TYPE_STD);
   GPIODirModeSet (GPIO_PORTB_BASE、EP_PORTB_Pins、GPIO_DIR_MODE_HW);
   GPIOPadConfigSet (GPIO_PORTC_BASE、EP_PORTC_Pins、GPIO_Strength _8mA、GPIO_PIN_TYPE_STD);
   GPIODirModeSet (GPIO_PORTC_BASE、EP_PORTC_Pins、GPIO_DIR_MODE_HW);
   GPIOPadConfigSet (GPIO_PORTD_base、EP_PORTD_Pins、GPIO_Strength _8mA、GPIO_PIN_TYPE_STD);
   GPIODirModeSet (GPIO_PORTD_base、EP_PORTD_Pins、GPIO_DIR_MODE_HW);
   GPIOPadConfigSet (GPIO_Porte _BASE、EPI_Porte 引脚、GPIO_Strength _8mA、GPIO_PIN_TYPE_STD);
   GPIODirModeSet (GPIO_Porte _BASE、EPI_Porte 引脚、GPIO_DIR_MODE_HW);
   GPIOPadConfigSet (GPIO_PORTF_BASE、EP_PORTF_Pins、GPIO_Strength _8mA、GPIO_PIN_TYPE_STD);
   GPIODirModeSet (GPIO_PORTF_BASE、EP_PORTF_Pins、GPIO_DIR_MODE_HW);
   GPIOPadConfigSet (GPIO_PORTG_base、EP_PORTG_Pins、GPIO_Strength _8mA、GPIO_PIN_TYPE_STD);
   GPIODirModeSet (GPIO_PORTG_base、EP_PORTG_Pins、GPIO_DIR_MODE_HW);
   GPIOPadConfigSet (GPIO_Porth_BASE、EPI_Porth_Pins、GPIO_Strength _8mA、GPIO_PIN_TYPE_STD);
   GPIODirModeSet (GPIO_Porth_BASE、EPI_Porth_Pins、GPIO_DIR_MODE_HW);
   GPIOPadConfigSet (GPIO_PORTJ_BASE、EP_PORTJ_Pins、GPIO_Strength _8mA、GPIO_PIN_TYPE_STD);
   GPIODirModeSet (GPIO_PORTJ_BASE、EP_PORTJ_Pins、GPIO_DIR_MODE_HW);
   GPIOPadConfigSet (GPIO_PORTK_base、EP_PORTK_Pins、GPIO_Strength _8mA、GPIO_PIN_TYPE_STD);
   GPIODirModeSet (GPIO_PORTK_base、EPI_PORTK_Pins、GPIO_DIR_MODE_HW);
   GPIOPadConfigSet (GPIO_PORTL_base、EP_PORTL_Pins、GPIO_Strength _8mA、GPIO_PIN_TYPE_STD);
   GPIODirModeSet (GPIO_PORTL_base、EPI_PORTL_Pins、GPIO_DIR_MODE_HW);
   GPIOPadConfigSet (GPIO_PORTM_BASE、EP_PORTM_Pins、GPIO_Strength _8mA、GPIO_PIN_TYPE_STD);
   GPIODirModeSet (GPIO_PORTM_BASE、EP_PORTM_Pins、GPIO_DIR_MODE_HW);
   GPIOPadConfigSet (GPIO_PORTN_BASE、EP_PORTN_Pins、GPIO_Strength _8mA、GPIO_PIN_TYPE_STD);
   GPIODirModeSet (GPIO_PORTN_BASE、EP_PORTN_Pins、GPIO_DIR_MODE_HW);
   GPIOPadConfigSet (GPIO_PORTP_BASE、EP_PORTP_PINS、GPIO_FORMENT_8mA、GPIO_PIN_TYPE_STD);
   GPIODirModeSet (GPIO_PORTP_BASE、EP_PORTP_Pins、GPIO_DIR_MODE_HW);
   GPIOPadConfigSet (GPIO_PORTQ_BASE、EP_PORTQ_Pins、GPIO_Strength _8mA、GPIO_PIN_TYPE_STD);
   GPIODirModeSet (GPIO_PORTQ_BASE、EPI_PORTQ_Pins、GPIO_DIR_MODE_HW);
*
   //
   // EPI0 EPI0S0的使能引脚 PH0
   //
   MAP_GPIOPinConfigure (GPIO_PH0_EPI0S0);
   GPIOPinTypeEPI (GPIO_Porth_BASE、GPIO_PIN_0);
   //
   // EPI0 EPI0S1的使能引脚 PH1
   //
   MAP_GPIOPinConfigure (GPIO_PH1_EPI0S1);
   GPIOPinTypeEPI (GPIO_Porth_BASE、GPIO_PIN_1);
   //
   // EPI0 EPI0S2的使能引脚 PH2
   //
   MAP_GPIOPinConfigure (GPIO_PH2_EPI0S2);
   GPIOPinTypeEPI (GPIO_Porth_BASE、GPIO_PIN_2);
   //
   // EPI0 EPI0S3的使能引脚 PH3
   //
   MAP_GPIOPinConfigure (GPIO_PH3_EPI0S3);
   GPIOPinTypeEPI (GPIO_Porth_BASE、GPIO_PIN_3);
   //
   // EPI0 EPI0S4的使能引脚 PC7
   //
   MAP_GPIOPinConfigure (GPIO_PC7_EPI0S4);
   GPIOPinTypeEPI (GPIO_PORTC_BASE、GPIO_PIN_7);
   //
   // EPI0 EPI0S5的使能引脚 PC6
   //
   MAP_GPIOPinConfigure (GPIO_PC6_EPI0S5);
   GPIOPinTypeEPI (GPIO_PORTC_BASE、GPIO_PIN_6);
   //
   // EPI0 EPI0S6的使能引脚 PC5
   //
   MAP_GPIOPinConfigure (GPIO_PC5_EPI0S6);
   //GPIOPinTypeEPI (GPIO_PORTC_BASE、GPIO_PIN_5);
   //
   // EPI0 EPI0S7的使能引脚 PC4
   //
   MAP_GPIOPinConfigure (GPIO_PC4_EPI0S7);
   GPIOPinTypeEPI (GPIO_PORTC_BASE、GPIO_PIN_4);
   //
   // EPI0 EPI0S8的使能引脚 PA6
   //
   MAP_GPIOPinConfigure (GPIO_PA6_EPI0S8);
   GPIOPinTypeEPI (GPIO_Porta_base、GPIO_PIN_6);
   //
   // EPI0 EPI0S9的使能引脚 PA7
   //
   MAP_GPIOPinConfigure (GPIO_PA7_EPI0S9);
   GPIOPinTypeEPI (GPIO_Porta_base、GPIO_PIN_7);
   //
   // EPI0 EPI0S10的使能引脚 PG1
   //
   MAP_GPIOPinConfigure (GPIO_PG1_EPI0S10);
   GPIOPinTypeEPI (GPIO_PORTG_base、GPIO_PIN_1);
   //
   // EPI0 EPI0S11的使能引脚 PG0
   //
   MAP_GPIOPinConfigure (GPIO_PG0_EPI0S11);
   GPIOPinTypeEPI (GPIO_PORTG_base、GPIO_PIN_0);
   //
   // EPI0 EPI0S12的使能引脚 PM3
   //
   MAP_GPIOPinConfigure (GPIO_PM3_EPI0S12);
   GPIOPinTypeEPI (GPIO_PORTM_BASE、GPIO_PIN_3);
   //
   // EPI0 EPI0S13的使能引脚 PM2
   //
   MAP_GPIOPinConfigure (GPIO_PM2_EPI0S13);
   GPIOPinTypeEPI (GPIO_PORTM_BASE、GPIO_PIN_2);
   //
   // EPI0 EPI0S14的使能引脚 PM1
   //
   MAP_GPIOPinConfigure (GPIO_PM1_EPI0S14);
   GPIOPinTypeEPI (GPIO_PORTM_BASE、GPIO_PIN_1);
   //
   // EPI0 EPI0S15的使能引脚 PM0
   //
   MAP_GPIOPinConfigure (GPIO_PM0_EPI0S15);
   GPIOPinTypeEPI (GPIO_PORTM_BASE、GPIO_PIN_0);
   //
   // EPI0 EPI0S16的使能引脚 PL0
   //
   MAP_GPIOPinConfigure (GPIO_PL0_EPI0S16);
   GPIOPinTypeEPI (GPIO_PORTL_BASE、GPIO_PIN_0);
   //
   // EPI0 EPI0S17的使能引脚 PL1
   //
   MAP_GPIOPinConfigure (GPIO_PL1_EPI0S17);
   GPIOPinTypeEPI (GPIO_PORTL_BASE、GPIO_PIN_1);
   //
   // EPI0 EPI0S18的使能引脚 PL2
   //
   MAP_GPIOPinConfigure (GPIO_PL2_EPI0S18);
   GPIOPinTypeEPI (GPIO_PORTL_BASE、GPIO_PIN_2);
   //
   // EPI0 EPI0S28的使能引脚 PB3
   //
   MAP_GPIOPinConfigure (GPIO_PB3_EPI0S28);
   GPIOPinTypeEPI (GPIO_PORTB_BASE、GPIO_PIN_3);
   //
   // EPI0 EPI0S29的使能引脚 PN2
   //
   MAP_GPIOPinConfigure (GPIO_PP2_EPI0S29);
   GPIOPinTypeEPI (GPIO_PORTP_BASE、GPIO_PIN_2);
   //
   // EPI0 EPI0S30的使能引脚 PN3
   //
   MAP_GPIOPinConfigure (GPIO_PP3_EPI0S30);
   GPIOPinTypeEPI (GPIO_PORTP_BASE、GPIO_PIN_3);

   //启用 EPI 外设
    MAP_SysCtlPeripheralEnable (SYSCTL_Periph_EPI0);
   //为 FPGA 接口设置 EPI 工作模式
   //此处使用的值将 EPI 设置为在 system_clock/16=7.5MHz 下运行
   // AddrData 的前8位复用
   //对于电源,两个等待状态,这是等待0,这是两个 EPI 时钟
   EPImodeSet (EPI0_BASE、EPI_MODE_HB8);
   EPIDividerSet (EPI0_BASE、16);
   //EPIConfigHB8Set (EPI0_BASE、(EPI_HB8_MODE_ADMUX | EPI_HB8_WRWAIT_0 |
                   ///EPI_HB8_RDWAIT_0 | EPI_HB8_WORD_ACCESS)、0);
   EPIConfigHB8Set (EPI0_BASE、(EPI_HB8_MODE_ADMUX | EPI_HB8_WRWAIT_0 |
                   EPI_HB8_RDWAIT_0)、0);
   EPIAddressMapSet (EPI0_BASE、EPI_ADDR_RAM_SIZE 64KB | EPI_ADDR_PER_BASE_A);

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//简单的测试用法
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

#define FPGA_BASE 0xA0000000

volatile uint16_t * FPGAptr =((uint16_t *) FPGA_BASE);

int main (空)


   uint32_t i;

   对于(I = 0;I < 32768;I++)
   {
       FPGAPTR[i]= i;
   }

   对于(I = 0;I < 32768;I++)
   {
       PTR[i]= FPGAPPTR[i];
   }

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

    您好 Fayez、

    查看我们的 EPI 示例、我认为您有一个问题、就是您反复调用 GPIOPinTypeEPI。

    我想您可能正在取消使用这些引脚设置的操作。

    正确的方法是:

    //
    //为 EPI 模式配置 GPIO 引脚。 所有 EPI 管脚都需要8mA 的电流
    //推挽操作中的驱动强度。 此步骤还提供对的控制
    连接到 EPI 模块的//引脚。
    //
    GPIOPinTypeEPI (GPIO_Porta_base、EPI_Porta_Pins);
    GPIOPinTypeEPI (GPIO_PORTB_BASE、EP_PORTB_Pins);
    GPIOPinTypeEPI (GPIO_PORTC_BASE、EP_PORTC_Pins);
    GPIOPinTypeEPI (GPIO_PORTG_base、EP_PORTG_Pins);
    GPIOPinTypeEPI (GPIO_Porth_BASE、EPI_Porth_Pins);
    GPIOPinTypeEPI (GPIO_PORTK_base、EPI_PORTK_Pins);
    GPIOPinTypeEPI (GPIO_PORTL_base、EPI_PORTL_Pins);
    GPIOPinTypeEPI (GPIO_PORTM_BASE、EP_PORTM_Pins);
    GPIOPinTypeEPI (GPIO_PORTN_BASE、EP_PORTN_Pins);
    GPIOPinTypeEPI (GPIO_PORTP_BASE、EP_PORTP_Pins);
    GPIOPinTypeEPI (GPIO_PORTQ_BASE、EPI_PORTQ_Pins); 

    请注意、GPIOPinTypeEPI 调用将同时处理 GPIODirModeSet 和 GPIOPadConfigSet

    因此、您可以删除执行此操作的所有代码行:

    GPIOPadConfigSet (GPIO_PORTQ_BASE、EP_PORTQ_Pins、GPIO_Strength _8mA、GPIO_PIN_TYPE_STD);
    GPIODirModeSet (GPIO_PORTQ_BASE、EPI_PORTQ_Pins、GPIO_DIR_MODE_HW); 

    查看 GPIOPinTypeEPI 的更改是否足以使输出运行。

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

    您好、Ralph、

    感谢您的回复。

    正如您在代码片段中看到的,所有这些行都注释掉了/*...*/。 这是我的尝试之一、然后我尝试单独设置每个引脚。  两个都不起作用。 现在、我尝试了您的上述建议、但这也不起作用。

    再次浏览所有设置后、我注意到我使用了一个错误的设置。 我最初曾使用过

     EPIAddressMapSet (EPI0_BASE、EPI_ADDR_RAM_SIZE 64KB| EPI_ADDR_PER_BASE_A);

    将其更改为适当的值

     EPIAddressMapSet (EPI0_BASE、EPI_ADDR_PER_SIZE 64KB | EPI_ADDR_PER_BASE_A);

    现在这些行正在切换、但我遇到了另一个问题。 访问前32K 有效、但如果我尝试访问上面的任何地址、我会遇到 ISR 故障。 故障 ISR 在我尝试读取后直接发生

     ptr = FPGAPTR[0x8000];//它是32K 后的第一个字节

    以下是故障寄存器

    NVIC_FAULT_STAT   0x00008200   可配置故障状态[存储器映射]    
    NVIC_HFAULT_STAT   0x40000000   硬故障状态[存储器映射]    
    NVIC_MM_ADDR   0xA0010000   存储器管理故障地址[存储器映射]    
    NVIC_FAULT_ADDR   0xA0010000   总线故障地址[存储器映射]    

    上面的内容表明我正在尝试读取64K 以上的字节、这将导致一个故障、因为长度被声明为0x00010000。 当我认为我在32K 之后访问第一个字节时、我知道为什么会发生这种情况。


    提前感谢、

    费耶兹

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

    您好 Fayez、

    遵循我们的故障诊断应用手册: http://www.ti.com/lit/an/spma043/spma043.pdf

    该故障似乎是由以下情况引起的:

    不精确数据总线错误

    发生了数据总线错误、但返回地址在中
    堆栈帧与导致错误的指令无关。

    当该位置位时、不会向 FAULTADDR 写入故障地址
    寄存器。
    此故障是异步的。 因此、如果在时检测到故障
    当前过程的优先级高于总线故障优先级
    总线故障变为挂起状态、只有当处理器激活时才激活
    从所有较高优先级的进程返回。 发生精确故障的情况
    处理器进入不精确总线故障处理程序、即处理程序
    检测到 IMPRE 位和一个精确的故障状态都被置位
    位被置位。
    向该位写1即可将其清零。

    根据我在搜索中看到的有关此错误的信息、几乎所有情况都是由于访问之前未正确启用的外设而导致的。 但是、在浏览您的代码时、我没有看到任何可能成为问题的外设。 由于我没有完整的代码可供查看、因此我建议您查看从32k 以上读取数据时可能开始访问的其他外设、并查看其中一个外设是否错过了电话。