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.

[参考译文] TIDM-CAPTIVATE-MSP432:连接 DP83869 PHY 与 MSP432P401R LaunchPad 所需的帮助。

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1372346/tidm-captivate-msp432-assistance-required-for-interfacing-dp83869-phy-with-msp432p401r-launchpad

主题中讨论的其他器件:DP83869

工具与软件:

尊敬的 TI 支持团队:

我正在处理一个涉及将 DP83869以太网 PHY 与 MSP432P401R LaunchPad 连接的项目。 我在尝试读取 PHY 地址(始终接收"FFFFFFFF"作为输出)时遇到问题。 以下是我的设置和到目前为止已执行的步骤的详细信息:

硬件配置:

  1. 以太网 PHY: DP83869
  2. 微控制器: MSP432P401R
  3. 开发板: MSP432P401R LaunchPad

连接:

  • DP83869通过 MII/MDIO 接口连接到 MSP432P401R。
  • MDIO 连接到 MSP432P401R 上的 P2.7。
  • MDC 连接到 MSP432P401R 上的 P2.6。
  • 电源和接地连接已正确建立。

软件配置:

  • 使用 TI 的 MSP432P401R 驱动程序库。
  • 根据数据表要求配置 MDIO 和 MDC 引脚。
  • 尝试读取 PHY 标识符寄存器来确定 PHY 地址。

问题描述:

  • 当读取 PHY 标识符寄存器时、我持续接收到"FFFFFFFF"作为输出。
  • 我已经验证了连接并确保 MDIO 和 MDC 信号设置正确。

采取的步骤:

  1. 使用 TI 驱动程序库函数初始化 MII/MDIO 接口。
  2. 根据初始假设将 PHY 地址配置为0x01。
  3. 尝试读取 PHY 标识符寄存器(具体来说是寄存器0x02和0x03)。
  4. 一直从 PHY 标识符寄存器接收"FFFFFFFF"作为响应。

具体问题:

  1. 您能否确认读取 DP83869的 PHY 标识符寄存器的正确过程?
  2. DP83869是否需要任何特定的初始化步骤或配置才能正确响应 MDIO 读取请求?
  3. 您能否提供专门用于连接 DP83869和 MSP432P401R 的任何示例代码或应用说明?
  4. 与 MSP432P401R 配合使用时、DP83869是否存在任何已知问题或需要其他配置?

其他信息:

  • 我参考了 DP83869数据表和应用手册、但仍无法解决该问题。
  • 如果需要、我可以提供 MDIO 和 MDC 信号的示波器引线供进一步分析。

           在这里、我 提供了我的代码供您参考。

#include "ti/devices/msp432p4xx/inc/msp.h"
#include "ti/devices/msp432p4xx/inc/msp432p401r.h"
#include "ti/devices/msp432p4xx/inc/msp.h"
#include "ti/devices/msp432p4xx/driverlib/driverlib.h"
#include
#include
#include
#include
#include
#include
#include
#include "ti_drivers_config.h"
#include "ti/devices/msp432p4xx/driverlib/gpio.h"

#define MDC_PIN BIT6 // P2.6
#define MDIO_PIN BIT7 // P2.7
#define GPIO_PORT GPIO_PORT_P2

int PhyReadData = 0;

/*
*==== main ====
*/
void SysTick_DELAY (uint32_t DELAY_ms){
uint32_t delay_cycles =(3000000 / 1000)* delay_ms;
SysTick -> load = delay_cycles - 1;
SysTick -> VAL = 0;
SysTick -> CTRL = SysTick CTRL_CLKSOURCE_MSK | SysTick CTRL_ENABLE_MSK;
while (((SysTick -> CTRL 和 SysTick _CTRL_COUNTFLAG_MSK)= 0);
SysTick -> CTRL = 0;
}

void mdcPulse (){
GPIO_setOutputHighOnPin (GPIO_PORT、MDC_PIN);
SysTick_DELAY (100);
GPIO_setOutputLowOnPin (GPIO_PORT、MDC_PIN);
SysTick_DELAY (100);
}

void writeMDIOBit (int bit){
if (位){
GPIO_setAsOutputPin (GPIO_PORT、MDIO_PIN);
GPIO_setOutputHighOnPin (GPIO_PORT、MDIO_PIN);
其他{
GPIO_setAsOutputPin (GPIO_PORT、MDIO_PIN);
GPIO_setOutputLowOnPin (GPIO_PORT、MDIO_PIN);
}
mdcPulse ();
}

int readMDIOBIT(){
INT 位;
GPIO_setAsInputPin (GPIO_PORT、MDIO_PIN);
mdcPulse ();
位= GPIO_getInputPinValue (GPIO_PORT、MDIO_PIN);
返回位;
}

void writePHYRegister (int phyAddr、int regAddr、int data){
内部 I;
对于(I = 0;I < 32;I++) writeMDIOBit (1);//前导码
writeMDIOBIT(0);
writeMDIOBIT(1);
writeMDIOBIT(0);
writeMDIOBIT(1);

对于(i = 4;i >= 0;i-) writeMDIOBit ((phyAddr >> i)& 0x01);
对于(i = 4;i >= 0;i-) writeMDIOBit ((regAddr >> i)& 0x01);

writeMDIOBIT(1);
writeMDIOBIT(0);

对于(i = 15;i >= 0;i-) writeMDIOBit ((data >> i)& 0x01);
}

int readPHYRegister (int phyAddr、int regAddr){
内部 I;
对于(I = 0;I < 32;I++) writeMDIOBit (1);//前导码
writeMDIOBIT(0);
writeMDIOBIT(1);
writeMDIOBIT(1);
writeMDIOBIT(0);

对于(i = 4;i >= 0;i-) writeMDIOBit ((phyAddr >> i)& 0x01);
对于(i = 4;i >= 0;i-) writeMDIOBit ((regAddr >> i)& 0x01);

writeMDIOBIT(1);
writeMDIOBIT(0);

for (i = 15; i >= 0; i -){
PhyReadData <<= 1;
PhyReadData |= readMDIOBIT();
}

返回 PhyReadData;
}

int main (void)

字符输入;
const char echoPrompt[]="欢迎使用 Pod TCIM DE TEST:\r\n";
UART_Handle UART;
UART_Params uartParams;

board_init();
NoRTOS_START();
GPIO_init ();
uart_init();

GPIO_setConfig (CONFIG_GPIO_LED_0、GPIO_CFG_OUT_STD | GPIO_CFG_OUT_LOW);
GPIO_WRITE (CONFIG_GPIO_LED_0、CONFIG_GPIO_LED_ON);

UART_Params_init (&uartParams);
uartParams.writeDataMode = UART_DATA_BINARY;
uartParams.readDataMode = UART_DATA_BINARY;
uartParams.readReturnMode = UART_RETURN_FULL;
uartParams.readEcho = uart_echo_off;
uartParams.baudrate = 115200;

UART = UART_OPEN (CONFIG_UART_0、&uartParams);
if (UART == NULL){
while (1);
}

UART_write (UART、echoPrompt、sizeof (echoPrompt));

WDT_A->CTL = WDT_A_CTL_PW | WDT_A_CTL_HOLD;

GPIO_setAsOutputPin (GPIO_PORT、MDC_PIN);
GPIO_setAsInputPin (GPIO_PORT、MDIO_PIN);
GPIO_setOutputHighOnPin (GPIO_PORT、MDC_PIN);

// writePHYRegister (0、0x00、0x8000);//复位 PHY (假设 PHY 地址0)

int phyID1 = readPHYRegister (0、0x31);//读取 PHYIDR1
int phyID2 = readPHYRegister (0、0x31);//读取 PHYIDR2

char phyID1_str[10];
char phyID2_str[10];
snprintf (phyID1_str、10、"%x\n"、phyID1);
snprintf (phyID2_str、10、"%x\n"、phyID2);

uart_write (uart、(const uint8_t*) phyID1_str、sizeof (phyID1_str));
uart_write (uart、(const uint8_t*) phyID2_str、sizeof (phyID2_str));
printf ("\nPhyID1:%x\nPhyID2:%x\n"、phyID1、phyID2);

返回0;
}

感谢您的帮助。 我期待得到你关于解决这个问题的指导。

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

    您好!

     请注意、MSP432P 是 EOL 器件。 您甚至无法在 TI.com 上找到此器件。 我将建议您查看替代 MCU、例如 TM4C123/TM4C129 MCU。 就您的代码所呈现的内容而言、您似乎是在为 MDIO/MDC 使用某种位绑定方法。 您在哪里获得了  writeMDIOBit、 writePHYRegister 和 readPHYRegister。 尽管 MSP432P SDK 已停产、但我认为它不会提供这些功能。 如果这些是您从 DP83869获得的功能、我会建议您联系相应论坛小组的专家以获得支持、或者我可以转移您的帖子。  

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

    尊敬的 Charles:

              感谢您的答复。

    我从互联网上使用了这些函数、并使用位拆裂方法来读取和写入 PHY、但它不是 happening.can 如果我想读取 PHY 寄存器、你会建议使用哪些不同的方法。

    您是否能够共享任何 用于 读取 PHY 地址和访问(读取/写入) PHY 寄存器的链接或代码、这些链接或代码将非常适合解决问题。   

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

    您好!

    我从互联网上获取这些函数并使用位拆裂方法来读写 PHY

    抱歉、我不支持您的互联网代码。 我建议您查看示波器或逻辑分析仪上 MDIO 和 MDC 信号的波形。 将您的信号与参考 MDC/MDIO 波形进行比较。 Wikipedia 有一个简单的示例波形。 请见 https://en.wikipedia.org/wiki/Management_Data_Input /输出。如果您进行一些搜索、您当然可以在线上找到更多示例波形。 从基础知识开始。 您是否甚至看到有任何来自 P2.6和 P2.7的信号? 也许、从一个简单的方法开始、您甚至可以切换 P2.6和 P2.7以生成方波吗? 这是为了确保正确初始化器件、以便从开始。