w5100s_conf.c
7.91 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
/**
******************************************************************************
* @file w5100s_conf.c
* @version V1.0
* @date 2018-06-18
* @brief 配置MCU,移植w5100s程序需要修改的文件,配置w5100s的MAC和IP地址
*
* @company 深圳炜世科技有限公司
* @information WIZnet W5100s官方代理商,全程技术支持,价格优势大!
* @website www.wisioe.com
* @forum www.w5100s.com
* @qqGroup 579842114
******************************************************************************
*/
#include <stdio.h>
#include <string.h>
#include "w5100s_conf.h"
#include "utility.h"
#include "w5100s.h"
#include "socket.h"
#include "bsp_TiMbase.h"
#include "bsp_flash.h"
#include "dhcp.h"
#include "bsp.h"
CONFIG_MSG ConfigMsg; // 配置结构体
uint16 rxlen=0;
uint8 rxbuf[1024];
uint8 txsize[MAX_SOCK_NUM] = {2,2,2,2}; // tx buffer set K bytes
uint8 rxsize[MAX_SOCK_NUM] = {2,2,2,2}; // rx buffet set K bytes
/*MAC地址首字节必须为偶数
如果多块W5100s网络适配板在同一现场工作,请使用不同的MAC地址
*/
uint8 mac[6]={0x00,0x08,0xdc,0x22,0x33,0x30};
//uint8 mac[6]={0x02,0x00,0x00,0x33,0x00,0x4d};
/*定义默认IP信息*/
uint8 local_ip[4] = {192,168,236,147}; // 定义W5100s默认IP地址175+id
uint8 subnet[4] = {255,255,255,0}; // 定义W5100s默认子网掩码
uint8 gateway[4] = {192,168,236,1}; // 定义W5100s默认网关
uint8 dns_server[4] = {192,168,188,5}; // 定义W5100s默认DNS
//uint8 local_ip[4] = {10,77,61,71}; // 定义W5100s默认IP地址
//uint8 subnet[4] = {255,255,255,0}; // 定义W5100s默认子网掩码
//uint8 gateway[4] = {10,77,61,1}; // 定义W5100s默认网关
//uint8 dns_server[4] = {172,24,168,55}; // 定义W5100s默认DNS
uint16 local_port = 9999; // 定义本地端口1
uint16 local_port2 = 9999; // 定义本地端口2
uint16 local_port3 = 1025; // 定义本地端口1
/*定义远端IP信息*/
uint8 remote_ip[4] = {192,168,236,105}; // 远端IP地址
uint16 remote_port = 9999; // 远端端口号
//uint8 remote_ip[4] = {10,77,58,188}; // 远端IP地址
//uint16 remote_port = 9999; // 远端端口号
/*IP配置方法选择,请自行选择*/
uint8 ip_from=IP_FROM_DEFINE;
uint8 dhcp_ok=0; // dhcp成功获取IP
uint32 ms=0; // 毫秒计数
uint32 dhcp_time= 0; // DHCP运行计数
vu8 ntptimer = 0; // NPT秒计数
/**
*@brief 初始化W5100s的复位与中断管脚
*@param 无
*@return 无
*/
void reset_break_gpio_init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
// RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD,ENABLE);
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE);
// PA-03 -> RST
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
// GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; // 增加上拉 2020-2-6
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
// PA-02 -> INT
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
// GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
GPIO_Init(GPIOA, &GPIO_InitStructure);
}
/**
*@brief 配置W5100s的IP地址
*@param 无
*@return 无
*/
void set_w5100s_netinfo(void)
{
uint8 temp;
// 复制定义的配置信息到配置结构体
memcpy(ConfigMsg.mac, mac, 6); // memcpy(dest,src,size)
memcpy(ConfigMsg.lip,local_ip,4);
memcpy(ConfigMsg.sub,subnet,4);
memcpy(ConfigMsg.gw,gateway,4);
memcpy(ConfigMsg.dns,dns_server,4);
switch(ip_from)
{
case IP_FROM_DEFINE:
Uart_Printf(COM1,"使用定义的IP信息配置W5100S:\r\n");
break;
case IP_FROM_DHCP:
// 复制DHCP获取的配置信息到配置结构体
if(dhcp_ok==1)
{
Uart_Printf(COM1,"IP from DHCP\r\n");
memcpy(ConfigMsg.lip,DHCP_GET.lip, 4);
memcpy(ConfigMsg.sub,DHCP_GET.sub, 4);
memcpy(ConfigMsg.gw,DHCP_GET.gw, 4);
memcpy(ConfigMsg.dns,DHCP_GET.dns,4);
}
else
{
Uart_Printf(COM1,"DHCP子程序未运行,或者不成功\r\n");
Uart_Printf(COM1,"使用定义的IP信息配置W5100S\r\n");
}
break;
case IP_FROM_FLASH:
ReadFlashNBtye(0,&temp,1);
if(temp != 255)
ReadFlashNBtye(0,ConfigMsg.lip,12);
break;
}
setSUBR(ConfigMsg.sub);
setGAR(ConfigMsg.gw);
setSIPR(ConfigMsg.lip);
getSIPR (local_ip);
Uart_Printf(COM1,"W5100S IP地址 : %d.%d.%d.%d\r\n", local_ip[0],local_ip[1],local_ip[2],local_ip[3]);
getSUBR(subnet);
Uart_Printf(COM1,"W5100S 子网掩码 : %d.%d.%d.%d\r\n", subnet[0],subnet[1],subnet[2],subnet[3]);
getGAR(gateway);
Uart_Printf(COM1,"W5100S 网关 : %d.%d.%d.%d\r\n", gateway[0],gateway[1],gateway[2],gateway[3]);
}
/**
*@brief 配置W5100S的MAC地址
*@param 无
*@return 无
*/
void set_w5100s_mac(void)
{
// 以下配置信息,根据需要选用
ConfigMsg.sw_ver[0]=FW_VER_HIGH;
ConfigMsg.sw_ver[1]=FW_VER_LOW;
memcpy(ConfigMsg.mac, mac, 6); // mac[6]={0x00,0x08,0xdc,0x22,0x33,0x33};
setSHAR(ConfigMsg.mac); // 将设置值写入芯片MAC地址
memcpy(DHCP_GET.mac, mac, 6);
getSHAR(mac); // 将MAC地址内的值读出到mac
Uart_Printf(COM1,"W5100S MAC地址 : %02x.%02x.%02x.%02x.%02x.%02x\r\n", mac[0],mac[1],mac[2],mac[3],mac[4],mac[5]);
}
/**
*@brief W5100s复位设置函数
*@param 无
*@return 无
*/
//extern void Delay(__IO uint32_t nTime); // 2020-2-11
extern void delay_ms(u16 nms);
void reset_w5100s(void)
{
GPIO_ResetBits(GPIOA, GPIO_Pin_3); //A3---RESET
bsp_DelayMS(500);
// Delay(50);
GPIO_SetBits(GPIOA, GPIO_Pin_3);
bsp_DelayMS(1500);
// Delay(150);
}
/**
*@brief STM32系统软复位函数
*@param 无
*@return 无
*/
void reboot(void)
{
pFunction Jump_To_Application;
uint32 JumpAddress;
Uart_Printf(COM1,"系统重启中……\r\n");
JumpAddress = *(vu32*) (0x00000004);
Jump_To_Application = (pFunction) JumpAddress;
Jump_To_Application();
}
/**
*@brief dhcp用到的定时器初始化
*@param 无
*@return 无
*/
void dhcp_timer_init(void)
{
timer2_init();
}
/**
*@brief ntp用到的定时器初始化
*@param 无
*@return 无
*/
void ntp_timer_init(void)
{
timer2_init();
}
/**
*@brief STM32定时器2初始化
*@param 无
*@return 无
*/
void timer2_init(void)
{
TIM2_Configuration(); // TIM2 定时配置
TIM2_NVIC_Configuration(); // 定时器的中断优先级
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2 , ENABLE); // TIM2 重新开时钟,开始计时
}
/**
*@brief 定时器2中断函数
*@param 无
*@return 无
*/
void timer2_isr(void)
{
ms++;
if(ms>=1000)
{
ms=0;
dhcp_time++; // DHCP定时加1S
#ifndef __NTP_H__
ntptimer++; // NTP重试时间加1S
#endif
}
}
/**
*@brief 检测物理层连接
*@param 无
*@return 无
*/
void PHY_check(void)
{
uint8 PHY_connect=0;
PHY_connect=0x01&getPHYStatus(); // PHYSR 0X01--上线 0x00--下线
if(PHY_connect==0)
{
Uart_Printf(COM1,"请检查网线是否连接?\r\n");
PHY_connect = 0;
do
{
close(PHY_connect++);
}while(PHY_connect < 4);
PHY_connect = 0;
while(PHY_connect == 0) {
PHY_connect=0x01&getPHYStatus();
printf(" .");
bsp_DelayMS(500);
// Delay(50);
}
Uart_Printf(COM1,"网线已连接!\r\n");
}
//Uart_Printf(COM1,"网线已连接!\r\n");
}
/**
*@brief 读取PHY寄存器数据
*@param 无
*@return 无
*/
uint8 getPHYStatus( void )
{
return IINCHIP_READ(PHYSR);
}