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.
我们将 TM4C1294KCPDT 微控制器与 XC7S25-2CSGA225C FPGA 的 EPI 总线32位(EPIOS0 - EPIOS31)配合使用。 当数据可传输到微控制器时、FPGA 会将配置为中断输入(fpgaReadReady)的引脚置位。 在中断期间、我们需要将 EPI 总线数据读取到微控制器中。 然后、微控制器将配置为输出的引脚 PM5置为有效、以确认数据接收(ucReadACK)。 当 EPI 总线引脚配置为 GPIO 输入时工作正常、但到目前为止、我们尝试使用 TivaWare EPI 库进行此设置的操作已失败。 能否提供任何示例来将 EPI 总线配置为在被查询时仅读取32个 EPI 引脚状态? 请查看随附的代码、并告诉我您是否发现任何违规使用。
下面列出了用于配置和读取 EPI 总线的相关章节。 请注意、在尝试调试时不使用中断。
静态空 configEPIPeripheral( void )
{
//配置 FPGA 读取确认输出
MAP_SysCtlPeripheralEnable (SYSCTL_Periph_GPIOM);
while (! MAP_SysCtlPeripheralReady (SYSCTL_Periph_GPIOM);
MAP_GPIOPinTypeGPIOOutput ( SYSCTL_Periph_GPIOM, OUTPUT_EPI0_READ_ACK_PM5 );
MAP_GPIOPinWrite (SYSCTL_Periph_GPIIOM,OUTPUT_EPI0_READ_ACK_PM5,OUTPUT_EPI0_READ_ACK_PM5);
//配置 FPGA 读取就绪输入
MAP_SysCtlPeripheralEnable (SYSCTL_Periph_GPIOP);
while (! MAP_SysCtlPeripheralReady (SYSCTL_Periph_GPIOP);
MAP_GPIOPinTypeGPIOInput (GPIO_PORTP_BASE、INPUT_EPI0_READ_RDY_INT_PP0);
enablePeripheral( SYSCTL_Periph_EPI0 );
//配置 EPI 管脚
MAP_SysCtlPeripheralEnable (SYSCTL_Periph_GPIOA);
while (! MAP_SysCtlPeripheralReady (SYSCTL_Periph_GPIOA)
MAP_GPIOPinTypeEPI (GPIO_Porta_base、EPI0_SIGNAL_9_PA7 | EPI0_SIGNAL_8_PA6);
MAP_GPIOPinConfigure ( EPI0_SIGNAL_9_PA7 | EPI0_SIGNAL_8_PA6 );
MAP_SysCtlPeripheralEnable (SYSCTL_Periph_GPIOB);
while (! MAP_SysCtlPeripheralReady (SYSCTL_Periph_GPIOB);
MAP_GPIOPinTypeEPI (GPIO_PORTB_BASE、EPI0_SIGNAL_28_PB3 | EPI0_SIGNAL_27_PB2);
MAP_GPIOPinConfigure (EPI0_SIGNAL_28_PB3 | EPI0_SIGNAL_27_PB2);
MAP_SysCtlPeripheralEnable (SYSCTL_Periph_GPIOC);
while (! MAP_SysCtlPeripheralReady (SYSCTL_Periph_GPIOC);
MAP_GPIOPinTypeEPI (GPIO_PORTC_BASE、EPI0_SIGNAL_4_PC7 | EPI0_SIGNAL_5_PC6 | EPI0_SIGNAL_6_PC5 | EPI0_SIGNAL_7_PC4);
MAP_GPIOPinConfigure (EPI0_SIGNAL_4_PC7 | EPI0_SIGNAL_5_PC6 | EPI0_SIGNAL_6_PC5 | EPI0_SIGNAL_7_PC4);
MAP_SysCtlPeripheralEnable (SYSCTL_Periph_GPIOG);
while (! MAP_SysCtlPeripheralReady (SYSCTL_Periph_GPIOG);
MAP_GPIOPinTypeEPI (SYSCTL_PERIPH_GPIOG、EPI0_SIGNAL_10_PG1 | EPI0_SIGNAL_11_PG0);
MAP_GPIOPinConfigure ( EPI0_SIGNAL_10_PG1| EPI0_SIGNAL_11_PG0 );
MAP_SysCtlPeripheralEnable (SYSCTL_Periph_GPIOK);
while (! MAP_SysCtlPeripheralReady (SYSCTL_Periph_GPIOK);
MAP_GPIOPinTypeEPI (SYSCTL_PERIPH_GPIOH, EPI0_SIGNAL_24_PK7 | EPI0_SIGNAL_25_PK6 | EPI0_SIGNAL_31_PK5);
MAP_GPIOPinConfigure (EPI0_SIGNAL_24_PK7 | EPI0_SIGNAL_25_PK6 | EPI0_SIGNAL_31_PK5);
MAP_SysCtlPeripheralEnable (SYSCTL_Periph_GPIOL);
while (! MAP_SysCtlPeripheralReady (SYSCTL_Periph_GPIOL);
MAP_GPIOPinTypeEPI (SYSCTL_PERIPH_GPIOL, EPI0_SIGNAL_26_PL4 | EPI0_SIGNAL_19_PL3 | EPI0_SIGNAL_18_PL2 | EPI0_SIGNAL_17_PL1 | EPI0_SIGNAL_16_PL0);
MAP_GPIOPinConfigure (EPI0_SIGNAL_26_PL4 | EPI0_SIGNAL_19_PL3 | EPI0_SIGNAL_18_PL2 | EPI0_SIGNAL_17_PL1 | EPI0_SIGNAL_16_PL0);
MAP_GPIOPinTypeEPI (SYSCTL_PERIPH_GPIOM, EPI0_SIGNAL_12_PM3 | EPI0_SIGNAL_13_PM2 | EPI0_SIGNAL_14_PM1 | EPI0_SIGNAL_15_PM0);
MAP_GPIOPinConfigure (EPI0_SIGNAL_12_PM3 | EPI0_SIGNAL_13_PM2 | EPI0_SIGNAL_14_PM1 | EPI0_SIGNAL_15_PM0);
MAP_GPIOPinTypeEPI (SYSCTL_Periph_GPIOQ,EPI0_SIGNAL_30_PP3 | EPI0_SIGNAL_29_PP2);
MAP_GPIOPinConfigure ( EPI0_SIGNAL_30_PP3 | EPI0_SIGNAL_29_PP2 );
//配置 EPI 操作
MAP_EPIModeSet (EPI0_BASE、EPI_MODE_General);
MAP_EPIDividerSet (EPI0_BASE,1);
MAP_EPIConfigGPModeSet (EPI0_BASE、EPI_GPMODE_ASIZE_NONE | EPI_GPMODE_DSIZE_32、0、0);
MAP_EPIAddressMapSet ( EPI0_BASE、EPI_ADDR_PER_BASE_A );
}
静态空 readEPI(空)
{
uint32_t inx、
epiData;
for (inx=0;inx<100;inx++)
{
while (! MAP_GPIOPinRead (GPIO_PORTP_BASE,INPUT_EPI0_READ_RDY_INT_PP0);
MAP_GPIOPinWrite (GPIO_PORTM_BASE、OUTPUT_EPI0_READ_ACK_PM5、~OUTPUT_EPI0_READ_ACK_PM5);
epiData = 0;
epiData = HWREG( 0xA0000000 );
MAP_GPIOPinWrite (GPIO_PORTM_BASE、OUTPUT_EPI0_READ_ACK_PM5、OUTPUT_EPI0_READ_ACK_PM5);
if ( epiData != epp_data_pattern[ inx % 2 ])
logError( INVALID_EPI_PATH_ERROR );
}
}
但是、到目前为止、我们使用 TivaWare EPI 库进行设置的尝试失败了。 您能提供配置 EPI 总线的任何示例吗
您好!
C:\ti\TivaWare_C_Series-2.2.0.295\examples\peripherals\epi\SDRAM.c 中有一个示例。 虽然示例中的 EPI 模块与 SDRAM 进行直接连接、但 EPI 管脚的配置应该是相同的。 请注意、与通用模式相比、SDRAM 中并不需要某些 EPI 总线管脚。 在本例中、对每个管脚的 PCTL 寄存器进行手动设置、而不是通过 GPIOPinConfigure 来进行设置。
// // The EPI0 peripheral must be enabled for use. // SysCtlPeripheralEnable(SYSCTL_PERIPH_EPI0); // // For this example EPI0 is used with multiple pins on PortA, B, C, G, H, // K, L, M and N. The actual port and pins used may be different on your // part, consult the data sheet for more information. // TODO: Update based upon the EPI pin assignment on your target part. // SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA); SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB); SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOC); SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOG); SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOK); SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOL); SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOM); SysCtlPeripheralEnable(SYSCTL_PERIPH_GPION); // // This step configures the internal pin muxes to set the EPI pins for use // with EPI. Please refer to the datasheet for more information about pin // muxing. Note that EPI0S27:20 are not used for the EPI SDRAM // implementation. // TODO: Update this section based upon the EPI pin assignment on your // target part. // // // EPI0S4 ~ EPI0S7: C4 ~ 7 // ui32Val = HWREG(GPIO_PORTC_BASE + GPIO_O_PCTL); ui32Val &= 0x0000FFFF; ui32Val |= 0xFFFF0000; HWREG(GPIO_PORTC_BASE + GPIO_O_PCTL) = ui32Val; // // EPI0S8 ~ EPI0S9: A6 ~ 7 // ui32Val = HWREG(GPIO_PORTA_BASE + GPIO_O_PCTL); ui32Val &= 0x00FFFFFF; ui32Val |= 0xFF000000; HWREG(GPIO_PORTA_BASE + GPIO_O_PCTL) = ui32Val; // // EPI0S10 ~ EPI0S11: G0 ~ 1 // ui32Val = HWREG(GPIO_PORTG_BASE + GPIO_O_PCTL); ui32Val &= 0xFFFFFF00; ui32Val |= 0x000000FF; HWREG(GPIO_PORTG_BASE + GPIO_O_PCTL) = ui32Val; // // EPI0S12 ~ EPI0S15: M0 ~ 3 // ui32Val = HWREG(GPIO_PORTM_BASE + GPIO_O_PCTL); ui32Val &= 0xFFFF0000; ui32Val |= 0x0000FFFF; HWREG(GPIO_PORTM_BASE + GPIO_O_PCTL) = ui32Val; // // EPI0S16 ~ EPI0S19: L0 ~ 3 // ui32Val = HWREG(GPIO_PORTL_BASE + GPIO_O_PCTL); ui32Val &= 0xFFFF0000; ui32Val |= 0x0000FFFF; HWREG(GPIO_PORTL_BASE + GPIO_O_PCTL) = ui32Val; // // EPI0S28 : B3 // ui32Val = HWREG(GPIO_PORTB_BASE + GPIO_O_PCTL); ui32Val &= 0xFFFF0FFF; ui32Val |= 0x0000F000; HWREG(GPIO_PORTB_BASE + GPIO_O_PCTL) = ui32Val; // // EPI0S29 ~ EPI0S30: N2 ~ 3 // ui32Val = HWREG(GPIO_PORTN_BASE + GPIO_O_PCTL); ui32Val &= 0xFFFF00FF; ui32Val |= 0x0000FF00; HWREG(GPIO_PORTN_BASE + GPIO_O_PCTL) = ui32Val; // // EPI0S00 ~ EPI0S03, EPI0S31 : K0 ~ 3, K5 // ui32Val = HWREG(GPIO_PORTK_BASE + GPIO_O_PCTL); ui32Val &= 0xFF0F0000; ui32Val |= 0x00F0FFFF; HWREG(GPIO_PORTK_BASE + GPIO_O_PCTL) = ui32Val; // // Configure the GPIO pins for EPI mode. All the EPI pins require 8mA // drive strength in push-pull operation. This step also gives control of // pins to the EPI module. // GPIOPinTypeEPI(GPIO_PORTA_BASE, EPI_PORTA_PINS); GPIOPinTypeEPI(GPIO_PORTB_BASE, EPI_PORTB_PINS); GPIOPinTypeEPI(GPIO_PORTC_BASE, EPI_PORTC_PINS); GPIOPinTypeEPI(GPIO_PORTG_BASE, EPI_PORTG_PINS); GPIOPinTypeEPI(GPIO_PORTK_BASE, EPI_PORTK_PINS); GPIOPinTypeEPI(GPIO_PORTL_BASE, EPI_PORTL_PINS); GPIOPinTypeEPI(GPIO_PORTM_BASE, EPI_PORTM_PINS); GPIOPinTypeEPI(GPIO_PORTN_BASE, EPI_PORTN_PINS);
是的、我了解您提到的 SDRAM 示例。 我曾研究过这方面的工作,以及其他数个外展职位。 正如我在原始问题中提到的、当 FPGA 指示数据已就绪时、只需要读取 EPI0 - EPI31上的输入。 这与32位 SPI 总线类似、其中 FPGA 是主器件、数据就绪标志充当时钟信号、其中数据在上升沿由微控制器读取、在下降沿由 FPGA 提供。 是否可以建议一种在不读取每个端口引脚的情况下读取 EPI 总线数据的方法?
Patrick、您好!
我真的没有发现您的代码有任何问题。 您能告诉我您读取了哪些数据吗? 它是读取零还是读取一些垃圾数据?
您能否显示 GPIO 寄存器设置、尤其是寄存器浏览器中的 GPIO_PCTL 和 GPIO_DEN 以及 GPIO_AFSEL 寄存器设置?
EPI 使用很多引脚。 我们首先根据以下配置选择 EPI0S8和 EPI0S9、因为这两个 EPI 信号会映射到 PA6和 PA7。 我想查看他们的设置。 我预计 PORTA 的 GPIOPCTL 寄存器中将出现0xFF000000。 得到了什么? 当然、这些管脚的 GPIODEN 和 GPIOAFSEL 也应该被设置。
//配置 EPI 管脚
MAP_SysCtlPeripheralEnable (SYSCTL_Periph_GPIOA);
while (! MAP_SysCtlPeripheralReady (SYSCTL_Periph_GPIOA)
MAP_GPIOPinTypeEPI (GPIO_Porta_base、EPI0_SIGNAL_9_PA7 | EPI0_SIGNAL_8_PA6);
MAP_GPIOPinConfigure ( EPI0_SIGNAL_9_PA7 | EPI0_SIGNAL_8_PA6 );
事实上、所有 EPI 信号都是复用表中的第15个选择信号。 对于所有相关的 EPI 管脚、都应该看到 PMCx 位域等于0xF。
几次更新后、我能够在 GPIO_PDCTL 和 GPIO_DEN 中获得正确的值。 请注意我必须 为每个单独的引脚调用 GPIOPinConfigure()以使 GPIO_PDCTL 为每个引脚设置0xF。 使用 连接形式(GPIO_PA6_EPI0S8 | GPIO_PA7_EPI0S9)只会将最高阶引脚设置为0xF。
不过、即使每个 EPI 管脚的配置正确、当我预期接收到 0xAA55AA55的测试模式时、返回值仍然为0。 我不明白什么触发了 EPI 数据传输到存储器位置 0xA0000000进行读取。 我唯一使用的专用 EPI 线是用于数据传输的 EPI0 - EPI31。 我的应用使用一个配置为 FPGA 输入、充当时钟输入、并使用一个配置为 FPGA 输出的 GPIO 确认已成功读取数据。 如何使用 GPIO 时钟输入触发将数据从 EPI 总线传输到某个读取位置?
Patrick、您好!
是否可以尝试从 EPIREADFIFO0寄存器读取数据、而不是从0xA0000000读取数据?
实现通用并行 GPIO。 可以写入或读取1至32个引脚、速度精确到
由 EPIBAUD 寄存器波特率控制(配合 WFIFO 及/或 NBRFIFO 使用时)
或由软件或 μ μDMA 的访问速率决定。 此类应用的示例包括:
–通过将20个引脚配置为输入来以固定时间周期读取20个传感器、
将 EPIBAUD 寄存器的 COUNT0位域设置为分频比、然后进行非阻塞式读操作。
–实施一个非常广泛的可成组且具有固定频率的 PWM/PCM、用于驱动执行器、LED、
等等
我仍然有内置 EPI 读取的问题。 以下是使用内置 EPI 读操作时相关寄存器的值。
端口 A
DEN = 0x000000FF
PCTL = 0xFF112200
PORT B
DEN = 0x0000003C
PCTL = 0x00FFFF00
PORT C
DEN = 0x000000FF
PCTL = 0xFFFF1111
PORT G
DEN = 0x00000003
PCTL = 0x000000FF
PORT H
DEN = 0x0000000F
PCTL = 0x0000FFFF
PORT K
DEN = 0x000000FF
PCTL = 0xFFF00000
PORT L
DEN = 0x0000003F
PCTL = 0x000FFFFF
PORT M
DEN = 0x000000FF
PCTL = 0x0000FFFF
PORT P
DEN = 0x0000000F
PCTL = 0x0011FF00
PORT Q
DEN = 0x0000001F
PCTL = 0x0000FFFF
EPI 寄存器
EPI_CFG = 0x00000010
EPI_BAUD = 0x0000000A
EPI_BAUD2 = 0x00000000
EPI_GPCFG = 0x00000003
EPI_ADDRMAP = 0x00000010
EPIX_RSIZE0 = 0x00000003
EPI_READFIFO1 = 0x40272C00
EPI_READFIFO7 = 0x40272C00
EPI_FIFOLVL = 0x00000033
EPI_RIS = 0x00000004
在 bit_Bang 模式下运行时、一切均正常。但是、当尝试在 GP 模式下使用内置 EPI 时、该读数始终返回0xAA。 0xAA 是所发送内容的第一个字节、但我不确定这是否出于巧合。
请查看随附的代码、确保不会遗漏有关 EPI 用法的任何小细节?
静态空 initEPI( void )
{
enablePeripheral( SYSCTL_Periph_EPI0 );
enablePeripheral( SYSCTL_Periph_GPIOA );
MAP_GPIOPinTypeEPI (GPIO_PORTA_BASE、GPIO_PIN_7 | GPIO_PIN_6);
MAP_GPIOPinConfigure (GPIO_PA6_EPI0S8);
MAP_GPIOPinConfigure (GPIO_PA7_EPI0S9);
enablePeripheral( SYSCTL_Periph_GPIOB );
MAP_GPIOPinTypeEPI (GPIO_PORTB_BASE、GPIO_PIN_3 | GPIO_PIN_2);
MAP_GPIOPinConfigure (EPI0_SIGNAL_27_PB2);
MAP_GPIOPinConfigure (EPI0_SIGNAL_28_PB3);
enablePeripheral( SYSCTL_Periph_gpoc );
MAP_GPIOPinTypeEPI (GPIO_PORTC_BASE、GPIO_PIN_7 | GPIO_PIN_6 | GPIO_PIN_5 | GPIO_PIN_4);
MAP_GPIOPinConfigure (EPI0_SIGNAL_7_PC4);
MAP_GPIOPinConfigure (EPI0_SIGNAL_6_PC5);
MAP_GPIOPinConfigure (EPI0_SIGNAL_5_PC6);
MAP_GPIOPinConfigure (EPI0_SIGNAL_4_PC7);
enablePeripheral( SYSCTL_Periph_GPIOG );
MAP_GPIOPinTypeEPI (GPIO_PORTG_BASE、GPIO_PIN_1 | GPIO_PIN_0);
MAP_GPIOPinConfigure (EPI0_SIGNAL_11_PG0);
MAP_GPIOPinConfigure (EPI0_SIGNAL_10_PG1);
enablePeripheral( SYSCTL_Periph_GPIOH );
MAP_GPIOPinTypeEPI (GPIO_PORth_BASE、GPIO_PIN_3 | GPIO_PIN_2 | GPIO_PIN_1 | GPIO_PIN_0);
MAP_GPIOPinConfigure (EPI0_SIGNAL_0_PH0);
MAP_GPIOPinConfigure (EPI0_SIGNAL_1_PH1);
MAP_GPIOPinConfigure (EPI0_SIGNAL_2_PH2);
MAP_GPIOPinConfigure (EPI0_SIGNAL_3_PH3);
enablePeripheral( SYSCTL_Periph_GPIOK );
MAP_GPIOPinTypeEPI (GPIO_PORTK_BASE、GPIO_PIN_7 | GPIO_PIN_6 | GPIO_PIN_5);
MAP_GPIOPinConfigure (EPI0_SIGNAL_31_PK5);
MAP_GPIOPinConfigure (EPI0_SIGNAL_25_PK6);
MAP_GPIOPinConfigure (EPI0_SIGNAL_24_PK7);
enablePeripheral( SYSCTL_Periph_GPIOL );
MAP_GPIOPinTypeEPI (GPIO_PORTL_BASE、GPIO_PIN_4 | GPIO_PIN_3 | GPIO_PIN_2 | GPIO_PIN_1 | GPIO_PIN_0);
MAP_GPIOPinConfigure (EPI0_SIGNAL_16_PL0);
MAP_GPIOPinConfigure (EPI0_SIGNAL_17_PL1);
MAP_GPIOPinConfigure (EPI0_SIGNAL_18_PL2);
MAP_GPIOPinConfigure (EPI0_SIGNAL_19_PL3);
MAP_GPIOPinConfigure (EPI0_SIGNAL_26_PL4);
enablePeripheral( SYSCTL_Periph_GPIOM );
MAP_GPIOPinTypeEPI (GPIO_PORTM_BASE、GPIO_PIN_3 | GPIO_PIN_2 | GPIO_PIN_1 | GPIO_PIN_0);
MAP_GPIOPinConfigure (EPI0_SIGNAL_15_PM0);
MAP_GPIOPinConfigure (EPI0_SIGNAL_14_PM1);
MAP_GPIOPinConfigure (EPI0_SIGNAL_13_PM2);
MAP_GPIOPinConfigure (EPI0_SIGNAL_12_PM3);
enablePeripheral( SYSCTL_Periph_GPIOP );
MAP_GPIOPinTypeEPI (GPIO_PORTP_BASE、GPIO_PIN_3 | GPIO_PIN_2);
MAP_GPIOPinConfigure (EPI0_SIGNAL_29_PP2);
MAP_GPIOPinConfigure (EPI0_SIGNAL_30_PP3);
enablePeripheral( SYSCTL_Periph_GPIOQ );
MAP_GPIOPinTypeEPI (GPIO_PORTQ_BASE、GPIO_PIN_3 | GPIO_PIN_2 | GPIO_PIN_1 | GPIO_PIN_0);
MAP_GPIOPinConfigure (EPI0_SIGNAL_20_PQ0);
MAP_GPIOPinConfigure (EPI0_SIGNAL_21_PQ1);
MAP_GPIOPinConfigure (EPI0_SIGNAL_22_PQ2);
MAP_GPIOPinConfigure (EPI0_SIGNAL_23_PQ3);
MAP_EPIModeSet (EPI0_BASE、EPI_MODE_General);
MAP_EPIDividerSet (EPI0_BASE,10);
MAP_EPIConfigGPModeSet (EPI0_BASE、EPI_GPMODE_ASIZE_NONE | EPI_GPMODE_DSIZE_32、0、0);
MAP_EPIAddressMapSet ( EPI0_BASE、EPI_ADDR_PER_BASE_A );
}
静态空 testEPI(空)
{
uin32_t inx、
epiData;
for (inx=0;inx<100;inx++)
{
MAP_GPIOPinWrite (GPIO_PORTM_BASE、OUTPUT_EPI0_READ_ACK_PM5、OUTPUT_EPI0_READ_ACK_PM5);
while (! MAP_GPIOPinRead (GPIO_PORTP_BASE,INPUT_EPI0_READ_RDY_INT_PP0);
MAP_GPIOPinWrite (GPIO_PORTM_BASE、OUTPUT_EPI0_READ_ACK_PM5、~OUTPUT_EPI0_READ_ACK_PM5);
#ifdef bit_Bang
epiData = MAP_GPIOPinRead (GPIO_Porta_base、PORT_A_EPI_PINS)<< 2;
epiData |= MAP_GPIOPinRead (GPIO_PORTB_BASE、PORT_B_EPI_PINS)<< 25;
epiData |=_ rbit ( MAP_GPIOPinRead ( GPIO_PORTC_BASE , PORT_C_EPI_PINS )>> 20;
epiData |=_ rbit ( MAP_GPIOPinRead ( GPIO_PORTG_BASE, PORT_G_EPI_PINS )>> 20;
epiData |= MAP_GPIOPinRead (GPIO_PORth_BASE、PORT_H_EPI_PINS);
InputPins = MAP_GPIOPinRead (GPIO_PORTK_BASE、PORT_K_EPI_Pins);
epiData |=(InputPins & 0x00000020)<< 26;
epiData |=(InputPins & 0x00000080)<< 17;
epiData |=(InputPins & 0x00000040)<< 19;
InputPins = MAP_GPIOPinRead (GPIO_PORTL_BASE、PORT_L_EPI_Pins);
epiData |=(输入引脚和0x0000000F)<< 16;
epiData |=(InputPins & 0x00000010)<< 22;
epiData |=_rbit ( MAP_GPIOPinRead ( GPIO_PORTM_BASE、PORT_M_EPI_PINS )>>16;
epiData |= MAP_GPIOPinRead (GPIO_PORTP_BASE、PORT_P_EPI_PINS)<< 27;
epiData |= MAP_GPIOPinRead (GPIO_PORTQ_BASE、PORT_Q_EPI_PINS)<< 20;
#else
epiData = HWREG( 0xA0000000 );
#endif
}
}
epiData |=_ rbit ( MAP_GPIOPinRead ( GPIO_PORTM_BASE、PORT_M_EPI_PINS )>> 16;
epiData |= MAP_GPIOPinRead (GPIO_PORTP_BASE、PORT_P_EPI_PINS)<< 27;
epiData |= MAP_GPIOPinRead (GPIO_PORTQ_BASE、PORT_Q_EPI_PINS)<< 20;
#else
epiData = HWREG( 0xA0000000 );
#endif[/报价]Patrick、您好!
我仍然看到您从0xA0000000读取。 如果采用 SDRAM 或主机总线模式、此地址是要读取的基于存储器的地址。 在 EPI 自定义 GPIO 模式下、是否尝试过从0x400D.0070读取数据?
此外、EPI 控制器还提供自定义 GPIO、可以快速使用 FIFO
使用片内写 FIFO (WFIFO)或非阻塞式读 FIFO (NBRFIFO)进行控制。
WFIFO 可以保存4个字的数据、这些数据以受控的速率写入外部接口
由 EPI 主波特率寄存器(EPIBAUD)查询。 NBRFIFO 可保存8个字的数据并且
采样率由 EPIBAUD 寄存器控制。 EPI 控制器通过将数据信号
因此比常规 GPIO 更有优势、因为常规 GPIO 的时序
片上总线仲裁和总线桥上的延迟
仍然在环形进行、没有取得进展。 在将所有引脚配置为通用输入后、可以使其正常工作、这种情况令人沮丧。 尝试使用 EPI TivaWare API 并未取得任何成功。 正如您的建议、我更改了代码中的两行:
将 MAP_EPIAddressMapSet (EPI0_BASE、EPI_ADDR_PER_BASE_A);更改为 MAP_EPIAddressMapSet (EPI0_BASE、EPI_ADDR_CODE_BASE_NONE);
将 epiData = HWREG( 0xA0000000 );更改为 epiData = HWREG( 0x400D0070 );
当运行时、它应该在以下测试图形之间切换时、始终读取0x60261C82。
const uint32_t EPI_data_pattern[ 2 ]=
{
0xAA55AA55、
0x55AA55AA
};
能否确认您已在通用模式下使用 EPI 总线? 我们在解决这个问题方面没有取得任何进展。 请说明您已经通过提供一些工作示例代码完成了在通用模式下使用 EPI 进行的测试。
我还在 E2E 设计支持论坛"TM4C1294 EPI GPIO Mode "中尝试了建议的更改。 这表明需要 在 MAP_EPIConfigGPModeSet API 中使用 EPI_GPMODE_CLKPIN。 这也不起作用、但它提供了在两个值之间循环的值、尽管这不是预期的数据模式。 如果 Amit 仍在 TI 工作、你能否和他核实一下如何解决这个问题?
能否确认您已在通用模式下使用 EPI 总线? 我们在解决这个问题方面没有取得任何进展。 请说明您已经通过提供一些工作示例代码完成了在通用模式下使用 EPI 进行的测试。
我还在 E2E 设计支持论坛"TM4C1294 EPI GPIO Mode "中尝试了建议的更改。 这表明需要 在 MAP_EPIConfigGPModeSet API 中使用 EPI_GPMODE_CLKPIN。 这也不起作用、但它提供了在两个值之间循环的值、尽管这不是预期的数据模式。 如果 Amit 仍在 TI 工作、你能否和他核实一下如何解决这个问题?
[/报价]Patrick、您好!
我完全理解你的沮丧。 阿米特早已离开了这个团体。 我自己以前没有使用过通用模式、而且 除了 LaunchPad、我还没有可以通过 EPI GPIO 模式轻松与外部器件进行通信的电路板。
您能显示您的整个 EPI 模块寄存器转储吗? 或者、如果您不介意、可以将包含代码的整个主文件发送给我、以便我可以自己运行。 我想看看我是否可以根据规格理解寄存器设置。 实际上、在 GPIO 模式下使用时、数据表没有明确地址和时钟设置。
我在 Amit 和另一张海报之间找到了另外一篇关于 GPIO 模式的文章。 不确定你是否见过这个。 海报似乎解决了问题。
下面的这个也可能值得阅读。
如何将代码文件发送给您? 我没有看到任何附加文件的选项。
您只需将文件拖动到编辑窗口中即可。
e2e.ti.com/.../epiTest.ce2e.ti.com/.../epiTestPinMap.h
请查看随附的程序和头文件。 在当前配置下、我在偶数索引上接收到0x256、在奇 数索引上接收到0x512、在偶数索引上接收到0xAA55AA55、 在奇数索引上接收到0x55AA55AA。
Patrick、您好!
我发现您的引脚配置有一个主要问题。 我之前要求您检查 PCTL 寄存器、您说它们是正确的。 我运行代码时、未正确对 PCTL 寄存器进行编程。 下面我选择一行解释。
EPI0引脚配置如下行。
MAP_GPIOPinConfigure (EPI0_SIGNAL_27_PB2);//将各个端口引脚分配至 EPI 总线
将 EPI0_SIGNAL_27_PB2重新定义为 GPIO_PIN_2 、这完全错误。
枚举端口 B_pinMap_e
{
USB0_ID_PB0 = GPIO_PIN_0、
EPI0_SIGNAL_27_PB2 = GPIO_PIN_2、
EPI0_SIGNAL_28_PB3 = GPIO_PIN_3、
QSPI1_ENABLE_PB4 = GPIO_PIN_4、
QSPI1_CLK_PB5 = GPIO_PIN_5
}
如果您看看 GPIO_PIN_2的定义、它等于0x00000004。
#define GPIO_PIN_0 0x00000001 // GPIO 引脚0
#define GPIO_PIN_1 0x00000002 // GPIO 引脚1
#define GPIO_PIN_2 0x00000004 // GPIO 引脚2
#define GPIO_PIN_3 0x00000008 // GPIO 引脚3
#define GPIO_PIN_4 0x00000010 // GPIO 引脚4
#define GPIO_PIN_5 0x00000020 // GPIO 引脚5
#define GPIO_PIN_6 0x00000040 // GPIO 引脚6
#define GPIO_PIN_7 0x00000080 // GPIO 引脚7
但是:
如果您使用 TivaWare 中预定义的引脚宏 GPIO_PB2_EPI0S27、那么您不会有问题。 GPIO_PB2_EPI0S27 等于0x0001080F。 下半字节的值 F 用于通过 F 对 PCTL 进行编程。这是为了选择第15引脚多路复用器选项。 显然 0x00000004 不等于 0x0001080F。 您需要 首先修复所有 MAP_GPIOPinConfigure 问题。
MAP_GPIOPinConfigure (GPIO_PB2_EPI0S27);
#define GPIO_PB2_T5CCP0 0x00010803
#define GPIO_PB2_I2C0SCL 0x00010802
#define GPIO_PB2_USB0STP 0x0001080E
#define GPIO_PB2_EPI0S27 0x0001080F
e2e.ti.com/.../4274.epiTest.ce2e.ti.com/.../4274.epiTestPinMap.h
没错、此错误是在调试期间的多次迭代过程中引入的。 当我确认 PCTL 的内容时、设置正确。 我已附上更新的计划。 现在、 在使用 CLKPIN 时、结果始终显示为2147483648、 在不使用 CLKPIN 时显示为170。 但仍然无法按预期工作。 请告诉我、您是否能发现可能妨碍此功能正常运行的任何其他错误。
Patrick、您好!
我没有您的电路板使用 OUTPUT_EPI0_CTS_PM5和 INPUT_EPI0_RTS_INT_PP0进行握手来与 FPGA 连接。 因此,我用下面的代码注释掉大多数 testepi()。 我在 LaunchPad 上对其进行测试。 我将 EPI0S0 (PH0)和 EPI0S1 (PH1)连接至3.3V、并且可以看到 epiData 等于0x80000003。 我可以看到位0和位1是正确的。 为什么不试试?
请注意一周其余时间的重大美国假期、并预计会延迟回复。
static void testEPI( void ) { uint32_t inx, #ifdef BIT_BANG inputPins, #endif epiData; int i = 0; while (1){ for (i=0;i<100;i++); epiData = HWREG( EPI_PORT ); // Read the FPGA data from EPI bus } // for( inx = 0 ; inx < 100 ; inx++ ) // { // updateOutputState( GPIO_PORTM_BASE, OUTPUT_EPI0_CTS_PM5, ENABLE_OUTPUT ); // Set read ack to false while reading data // // while( ! MAP_GPIOPinRead( GPIO_PORTP_BASE, INPUT_EPI0_RTS_INT_PP0 ) ); // Wait for FPGA to indicate data ready to read // // updateOutputState( GPIO_PORTM_BASE, OUTPUT_EPI0_CTS_PM5, DISABLE_OUTPUT ); // Set read ack to false while reading data // //#ifdef BIT_BANG // epiData = MAP_GPIOPinRead( GPIO_PORTA_BASE, PORT_A_EPI_PINS ) << 2; // Read the port A EPI input pins // epiData |= MAP_GPIOPinRead( GPIO_PORTB_BASE, PORT_B_EPI_PINS ) << 25; // Read the port B EPI input pins // epiData |= __rbit( MAP_GPIOPinRead( GPIO_PORTC_BASE, PORT_C_EPI_PINS ) ) >> 20; // Read the port C EPI input pins // epiData |= __rbit( MAP_GPIOPinRead( GPIO_PORTG_BASE, PORT_G_EPI_PINS ) ) >> 20; // Read the port G EPI input pins // epiData |= MAP_GPIOPinRead( GPIO_PORTH_BASE, PORT_H_EPI_PINS ); // Read the port H EPI input pins // // inputPins = MAP_GPIOPinRead( GPIO_PORTK_BASE, PORT_K_EPI_PINS ); // Read the port K EPI input pins // epiData |= (inputPins & 0x00000020) << 26; // Mask off bit 5 and load bit into position 31 // epiData |= (inputPins & 0x00000080) << 17; // Mask off bit 7 and load bit into position 24 // epiData |= (inputPins & 0x00000040) << 19; // Mask off bit 6 and load bit into position 25 // // inputPins = MAP_GPIOPinRead( GPIO_PORTL_BASE, PORT_L_EPI_PINS ); // Read the port L EPI input pins // epiData |= (inputPins & 0x0000000F) << 16; // Load bits 0 - 3 into positions 16 - 19 // epiData |= (inputPins & 0x00000010) << 22; // Load bit 4 into position 22 // // epiData |= __rbit( MAP_GPIOPinRead( GPIO_PORTM_BASE, PORT_M_EPI_PINS ) ) >> 16; // Read the port M EPI input pins // epiData |= MAP_GPIOPinRead( GPIO_PORTP_BASE, PORT_P_EPI_PINS ) << 27; // Read the port P EPI input pins // epiData |= MAP_GPIOPinRead( GPIO_PORTQ_BASE, PORT_Q_EPI_PINS ) << 20; // Read the port Q EPI input pins //#else //// epiData = HWREG( 0x400D0070 ); // Read the FPGA data from EPI bus // epiData = HWREG( EPI_PORT ); // Read the FPGA data from EPI bus //#endif // updateOutputState( GPIO_PORTN_BASE, OUTPUT_EPI0_READ_DONE_PN4, ENABLE_OUTPUT ); // Initialize read ack to true // // while( MAP_GPIOPinRead( GPIO_PORTP_BASE, INPUT_EPI0_RTS_INT_PP0 ) ); // Wait for FPGA to indicate data cleared // // updateOutputState( GPIO_PORTN_BASE, OUTPUT_EPI0_READ_DONE_PN4, DISABLE_OUTPUT ); // Initialize read ack to true // // if( epiData != EPI_DATA_PATTERN[ inx % 2 ] ) // If the EPI data doesn't match the expected value // epiData = epiData; // Breakpoint to check for errors // } }
Patrick、您好!
我没有您的电路板使用 OUTPUT_EPI0_CTS_PM5和 INPUT_EPI0_RTS_INT_PP0进行握手来与 FPGA 连接。 因此,我用下面的代码注释掉大多数 testepi()。 我在 LaunchPad 上对其进行测试。 我将 EPI0S0 (PH0)和 EPI0S1 (PH1)连接至3.3V、并且可以看到 epiData 等于0x80000003。 我可以看到位0和位1是正确的。 为什么不试试?
请注意一周其余时间的重大美国假期、并预计会延迟回复。
static void testEPI( void ) { uint32_t inx, #ifdef BIT_BANG inputPins, #endif epiData; int i = 0; while (1){ for (i=0;i<100;i++); epiData = HWREG( EPI_PORT ); // Read the FPGA data from EPI bus } // for( inx = 0 ; inx < 100 ; inx++ ) // { // updateOutputState( GPIO_PORTM_BASE, OUTPUT_EPI0_CTS_PM5, ENABLE_OUTPUT ); // Set read ack to false while reading data // // while( ! MAP_GPIOPinRead( GPIO_PORTP_BASE, INPUT_EPI0_RTS_INT_PP0 ) ); // Wait for FPGA to indicate data ready to read // // updateOutputState( GPIO_PORTM_BASE, OUTPUT_EPI0_CTS_PM5, DISABLE_OUTPUT ); // Set read ack to false while reading data // //#ifdef BIT_BANG // epiData = MAP_GPIOPinRead( GPIO_PORTA_BASE, PORT_A_EPI_PINS ) << 2; // Read the port A EPI input pins // epiData |= MAP_GPIOPinRead( GPIO_PORTB_BASE, PORT_B_EPI_PINS ) << 25; // Read the port B EPI input pins // epiData |= __rbit( MAP_GPIOPinRead( GPIO_PORTC_BASE, PORT_C_EPI_PINS ) ) >> 20; // Read the port C EPI input pins // epiData |= __rbit( MAP_GPIOPinRead( GPIO_PORTG_BASE, PORT_G_EPI_PINS ) ) >> 20; // Read the port G EPI input pins // epiData |= MAP_GPIOPinRead( GPIO_PORTH_BASE, PORT_H_EPI_PINS ); // Read the port H EPI input pins // // inputPins = MAP_GPIOPinRead( GPIO_PORTK_BASE, PORT_K_EPI_PINS ); // Read the port K EPI input pins // epiData |= (inputPins & 0x00000020) << 26; // Mask off bit 5 and load bit into position 31 // epiData |= (inputPins & 0x00000080) << 17; // Mask off bit 7 and load bit into position 24 // epiData |= (inputPins & 0x00000040) << 19; // Mask off bit 6 and load bit into position 25 // // inputPins = MAP_GPIOPinRead( GPIO_PORTL_BASE, PORT_L_EPI_PINS ); // Read the port L EPI input pins // epiData |= (inputPins & 0x0000000F) << 16; // Load bits 0 - 3 into positions 16 - 19 // epiData |= (inputPins & 0x00000010) << 22; // Load bit 4 into position 22 // // epiData |= __rbit( MAP_GPIOPinRead( GPIO_PORTM_BASE, PORT_M_EPI_PINS ) ) >> 16; // Read the port M EPI input pins // epiData |= MAP_GPIOPinRead( GPIO_PORTP_BASE, PORT_P_EPI_PINS ) << 27; // Read the port P EPI input pins // epiData |= MAP_GPIOPinRead( GPIO_PORTQ_BASE, PORT_Q_EPI_PINS ) << 20; // Read the port Q EPI input pins //#else //// epiData = HWREG( 0x400D0070 ); // Read the FPGA data from EPI bus // epiData = HWREG( EPI_PORT ); // Read the FPGA data from EPI bus //#endif // updateOutputState( GPIO_PORTN_BASE, OUTPUT_EPI0_READ_DONE_PN4, ENABLE_OUTPUT ); // Initialize read ack to true // // while( MAP_GPIOPinRead( GPIO_PORTP_BASE, INPUT_EPI0_RTS_INT_PP0 ) ); // Wait for FPGA to indicate data cleared // // updateOutputState( GPIO_PORTN_BASE, OUTPUT_EPI0_READ_DONE_PN4, DISABLE_OUTPUT ); // Initialize read ack to true // // if( epiData != EPI_DATA_PATTERN[ inx % 2 ] ) // If the EPI data doesn't match the expected value // epiData = epiData; // Breakpoint to check for errors // } }
更新了一些。
我将 EPI0S31 (PK5)连接到0、将 EPI0S0和 EPI0S1连接到1。 我看到 epiData= 0x00000003。