tlk110驱动的问题
各位:
现在正在调试TLK110芯片,目前通过MDIO读取TLK110的PHY ID已经成功。读取的0x02值为0x2000,读取的0x03值为0xA211,按照这个值,应该说明通过mdio读取TLK110寄存器的值是正确的。
目前的问题是写入TLK110寄存器的值失败,比如想将0x00寄存器写为0x3300,可是写入后,再次读出0x00寄存器值还是芯片复位后的初始值0x3100。参考tlk110的数据手册Page14页,有提到初始化的时候需要写入0x09、0x0A和0x0B寄存器。哪里可以查到详细的tlk110的寄存器配置值或者详细的参考代码。谢谢
0xA211
您好,
还请详细检查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进入高阻状态。
您好
使用示波器察看了,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 |
|
您好:
下面是我的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);