对网络物理层芯片LAN8720A的复位信号(复位引脚nRST)的详细分析(顺便也介绍下其软复位的操作和导常情况解决方法)
芯片(LAN8720A)的Data sheet的百度网盘下载地址
https://pan.baidu.com/s/1ZCVbzF2QH1SYCKOtnvSUWg?pwd=7i7a
Data sheet中与复位信号有关的描述
各时间持续值的详细解释
在看下面的解释前,你首先要知道什么叫“信号的断言”,什么叫信号的“去断言”,关于这两个问题请参考我的另一篇博文:
https://blog.csdn.net/wenhao_ir/article/details/145749235
-
tpurstd(External power supplies at 80% to nRST deassertion):
- 含义:此字段表示外部电源供应达到其标称值的80%到nRST信号去断言之间的时间。
- 时间:最小值为 25 毫秒(ms)。
- 作用:这段时间确保外部电源稳压到足够的电压后,再进行nRST信号的去断言,确保电源状态稳定。其实从图中来看,这段时间也是整个复位过程需要持续的最短时间,u-boot的设备树文件中的字段
phy-reset-duration
的值通常就设为这个值的最少+1,比如在这里我们就可以把u-boot的设备树文件中的字段phy-reset-duration
的值设为26毫秒。
-
tpurstv(External power supplies at 80% to nRST valid):
- 含义:此字段表示外部电源供应达到其标称值的80%到nRST信号断言之间的时间。
- 时间:最小值为 0 纳秒(ns)。
- 作用:这意味着nRST信号可以在电源达到80%时立即进行断言(即变为有效),确保电源的电压稳定之后即可断言nRST信号。
-
trstia(nRST input assertion time):
- 含义:此字段表示nRST信号被输入端断言(拉低)后,必须保持的时间。
- 时间:最小值为 100 微秒(µs)。
- 作用:为了确保nRST复位过程生效,nRST信号必须保持100微秒的低电平。所以,驱动程序中对于复位信号的低电平保持时间至少应该为100微秒,建议留点余量设置为120微秒,比如如果我们设置某个GPIO口产生这个信号,那么这个GPIO从高电平转到低电平后,应该保持至少100微秒的时间,建议保持120微秒的时间。
-
tcss(Configuration strap pins setup to nRST deassertion):
- 含义:此字段表示设备复位信号有效期间,必须保持nRST信号的稳定状态时间,以确保芯片其它的配置引脚能够正确地读取配置值。全名中的单词
strap
我曾专门写了博文介绍,详见https://blog.csdn.net/wenhao_ir/article/details/145712197 - 时间:最小值为 200 纳秒(ns)。
- 含义:此字段表示设备复位信号有效期间,必须保持nRST信号的稳定状态时间,以确保芯片其它的配置引脚能够正确地读取配置值。全名中的单词
-
tcsh(Configuration strap pins hold after nRST deassertion):
- 含义:此字段表示芯片的其它配置引脚如需正确读取配置,那么在nRST信号去断言之后应该保持的时间。全名中的单词
strap
我曾专门写了博文介绍,详见https://blog.csdn.net/wenhao_ir/article/details/145712197 - 时间:最小值为 1 纳秒(ns)。
- 含义:此字段表示芯片的其它配置引脚如需正确读取配置,那么在nRST信号去断言之后应该保持的时间。全名中的单词
-
totaa(Output tri-state after nRST assertion):
- 含义:此字段表示nRST信号被断言后,芯片中的那些输出引脚进入Output Tri-state(高阻抗状态)的时间。这种高阻抗状态意味着这些引脚不会驱动任何信号,也不会对外部电路产生影响。如果这些引脚在复位期间不保持高阻抗状态,可能会输出不稳定或无效的信号,这会对系统中的其他设备或总线产生干扰,甚至可能导致硬件冲突或系统不稳定。
- 时间:最大值为 50 纳秒(ns),注意:这个是最大值,不是最小值。
-
todad(Output drive after nRST deassertion):
- 含义:此字段表示nRST信号去断言后,输出引脚进入Output Drive(驱动模式)的时间。
- 时间:最小值为 2 纳秒(ns),最大值为 800 纳秒(ns)。
- 作用:nRST去除后,输出引脚需要经过一个恢复时间,才能恢复正常工作状态,确保芯片处于稳定状态。
Data sheet中的两个Note的解释
这两段话是对nRST信号复位过程的补充说明,解释了nRST信号断言和配置引脚的行为。下面是每段的具体解释:
- nRST deassertion must be monotonic
- 解释:nRST信号的去断言(从低电平恢复到高电平)必须是单调的。也就是说,nRST信号的上升沿应该是平稳的,不得有反复的高低变化或不稳定的状态。
- 原因:这一要求是为了确保复位过程的可靠性。如果nRST信号不稳定,可能会导致设备无法正确复位,或者配置引脚的状态可能受到干扰,导致系统工作不正常。
- Device configuration straps are latched as a result of nRST assertion. Refer to Section 3.7, “Configuration Straps,” on page 31 for details. Configuration straps must only be pulled high or low and must not be driven as inputs.
- 解释:设备(这里指芯片)的配置引脚(Configuration Straps)会在nRST信号断言期间被锁存。即当nRST信号有效(拉低)时,配置引脚的状态会被锁存下来,并且这些引脚的状态将在复位之后持续保持。
- 进一步说明:配置引脚应该只被拉高或拉低,不能被驱动成输入状态。这意味着这些引脚只能通过外部电路来强制拉高或拉低,不应允许通过芯片本身驱动(设置为输入)去改变它们的状态。
- 原因:这种要求是为了保证配置引脚在系统复位时稳定可靠的状态。配置引脚的状态会影响芯片的配置,设置不当可能会导致芯片无法正常工作或无法通过正确的配置启动。
物理层芯片LAN8720A的软复位操作
39页的相关内容截图如下:
这段话描述了如何通过软件触发 LAN8720A 物理层芯片的复位操作,并详细说明了复位过程中的一些关键点。让我们逐步解析:
-
“A Software reset is activated by setting the Soft Reset bit of the Basic Control Register to ‘1’.”
- 软复位 是通过设置 基本控制寄存器(Basic Control Register, MII_BMCR) 中的 Soft Reset位 来触发的。
- Soft Reset bit 是 MII_BMCR 寄存器中的一个特定位,设置为
1
时会触发复位。
-
“All registers bits, except those indicated as ‘NASR’ in the register definitions, are cleared by a Software reset.”
- 执行软复位时,芯片的所有寄存器位(除了被标记为 “NASR” 的寄存器位)都会被清零。
- NASR(Non-Addressed Software Reset)是指某些寄存器位在软复位过程中不会被清除,通常是因为它们用于保持特定的状态或信息。
-
“The Soft Reset bit is self-clearing.”
- Soft Reset位 是 自动清除 的。一旦设置为
1
,芯片会开始复位过程,并在复位完成后自动将该位清除为0
。无需外部干预,芯片会自己管理该位的状态。
- Soft Reset位 是 自动清除 的。一旦设置为
-
“Per the IEEE 802.3u standard, clause 22 (22.2.4.1.1) the reset process will be completed within 0.5s from the setting of this bit.”
- 根据 IEEE 802.3u 标准,第 22 条第 22.2.4.1.1 小节规定,软复位过程必须在 0.5秒 内完成。
- 这意味着从设置 Soft Reset位 为
1
开始,芯片的复位过程将在 0.5秒 内完成,复位期间,芯片可能无法正常工作,复位后所有寄存器的状态会恢复到初始化状态。
总结:
- 软复位触发:通过设置 MII_BMCR 寄存器中的 Soft Reset位 为
1
。 - 复位清除:所有寄存器位(除了 NASR 位)会被清除。
- 自动清除:复位位会在复位完成后自动清除。
- 复位时间:根据标准,复位过程必须在 0.5 秒内完成。
复位的控制具体是Basic Control Register
中的哪一位呢,物理层芯片LAN8720A的Data sheet的第49页
有相关内容截图如下:
上图中红框中的话解释如下:
这段话描述了 LAN8720A 物理层芯片 软复位 操作的具体控制寄存器设置。下面是对每个部分的逐一解释:
-
“1 = software reset. Bit is self-clearing.”
- “1 = software reset”:当控制寄存器中的复位位被设置为
1
时,触发 软复位 操作。也就是说,将此位设为1
会开始软复位过程。 - “Bit is self-clearing”:这个位是 自动清除 的。也就是说,当软复位过程完成后,芯片会自动将该位清除为
0
。无需外部设备手动清除这个位,芯片会自动管理复位状态。
- “1 = software reset”:当控制寄存器中的复位位被设置为
-
“When setting this bit do not set other bits in this register.”
- 这段话提醒在设置软复位位时,不要同时修改控制寄存器中的其他位。
- 设置软复位时,只能将复位位设置为
1
,而 其他寄存器位必须保持不变。如果同时修改其他位,可能会导致无法正确触发复位,或者会干扰复位操作。
-
“The configuration (as described in Section 3.7.2, ‘MODE[2:0]: Mode Configuration,’ on page 31) is set from the register bit values, and not from the mode pins.”
- 这段话指明,软复位时芯片的 工作模式 是通过 控制寄存器的位 来配置的,而不是通过外部的 模式引脚(mode pins) 来设置的。
- 在文档的第 3.7.2 节,描述了如何通过设置控制寄存器中的 MODE[2:0] 位来配置芯片的工作模式(例如:以不同的传输模式工作)。
- 这里的重点是,软复位后芯片工作模式的设置是通过 寄存器位配置 完成的,而非通过 外部模式引脚,这意味着软复位后,寄存器的配置值决定了芯片的运行模式,而不受外部硬件引脚状态的影响。
总结:
- 软复位 是通过控制寄存器中的 复位位 设置为
1
来触发的。该位在复位完成后会自动清除。 - 在设置复位位时,不应该同时修改寄存器中的其他位。
- 软复位后芯片的 工作模式 是通过 寄存器配置位 设置的,而不是由 外部模式引脚(如
MODE[2:0]
)决定的。
软复位操作中存在的异常情况及解决方法
按照上一个标题中的介绍,理想情况下,当控制寄存器中的复位位被设置为 1
时,触发 软复位 操作,软复位完成后,复位位会被清零,但有时会出现下面这些异常情况使得复位位一直得不到清零:
①明明软复位完成了,但复位位没被清零,这就导致我们的程序一直认为软复位没有完成。
②软复位过程中出现某种异常,使得复位无法顺利完成。
解决这些异常的方法是:我们在等待复位完成的时候,每隔一小段时间(例如 1 毫秒),就去再写一次复位控制位为1,这样,当芯片处于正常复位状态时,它不会重新开始复位,而是会继续进行复位操作;而当芯片出现上面提到的异常情况而导致复位位一直为1时,此时如果要再写一次复位控制位为1,它就会重新进行一次复位操作,这次复位操作如果没有出现异常,复位位就会清零。通过这样的方法,就解决了这些异常。
一个示例代码如下:
int rc;
do{
phy_write(phydev, MDIO_DEVAD_NONE, MII_BMCR, BMCR_RESET);
udelay(1000);
rc=phy_read(phydev, MDIO_DEVAD_NONE, MII_BMCR);
udelay(1000);
}while(rc&BMCR_RESET);
代码解释如下:
phy_write(phydev, MDIO_DEVAD_NONE, MII_BMCR, BMCR_RESET);
phy_write()
:这是一个写操作函数,用来向PHY寄存器写数据。在这里,它写入BMCR_RESET
到MII_BMCR
寄存器。MII_BMCR
:这是PHY的 Basic Control Register(基本控制寄存器),用于控制PHY的各种基本功能。BMCR_RESET
:这是一个位掩码,通常为0x8000
【因为LAN8720A的复位控制位为第15位,所以这里应该是0x8000
】,它在MII_BMCR
寄存器中设置复位命令。写入此值会触发PHY的软件复位。
udelay(1000);
udelay()
:这是一个延时函数,单位为微秒(μs)。它会导致程序暂停指定的时间。在这行代码中,udelay(1000)
表示等待 1000 微秒,以避免频繁地去执行while循环中的其它语句。
rc = phy_read(phydev, MDIO_DEVAD_NONE, MII_BMCR);
phy_read()
:这是一个读取操作函数,用来从PHY寄存器读取数据。在这里,它从MII_BMCR
寄存器读取当前的值。- 该函数返回
MII_BMCR
寄存器的内容,rc
会存储该值。通过读取该寄存器,程序可以检查PHY的复位是否已完成。
udelay(1000);
- 在读取
MII_BMCR
寄存器后,再次调用udelay(1000)
来等待 1000 微秒,以避免频繁地去执行while循环中的其它语句。
while (rc & BMCR_RESET);
while (rc & BMCR_RESET);
:这个while
循环会持续执行,直到MII_BMCR
寄存器中的BMCR_RESET
位被清除,即PHY的复位过程完成。BMCR_RESET
位在MII_BMCR
寄存器中表示复位是否正在进行。只要该位仍然为1
,复位操作尚未完成,程序就会继续循环等待,直到该位为0
,表示复位已完成。/- 由于循环体的不断重复执行,则每隔一段时间( 1000 微秒),程序再次写入复位位(BMCR_RESET)。如果芯片复位正常,它不会重新开始复位,而是保持当前复位状态;如果出现异常导致复位位没有被清除,强制写入复位位会让芯片重新开始复位。通过这种方式,确保复位过程在任何情况下都会被正确执行,并且复位位最终会被清零。