器件型号:BEAGLEBK
工具/软件:TI C/C++编译器
您好!
我对 BeagleBone Black 的 MII_RT (mii0)接口有疑问。 我使用 PRU Cape 演示软件(https://git.ti.com/pru-software-support-package/pru-software-support-package/trees/master/pru_cape)示例。 我使用更改 MII_RT 的 LED1示例。
TX 工作正常(我将 LAN8710以太网 phy (Microchip)连接到 BeagleBone、并可以查看我在 PC 上的 Wireshark 上发送的数据包)、Rx 有问题。 为了测试 Rx 模式、我使用配置为近端回送模式的 LAN8710。 我在不使用 Rx_L2的 情况下设置 MII_Rx 模式(因为 e2e.ti.com/.../586407 是最后的应答建议)。
我的 PRU 程序:
易失性寄存器 uint32_t __r30; 易失性寄存器 uint32_t __r31; void main (void) { volatile uint32_t rx_data; //清除 SYSCFG[STANDBY_INIT]以启用 OCP 主端口*/ CT_CFG.SYSCFG_BIT.STANDBY_INIT = 0; // TODO:创建停止条件, 而不会无限期地切换(1) /* MII */ _R31 =(1<<18);//rx_reset (我尝试不复位 RX、没有任何区别)、请查看 spruh73p、表4_36 __delay_cycles (400000); int i; 对于(i=0;i<50;i++)//发送包起始 { _R30 = 0xFFFFFF0000|0x7755;// 0x7755 -数据 _R31 =(1<<25);//push to the MII TX } _R30 = 0xFFFFFF0001;// 0x1 -数据 _R31 =(1<<25)|(1<29);//推入 MII TX、EOF_TX、发送包完成 CT_SHAREMDMEM.mem[0]= I;检查共享存储器是否正常工作,我必须从 AM3358主程序读取正确的值“I” _DELAY_CYCLES (40000); RX_DATA =_R31;//读取 MII_RX_L1上的数据和状态 CT_SHAREMDMEM.mem[1]= Rx_DATA;//I 需要在 AM3358主程序中读取 Rx_DATA _DELAY_CYCLES (400); _R31 =(1<<17);//rx_pop16 _DELAY_CYCLES (400); RX_DATA =_R31; _DELAY_CYCLES (40000); CT_SHAREMDMEM.mem[2]= Rx_DATA; _DELAY_CYCLES (400); CT_SHAREMDMEM.mem[4]= 0x55;
我的 AM3358计划:
//设置 PRU Cape
PRUCapePinmux 的引脚复用();
//设置并启用时钟、零存储器、复位 PRU
PRUICSSInit ();
//
//MII
//
GPI_cfg = HWREG (SOC_PRUICSS1_regs + SOC_PRUICSS_CFG_OFFSET + 0x8);
HWREG (SOC_PRUICSS1_regs + SOC_PRUICSS_CFG_OFFSET + 0x8)= GPI_cfg | 0x3;// GPI 至 MII 模式
HWREG (SOC_PRUICSS1_REGS + SOC_PRUICSS_CFG_OFFSET + 0x40)= 0x0;//内部 Pinmux
/* MII 配置*/
HWREG (SOC_PRUICSS1_regs + SOC_PRUICSS_MII_OFFSET + 0x0)= 0x1;//RXCFG0
/* RX_L2–0x0、禁用
RX_ENABLE–0x1*/
HWREG (SOC_PRUICSS1_regs + SOC_PRUICSS_MII_OFFSET + 0x10)= 0x60400101;//TXCFG0
/* TX_CLK_DELAY–0x6
TX_START_DELAY–0x40
TX_MUX_SEL–0x1 (来自 pru1的数据)
TX_ENABLE–0x1*/
MMUConfigAndEnable();
CacheEnable (cache_all);
while (1)
{
MDIO_WRITE (0、0x7100);//写入 LAN8710寄存器(设置环回模式)
延迟(200000000);
字符 temp[1];
控制台 UtilsPrintf ("\n\n 按1启动程序)\n\n";
控制台实用程序集(temp,3);
控制台 UtilsPrintf ("\n 开始\n");
int reg1 = MDIO_READ (0x1););//读取 LAN8710状态
if ((reg1&0x4)&0x4)//链接状态为 up
{
ConsoleUtilsPrintf ("链接已打开\n");
PRUMemLoad (PRU_ICSS1、PRU1_IRAM、0、sizeof (LED1_INST)、(unsigned int*) LED1_INST);
PRUMemLoad (PRU_ICSS1、PRU1_DRAM、0、sizeof (LED1_DATA)、(unsigned int*) LED1_DATA);
控制台 UtilsPrintf ("\n 正在运行 PRU...\n");
PRUEnable (PRU_ICSS1、PRU1);
int i、j;
对于(j=0;j<3;j++)
{
ConsoleUtilsPrintf ("data =");
对于(i=0;i<7;i++)
{
DATA_FER_PRU[i]= HWREG (SOC_PRUICSS1_regs + SOC_PRUICSS_SHARGE_RAM_OFFSET + 0x4*I);
控制台 UtilsPrintf ("%x "、DATA_FER_PRU[i]);
}
控制台 UtilsPrintf ("\n");
延迟(150000000);
}
INT Rx = HWREG (SOC_PRUICSS1_regs + SOC_PRUICSS_MII_OFFSET + 0x0);
INT TX = HWREG (SOC_PRUICSS1_regs + SOC_PRUICSS_MII_OFFSET + 0x10);
控制台 UtilsPrintf ("cfg:Rx =%x TX =%x\n"、Rx、TX);//状态不变
PRUHalt (PRU_ICSS1、PRU1);
}
否则控制台 UtilsPrintf (“链接已关闭”);
}
while (1);
}
void PRUCapePinmux (void)
{
HWREG (SOC_CONTRAL_REGS + CONTRAL_CONF_LCD_DATA (0))= AM335X_PIN_INPUT | CONTRAL_CONF_MUXMODE (2);//clk
HWREG (SOC_CONTRAL_REGS + CONTRAL_CONF_LCD_DATA (1)=AM335X_PIN_OUTPUT | CONTRAL_CONF_MUXMODE (2);//txen
HWREG (SOC_CONTRAL_REGS + CONTRAL_CONF_LCD_DATA (2))= AM335X_PIN_OUTPUT | CONTRAL_CONF_MUXMODE (2);//TX
HWREG (SOC_CONTRAL_REGS + CONTRAL_CONF_LCD_DATA (3))= AM335X_PIN_OUTPUT | CONTRAL_CONF_MUXMODE (2);//TX
HWREG (SOC_CONTRAL_REGS + CONTRAL_CONF_LCD_DATA (4))= AM335X_PIN_OUTPUT | CONTRAL_CONF_MUXMODE (2);//TX
HWREG (SOC_CONTRAL_REGS + CONTRAL_CONF_LCD_DATA (5))= AM335X_PIN_OUTPUT | CONTRAL_CONF_MUXMODE (2);//TX
HWREG (SOC_CONTRAL_REGS + CONTRAL_CONF_LCD_DATA (8))= AM335X_PIN_INPUT | CONTRAL_CONF_MUXMODE (5);//Rx
HWREG (SOC_CONTRAL_REGS + CONTRAL_CONF_LCD_DATA (9))= AM335X_PIN_INPUT | CONTRAL_CONF_MUXMODE (5);//Rx
HWREG (SOC_CONTRAL_REGS + CONTRAL_CONF_LCD_DATA (10))= AM335X_PIN_INPUT | CONTRAL_CONF_MUXMODE (5);//Rx
HWREG (SOC_CONTRAL_REGS + CONTRAL_CONF_LCD_DATA (11))= AM335X_PIN_INPUT | CONTRAL_CONF_MUXMODE (5);//Rx
HWREG (SOC_CONTRAL_REGS + CONTRAL_CONF_LCD_DATA (13))= AM335X_PIN_INPUT | CONTRAL_CONF_MUXMODE (5);//rxer
HWREG (SOC_CONTROL_REGS + CONTROL_CONF_LCD_DATA (15))= AM335X_PIN_INPUT |CONTROL_CONF_MUXMODE (5);//rxdv
HWREG (SOC_CONTROL_REGS + CONTROL_CONF_LCD_PCLK)= AM335X_PIN_INPUT | CONTROL_CONF_MUXMODE (2);//crs
HWREG (SOC_CONTRAL_REGS + CONTRAL_CONF_LCD_DATA (14))= AM335X_PIN_INPUT | CONTRAL_CONF_MUXMODE (5);//clk
//
GPIO 的// MDIO
//
HWREG (SOC_CONTRAL_REGS + CONTRAL_CONF_GPMC_AD (12))= 0x3f;//MDIO_CLK
HWREG (SOC_CONTRAL_REGS + CONTRAL_CONF_GPMC_AD (14))= 0x3f;//MDIO_CLK
}
使用示波器、我可以在 MII_RXD[0-3]、MII_TXD[0-3]、MII_Rx_clk、MII_TX_clk、MII_TX_clk、MII_TX_en 上正确地看到 MII 信号、 MII_Rx_dv 引脚。 我不明白我必须如何连接 MII_Rx_LINK (我现在不连接它)。 MII_Rx_ER 信号始终为“0”。 仅在 RMII 模式下使用的 MII_Rx_col 信号。
当我读取_R31寄存器时、我始终得到0x1000000 (1<<24 -在 GPI_MII 模式下、它必须是 CRC 错误、spruh73p、表4_32)。 当我编写以下代码时、另一种奇怪的情况会出现:
RX_DATA =_R31; // Rx_data = 0x1000000;//如果我不注释此行,程序将继续工作,否则在“if condition”之后挂起 I f (Rx_DATA = 0x1000000) CT_SHAREMDMEM.mem[3]= 0x2; 否则 CT_SHAREMDMEM.mem[3]= 0x1; _DELAY_CYCLES (400); CT_SHAREMDMEM.mem[4]= 0x55;//此行仅在未注释行“RX_DATA = 0x1000000;”时起作用
我不明白为何挂机。 我尝试使用不同的优化标志进行编译。 O0不工作、O1、O2 -无差异。
那么、问题出在哪里呢? 我会:
- 内部 PRU 引脚多路复用
- 全局引脚多路复用
- 设置 PRU_MII_RT 寄存器
- 设置 PRU_CFG 寄存器
- 使用 PRU_MII_RT 正确发送数据包
- 在 MII_Rx 引脚上获取正确的信号(使用示波器查看)
- 请参阅、在 PRU_MII_RT_PRS0寄存器_pr1_mii0_crs 的当前状态= 0x1 (如果我在周期中发送数据)
- 无法读取任何有关数据包的信息(非数据、非状态)、始终读取0x1000000 (1<<24)。
- 我尝试重置 Rx (1<<18命令)、RX_POP16 (1<<17命令)




