I.MXRT内部集成多路串口,两路高速的USB(PHY内置),大容量的RAM,以及双路以太网,大屏幕LCD显示驱动,适合于各种网关,以及需要多接口连接,HMI等应用场景。在工业现场中需要两路以太网级联的应用可以采用I.MXRT1060。

<ignore_js_op>

11 android 多个以太网设置静态IP 怎么设置两个以太网_引脚

<ignore_js_op>

11 android 多个以太网设置静态IP 怎么设置两个以太网_复用_02



1. 管脚复用以及引脚配置



官方的以太网接口电路图,采用的是KSZ8081的PHY芯片,官方默认的一路以太网使用的配置接口采用RMII模式,如下图所示:

<ignore_js_op>

11 android 多个以太网设置静态IP 怎么设置两个以太网_初始化_03

<ignore_js_op>

11 android 多个以太网设置静态IP 怎么设置两个以太网_初始化_04


当然如果有其他外设的需求,比如需要外扩SDRAM等,MDC和MDIO的引脚可以选择配置为不占用SDRAM外扩总线EMC接口的复用引脚。

 

那么如何配置第二路以太网呢?在配置第二路以太网的时候,为了走线布板方便,有可能会复用BT_CFG8, BT_CFG9和BT_CFG10,以及BT_CFG11引脚。

<ignore_js_op>

11 android 多个以太网设置静态IP 怎么设置两个以太网_初始化_05

BT_CFG8, BT_CFG_9, BT_CFG_10,BT_CFG11这4个引脚配置为第二路以太网的引脚(BT_CFG8作为第二路以太网的TXD0;BT_CFG9作为第二路以太网的TXD1;BT_CFG10作为第二路以太网的TXEN;BT_CFG11作为以太网的TX_CLK)。同时,又作为BOOT的启动引脚,上电复位前,BT_CFG8,BT_CFG_9, BT_CFG_10这3个脚的状态都应该是高电平才能进入QSPI启动模式。



如果在上电前或者是POR引脚处于复位状态时,这几个引脚电平如果是未定状态,例如如果是1.6v,也就是既非高(3.3v的70%以上),也非低电平(3.3v的30%以下)的状态,则系统上电启动会失败。

<ignore_js_op>

11 android 多个以太网设置静态IP 怎么设置两个以太网_引脚_06

其中默认情况下,BT_CFG8, BT_CFG9, BT_CFG10在使用QSPI模式的时候,应该是低电平状态。但是如果使用BT_CFG8, BT_CFG9, BT_CFG10作为复选功能,也就是以太网功能的时候,需要设置为高电平。根据参考手册i.MX RT1060 Processor Reference Manual, Rev. 2 215页的描述,BT_CFG[10], BT_CFG[9], BT_CFG[8]的电平设置应该是111b–QSPIdevice supports 3B read by default (on secondary pinmux option) (command: 0x03,SPI mode)。

<ignore_js_op>

11 android 多个以太网设置静态IP 怎么设置两个以太网_初始化_07

当然也可以通过MCUBootUtility工具将BT_FUSE_SEL写入1,上电的时候就不会判断这几个BOOT引脚的电平状态,直接根据eFUSE的配置,从QSPI启动即可。这种这几个BT_CFG 引脚上电的时候就可以配置为其他的功能口, 而不作为BOOT引脚功能。

<ignore_js_op>

11 android 多个以太网设置静态IP 怎么设置两个以太网_引脚_08

2. SDK中代码的修改



SDK里面提供了丰富的Lwip以太网的参考代码,有基于裸机和基于Freertos的版本。

<ignore_js_op>

11 android 多个以太网设置静态IP 怎么设置两个以太网_复用_09

SDK2.8代码里面只是配置了第一路以太网,如果需要同时使用两路以太网。则配置第二路以太网的方法如下,采用MCU Config Tool来配置管脚,自动生成代码。

<ignore_js_op>

11 android 多个以太网设置静态IP 怎么设置两个以太网_引脚_10

1. IOMUXC_SetPinMux(
2. 
3.       IOMUXC_GPIO_B0_00_ENET2_MDC,/* GPIO_B0_00配置为 ENET2_MDC */
4. 
5.       0U); /* Software Input On Field: InputPath is determined by functionality */
6. 
7. IOMUXC_SetPinMux(
8. 
9.       IOMUXC_GPIO_B0_01_ENET2_MDIO,/*GPIO_B0_01配置为ENET2_MDIO */
10. 
11.       0U);
12. 
13.   IOMUXC_SetPinMux(
14. 
15.       IOMUXC_GPIO_B0_12_ENET2_TDATA00,
16. 
17. /*GPIO_B0_12配置为ENET2_TDATA00 */
18. 
19.       0U);
20. 
21.   IOMUXC_SetPinMux(
22. 
23.       IOMUXC_GPIO_B0_13_ENET2_TDATA01,
24. 
25. /*GPIO_B0_13配置为ENET2_TDATA01 */
26. 
27.       0U);
28. 
29.   IOMUXC_SetPinMux(
30. 
31.       IOMUXC_GPIO_B0_14_ENET2_TX_EN,
32. 
33. /*GPIO_B0_14配置为ENET2_TX_EN */
34. 
35.       0U);
36. 
37.   IOMUXC_SetPinMux(
38. 
39.       IOMUXC_GPIO_B0_15_ENET2_REF_CLK2,      
40. 
41. /*GPIO_B0_15配置为ENET2_REF_CLK2 */
42. 
43.       0x31U);
44. 
45.   IOMUXC_SetPinMux(
46. 
47.       IOMUXC_GPIO_B1_00_ENET2_RX_ER,         
48. 
49. /*GPIO_B1_00配置为ENET2_RX_ER */
50. 
51.       0U);
52. 
53.   IOMUXC_SetPinMux(
54. 
55.       IOMUXC_GPIO_B1_01_ENET2_RDATA00,
56. 
57. /*GPIO_B1_01配置为 ENET2_RDATA00 */
58. 
59.       0U);
60. 
61.   IOMUXC_SetPinMux(
62. 
63.       IOMUXC_GPIO_B1_02_ENET2_RDATA01,
64. 
65. /*GPIO_B1_02配置为 ENET2_RDATA01 */
66. 
67.       0U);
68. 
69.   IOMUXC_SetPinMux(
70. 
71.       IOMUXC_GPIO_B1_03_ENET2_RX_EN,/*GPIO_B1_03配置为ENET2_RX_EN */
72. 
73.       0U);
74. 
75. IOMUXC_SetPinConfig(
76. 
77.       IOMUXC_GPIO_B0_00_ENET2_MDC,/* GPIO_B0_00配置为ENET2_MDC */
78. 
79.       0xB0E9U);
80. 
81.   IOMUXC_SetPinConfig(
82. 
83.       IOMUXC_GPIO_B0_01_ENET2_MDIO,/*GPIO_B0_01配置为ENET2_MDIO */
84. 
85.       0xB829U);
86. 
87.   IOMUXC_SetPinConfig(
88. 
89.       IOMUXC_GPIO_B0_12_ENET2_TDATA00,      
90. 
91. /*GPIO_B0_12配置为ENET2_TDATA00 */
92. 
93.       0xB0E9U);
94. 
95.   IOMUXC_SetPinConfig(
96. 
97.       IOMUXC_GPIO_B0_13_ENET2_TDATA01,      
98. 
99. /* GPIO_B0_13配置为 ENET2_TDATA01 */
100. 
101.       0xB0E9U);
102. 
103.   IOMUXC_SetPinConfig(
104. 
105.       IOMUXC_GPIO_B0_14_ENET2_TX_EN,
106. 
107. /*GPIO_B0_14配置为ENET2_TX_EN */
108. 
109.       0xB0E9U);
110. 
111.   IOMUXC_SetPinConfig(
112. 
113.       IOMUXC_GPIO_B0_15_ENET2_REF_CLK2,
114. 
115. /*GPIO_B0_15配置为 ENET2_REF_CLK2 */
116. 
117.       0xB0E9U);
118. 
119.   IOMUXC_SetPinConfig(
120. 
121.       IOMUXC_GPIO_B1_00_ENET2_RX_ER,
122. 
123. /*GPIO_B1_00配置为ENET2_RX_ER */
124. 
125.       0xB0E9U);
126. 
127.   IOMUXC_SetPinConfig(
128. 
129.       IOMUXC_GPIO_B1_01_ENET2_RDATA00,
130. 
131. /*GPIO_B1_01配置为 ENET2_RDATA00 */
132. 
133.       0xB0E9U);
134. 
135.   IOMUXC_SetPinConfig(
136. 
137.       IOMUXC_GPIO_B1_02_ENET2_RDATA01,
138. 
139. /*GPIO_B1_02配置为 ENET2_RDATA01 */
140. 
141.       0xB0E9U);
142. 
143.   IOMUXC_SetPinConfig(
144. 
145.       IOMUXC_GPIO_B1_03_ENET2_RX_EN,
146. 
147. /*GPIO_B1_03配置为ENET2_RX_EN */
148. 
149.       0xB0E9U);

在主程序启动以太网任务前,需要添加第二路的模式使能以及模块时钟初始化配置如下,

1. IOMUXC_EnableMode(IOMUXC_GPR,kIOMUXC_GPR_ENET2TxClkOutputDir, true);
2. 
3. voidBOARD_InitModuleClock(void) {
4. 
5.     const clock_enet_pll_config_t config =
6. 
7. {.enableClkOutput1= true, .enableClkOutput25M = false, .loopDivider1 = 1,
8. 
9. 
10. 
11. };
12. 
13.     CLOCK_InitEnetPll(&config);
14. 
15. }

另外,如果需要连接到以太网的复位引脚配置,做一些上电前PHY的复位以及网络异常情况下,强制的复位处理,还需要配置复位引脚。

1. IOMUXC_SetPinMux(
2. 
3.   IOMUXC_GPIO_AD_B0_10_GPIO1_IO10,0U);
4. 
5.   IOMUXC_SetPinConfig(
6. 
7.       IOMUXC_GPIO_AD_B0_10_GPIO1_IO10,0xB0A9U);
8. 
9.     GPIO_PinInit(GPIO2, 3,&gpio_config);  //复位引脚
10. 
11.     GPIO_PinInit(GPIO1, 10, &gpio_config);
12. 
13.     /*在复位前,上拉ENET_INT */
14. 
15.     GPIO_WritePinOutput(GPIO1, 10, 1);
16. 
17.     GPIO_WritePinOutput(GPIO2, 3, 0);
18. 
19.     delay();
20. 
21.     GPIO_WritePinOutput(GPIO2,3, 1);

请问使用双网口的时候ENET_MDC,ENET_MDIO和ENET2_MDC,ENET2_MDIO必须要分别接到两个PHY上吗?

我现在使用ENET_MDC,ENET_MDIO并接两个PHY,以PHY地址区分,结果是PHY2一直初始化不了,或者卡在初始化过程中。