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.

[参考译文] 编译器/ BEAGLEBK:PRU MII 接收

Guru**** 2604225 points
Other Parts Discussed in Thread: AM3358

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/648350/compiler-beaglebk-pru-mii-receive

器件型号: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 -无差异。

 

那么、问题出在哪里呢? 我会:

  1. 内部 PRU 引脚多路复用
  2. 全局引脚多路复用
  3. 设置 PRU_MII_RT 寄存器
  4. 设置 PRU_CFG 寄存器
  5. 使用 PRU_MII_RT 正确发送数据包
  6. 在 MII_Rx 引脚上获取正确的信号(使用示波器查看)
  7. 请参阅、在 PRU_MII_RT_PRS0寄存器_pr1_mii0_crs 的当前状态= 0x1 (如果我在周期中发送数据)
  8. 无法读取任何有关数据包的信息(非数据、非状态)、始终读取0x1000000 (1<<24)。
  9. 我尝试重置 Rx (1<<18命令)、RX_POP16 (1<<17命令)

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    软件团队已收到通知。 他们将在这里作出回应。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Alex:

    >>不能读取有关数据包的任何信息(不能读取数据,不能读取状态),始终读取0x1000000 (1<<24)。
    因此、在将 Rx_DATA 存储到 CT_SHAREMDMEM.MEM[1]之前、实际上不会接收到任何数据包、对吧? 或者、您是否仅在 RX_POP16之后将 R31读取为0x1000000 (1<<24)? 由于 R31中的 RX_EOF 位未置位、因此位24 ERROR_CRC 无效。

    您是否尝试读取 pinmux 控制模块寄存器以查看 PRUCapePinmux()是否按预期写入? 正如您在 MII_RxD[0-3]上看到的、这些引脚似乎没有正确复用。
    MII_Rx_LINK 信号无需连接、通常用于快速链路检测、该检测使用 LED 状态而不是 MDIO 内部状态机。

    此致、
    Garrett

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

    大家好、Garrett! 感谢您的回复!

    >>或者您是否仅在 RX_POP16之后将 R31读取为0x1000000 (1<<24)?

    无论 是否执行 I RX_POP16命令、当 GPI 处于 MII 模式时、我始终读取0x1000000 (1<<24)。 如果我更改 GPI 模式、我将读取0x0。

    >>您是否尝试读取 pinmux 控制模块寄存器以查看 PRUCapePinmux()是否按预期写入?

    在 PRUCapePinmux()之后,我读取控制模块并获得全部正确的值:

    CONTRAL_CONF_LCD_DATA (8)_Rx_DATA 模式= 2D //模式5、输入

    CONTRAL_CONF_LCD_DATA (9)_Rx_DATA 模式= 2D //模式5、输入

    CONTRAL_CONF_LCD_DATA (10)_Rx_DATA 模式= 2D //模式5、输入

    CONTRAL_CONF_LCD_DATA (11)_Rx_DATA 模式= 2D //模式5、输入

    CONTRAL_CONF_LCD_DATA (13)_Rx_ER MODE = 2D //模式5、输入

    CONTRAL_CONF_LCD_DATA (15)_Rx_Dv MODE = 2D //模式5、输入

    CONTROL_CONF_LCD_PCLK_crs = 2a //模式2、输入

    CONTRAL_CONF_LCD_DATA (14)_Rx_clk = 2D //模式5、输入

    >>正如您在 MII_RxD[0-3]上看到的信号一样,这些引脚似乎没有正确复用。

    为什么? 我尝试读取的是外部信号。 我尝试了几种方法(结果相同):

    1.send 使用 PHY (Lan8710、Microchip)从 PC 打包到 BBB。 这种方法很可能是因为我使用的是原型板、并且获得了大量的噪声、而不是真实的信号。

    2.将 Rx<->TX 连接到 PHY 芯片内(环路模式)、以便 TX 信号传输到 Rx。 噪声更低、信号看起来不错。

    3.将 Rx<->TX (TX_DATA[i]> Rx_DATA[i];TX_en > Rx_dv;时钟(从 clocout2输出为25MHz)连接到 Rx_clk 和 TX_clk、尝试连接 TX_en > crs 和 TX_en > Rx_er (我想在 R31 reg 上查看错误状态)(请在原型设计电路板上查看照片)。 信号很好、噪声很低。

    每次我看到 RX_dv 信号从低电平变为高电平、这意味着(正如我所理解的) MII_RT 模块接收数据包。 (在此期间、PRS0_pr1_mii0_crs 状态位也指示"1")。

    我的想法是、误差可能在以下方面:

    可能是当我将 TX 连接到 Rx 时、MII_RT 模块获得错误的数据包结构并且无法解析它? 有可能吗? 或者不是?

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

    您的分析是有道理的。 那么、您是否尝试更新下面的 Tx 代码以包括7个八位位组0x55前导码和1个八位位组 SFD 0xD5? RXERR0/1寄存器是什么样的?

    对于(i=0;i<50;i++)//发送包起始

    _R30 = 0xFFFFFF0000|0x7755;// 0x7755 -数据
    _R31 =(1<<25);//推入 MII TX


    此外、您是否能够注入来自外部流量发生器的数据包以查看是否可以接收到任何数据包?

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

    Garrett、  

    当我将 BBB 连接到 PC (或任何以太网设备:交换机、集线器、定制板)时、我会得到很多短假数据包(我看一下 MII_rxdv、它有时会很高、大约为200ns -只有5个周期)。 即使 PC (或其他设备)确实没有发送数据包(也没有 ARP 请求)、我也会收到这些数据包。 我想这是由噪声引起的错误(原型板不适合以太网)。 但有时在 RXERR0上、我可以读取一些错误(通常为0xF)。   由于噪声、很难重复此实验。

    现在、当我将 MII_TX[i]直接连接到 MII_RX[i]等时、我总是在  RXERR0\1处读取0x0。 我尝试添加序言和 SFD。 我不确定半字节内的半字节和位的顺序、因此我尝试了不同的情况:0x555d、0x55d5、0xaaab、0xaaba、0xd555等(8种情况)。 没有任何结果。 我可以看到前置放大器和 SFD 是可以的:

    我的最后一个代码:

    /* MII_loopback */
    
    _R31 =(1<<18);//rx_reset
    
    
    _DELAY_CYCLES (400);
    
    
    volatile int h = 0x80;
    volatile int i;
    
    
    _R30 = 0xFFFFFF0000|0x5555;//前导码1、2个八位位组
    _R31 =(1<<25);//推入 MII TX
    
    _R30 = 0xFFFFFF00|0x5555;//前导码3、4个八位位组
    _R31 =(1<<25);//推入 MII TX
    
    _R30 = 0xFFFFFF0000|0x5555;//前导码5、6个八位位组
    _R31 =(1<<25);//推入 MII TX
    
    _R30 = 0xFFFFFF0000|0x55d5;//前导码7八位位组+ SFD
    _R31 =(1<<25);//推入 MII TX
    
    (i=0;i<40;i++)
    {
    _R30 = 0xFFFFFF0000|0xABB;//pack 数据
    _R31 =(1<<25);//push to the MII TX
    }
    
    _R30 = 0xFFFFFF0001;//数据包
    _R31 =(1<<25)|(1<<29);//推入 MII TX
    
    __delay_cycles (4000);//尝试使用此行和不使用
    
    对于(i=0;i<200;i++)
    {
    RX_DATA =_R31;
    _R31 =(1<<17);//rx_pop16
    _DELAY_CYCLES (10);
    如果(I == 85)
    CT_SHAREMDMEM.mem[i]= 0x67;//用于控制读取数据
    否则 CT_SHAREMDMEM.mem[i]= Rx_data;
    }
    while (1); 

    因此,最后,我认为如果我购买这个电路板  ,这个代码是可行的:。  

    但我只能在1月或2月购买。 您认为没有电池组的情况是什么? 为什么它不能得到前导码和 SFD 的包?

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

    我同意您应尝试在 AM335x IDK 生产板上运行代码以缓解任何硬件问题。 如果代码在 IDK 上也不起作用、我们仍然会错过任何应该很微妙的东西。

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

    大家好、 Garrett!

    感谢您的回复!

    如果  1月份我将遇到 AM335x IDK 的任何问题、我必须在此处写入、而不是创建新问题?

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

    除非您在 AM335x IDK 上遇到的问题与 PRU MII 无关、否则这两种方法都是可以的。

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

    如果有必要、我稍后会在这里写下、或者将问题标记为已解决!

    此致、Alex