工具与软件:
尊敬的 TI 支持团队:
我正在处理一个涉及将 DP83869以太网 PHY 与 MSP432P401R LaunchPad 连接的项目。 我在尝试读取 PHY 地址(始终接收"FFFFFFFF"作为输出)时遇到问题。 以下是我的设置和到目前为止已执行的步骤的详细信息:
硬件配置:
- 以太网 PHY: DP83869
- 微控制器: MSP432P401R
- 开发板: MSP432P401R LaunchPad
连接:
- DP83869通过 MII/MDIO 接口连接到 MSP432P401R。
- MDIO 连接到 MSP432P401R 上的 P2.7。
- MDC 连接到 MSP432P401R 上的 P2.6。
- 电源和接地连接已正确建立。
软件配置:
- 使用 TI 的 MSP432P401R 驱动程序库。
- 根据数据表要求配置 MDIO 和 MDC 引脚。
- 尝试读取 PHY 标识符寄存器来确定 PHY 地址。
问题描述:
- 当读取 PHY 标识符寄存器时、我持续接收到"FFFFFFFF"作为输出。
- 我已经验证了连接并确保 MDIO 和 MDC 信号设置正确。
采取的步骤:
- 使用 TI 驱动程序库函数初始化 MII/MDIO 接口。
- 根据初始假设将 PHY 地址配置为0x01。
- 尝试读取 PHY 标识符寄存器(具体来说是寄存器0x02和0x03)。
- 一直从 PHY 标识符寄存器接收"FFFFFFFF"作为响应。
具体问题:
- 您能否确认读取 DP83869的 PHY 标识符寄存器的正确过程?
- DP83869是否需要任何特定的初始化步骤或配置才能正确响应 MDIO 读取请求?
- 您能否提供专门用于连接 DP83869和 MSP432P401R 的任何示例代码或应用说明?
- 与 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;
}
感谢您的帮助。 我期待得到你关于解决这个问题的指导。