各位:
现在正在调试TLK110芯片,目前通过MDIO读取TLK110的PHY ID已经成功。读取的0x02值为0x2000,读取的0x03值为0xA211,按照这个值,应该说明通过mdio读取TLK110寄存器的值是正确的。
目前的问题是写入TLK110寄存器的值失败,比如想将0x00寄存器写为0x3300,可是写入后,再次读出0x00寄存器值还是芯片复位后的初始值0x3100。参考tlk110的数据手册Page14页,有提到初始化的时候需要写入0x09、0x0A和0x0B寄存器。哪里可以查到详细的tlk110的寄存器配置值或者详细的参考代码。谢谢
Robin Liu:
您好,
还请详细检查MDIO写入时序是否正确。
MDIO是管理数据的输入输出双向接口,数据是与MDC时钟同步的。MDIO 的工作流程为:
1、MDIO接口在没有传输数据的空闲状态(IDLE)数据线MDIO处于高阻状态。
2、MDIO出现一个2bit的开始标识码(01)一个读/写操作开始
3、MDIO出现一个2bit数据来标识是读操作(10)还是写操作(01)
4、MDIO出现一个5bit数据标识PHY的地址
5、MDIO出现一个5bit数据标识PHY寄存器的地址
6、MDIO需要2个时钟的访问时间
7、MDIO串行读出/写入16bit的寄存器数据
8、MDIO恢复成IDLE状态,同时MDIO进入高阻状态。
Yi Zhou3:
回复 Robin Liu:
您好
使用示波器察看了,MDIO写入的时序正确的。我参考的代码是ti网站上提供的“TLK110 示例代码”。
按照tlk110数据手册Page14的说明。tlk110寄存器0x09、0x0A和0x0B的值应该设置多少?谢谢。
以下是dump出的tlk110寄存器的值,请帮忙看看是否有问题。
0x00
0x3100
参考p43
0x01
0x7849
0x03
0x2000
0x03
0xA211
0x04
0x01E1
0x05
0x0000
0x06
0x04
0x07
0x2991
0x08
0x0000
0x09
0x7C00
0x0A
0x0104
0x0B
0x0000
0x0D
0x0000
0x0E
0x0000
0x10
0x1002
0x11
0X0108
0x12
0x0000
0x13
0x0A00
0x14
0x0000
0x15
0x0000
0x16
0x0100
0x17
0x0001
0x18
0x0400
0x19
0x8021
0x1A
0x0010
0x1B
0x007D
0x1C
0x05EE
0x1E
0x0102
0x42
0x2000
0xAE
0x0000
0xD0
0x0002
0x155
0x0000
0x170
0x0002
0x171
0x0108
Yi Zhou3:
回复 Robin Liu:
您好:
下面是我的tlk110初始化代码。这样初始化是否有问题。
/*#1#,TLK110硬件复位,通过Reset脚*/ HAL_GPIO_WritePin(GPIOA, GPIO_PIN_11, GPIO_PIN_SET); HAL_Delay(5); HAL_GPIO_WritePin(GPIOA, GPIO_PIN_11, GPIO_PIN_RESET); HAL_Delay(5); HAL_GPIO_WritePin(GPIOA, GPIO_PIN_11, GPIO_PIN_SET);
/*#2#,TLK110软件复位,通过写寄存器*/
if (HAL_OK != (HAL_ETH_WritePHYRegister(s_pEth, BMCR, 0x8000))) //0x00
{ return HAL_ERROR; } if (HAL_OK != (HAL_ETH_WritePHYRegister(s_pEth, PDR, 0xC000))) //0x1F { return HAL_ERROR; }
/* Delay to assure PHY reset */ HAL_Delay(PHY_RESET_DELAY);
/*#3#,确认PHY ID。通过读取寄存器02和03*/
HAL_ETH_ReadPHYRegister(s_pEth, 0x02, &phyreg);HAL_ETH_ReadPHYRegister(s_pEth, 0x03, &phyreg);
/*#4#,写寄存器0x09*/
HAL_ETH_WritePHYRegister(s_pEth, SWSCR1, DEFAULT_STRAP_CONFIG | SW_STRAP_CONFIG_DONE); HAL_Delay(10);