w5500_conf.c
19.5 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
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
/**
******************************************************************************
* @file w5500_conf.c
* @version V1.2
* @date 2017-11-01
* @brief 用3.5.0版本库建的工程模板
* @attention 配置MCU,移植w5500程序需要修改的文件,配置w5500的MAC和IP地址
*
* @company 深圳炜世科技有限公司
* @information WIZnet W5500官方代理商,全程技术支持,价格绝对优势!
* @website www.wisioe.com
* @forum www.w5500.cn
* @qqGroup 383035001
******************************************************************************
*/
/*
add by Gavin 2020.03
RST -PA15
CS -PB14
INT -PB15
SPI -sys_SPI3(PC10-clk;PC11 MISO;PC12 -MOSI;
参考原理图得知,w5500和NFC读卡器共用系统spi3,
而目前的NFC驱动是用的模拟spi,需要修改;
特别说明: 由于RST复位引脚也是共用(硬件设计缺陷),所以初始化在前的执行一次复位;
后初始化的那个模块不能再执行复位动作了,否则...
NFC ic RC522的spi速度最大10M;
w5500 SPI最大速度 80M
system SPI3 最大速度 21.5M
所以系统SPI只能设置成3个中最小的那个 10M;
代理商参考设计资料 http://www.w5500.cn
//---------------------------
1,DEMO_W5500的宏定义用于屏蔽 demo中的开发板硬件信息
2, 实际调试,NFC ic-RC522只能用SPI3 8分频=5M通信,4分频实际测试不通过!!!!!!!!!!!!
*/
#include <stdio.h>
#include <string.h>
#include "w5500_conf.h"
#include "utility.h"
#include "w5500.h"
#include "dhcp.h"
#include "platform_interface.h"
#include "function_interface.h"
#include "function.h"
#include "tcp_demo.h"
#include "platform.h"
//next 3 header file mask by Gavin
//#include "bsp_i2c_ee.h"
//#include "bsp_spi_flash.h"
//#include "bsp_TiMbase.h"
//add by Gavin
extern SPI_HandleTypeDef hspi3;
#ifndef DEMO_W5500
#define W5500_CS_PORT GPIOB
#define W5500_CS_PIN GPIO_PIN_14
#define SET_W5500_CS HAL_GPIO_WritePin(W5500_CS_PORT,W5500_CS_PIN,GPIO_PIN_SET)
#define RESET_W5500_CS HAL_GPIO_WritePin(W5500_CS_PORT,W5500_CS_PIN,GPIO_PIN_RESET)
#endif
CONFIG_MSG ConfigMsg; /*配置结构体*/
EEPROM_MSG_STR EEPROM_MSG; /*EEPROM存储信息结构体*/
/*MAC地址首字节必须为偶数*/
/*如果多块W5500网络适配板在同一现场工作,请使用不同的MAC地址*/
uint8 mac[6]={0x00,0x08,0xdc,0x11,0x11,0x11};
/*定义默认IP信息*/
uint8 local_ip[4]={192,168,0,12}; /*定义W5500默认IP地址*/
uint8 subnet[4]={255,255,255,0}; /*定义W5500默认子网掩码*/
uint8 gateway[4]={200,200,100,1}; //{192,168,1,1}; /*定义W5500默认网关*/
uint8 dns_server[4]={114,114,114,114}; /*定义W5500默认DNS*/
uint16 local_port=4000;//8000; /*定义本地端口*/
/*定义远端IP信息*/
uint8 remote_ip[4]={192,168,1,107}; /*远端IP地址*/
uint16 remote_port=8080; /*远端端口号*/
/*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 配置W5500的IP地址
*@param 无
*@return 无
*/
void set_w5500_ip(void)
{
/*复制定义的配置信息到配置结构体*/
memcpy(ConfigMsg.mac, mac, 6);
memcpy(ConfigMsg.lip,local_ip,4);
memcpy(ConfigMsg.sub,subnet,4);
memcpy(ConfigMsg.gw,gateway,4);
memcpy(ConfigMsg.dns,dns_server,4);
if(ip_from==IP_FROM_DEFINE){
//printf(" 使用定义的IP信息配置W5500:\r\n");
}
/*使用EEPROM存储的IP参数*/
if(ip_from==IP_FROM_EEPROM)
{
/*从EEPROM中读取IP配置信息*/
read_config_from_eeprom();
/*如果读取EEPROM中MAC信息,如果已配置,则可使用*/
if( *(EEPROM_MSG.mac)==0x00&& *(EEPROM_MSG.mac+1)==0x08&&*(EEPROM_MSG.mac+2)==0xdc)
{
//printf(" IP from EEPROM\r\n");
/*复制EEPROM配置信息到配置的结构体变量*/
memcpy(ConfigMsg.lip,EEPROM_MSG.lip, 4);
memcpy(ConfigMsg.sub,EEPROM_MSG.sub, 4);
memcpy(ConfigMsg.gw, EEPROM_MSG.gw, 4);
}
else
{
//printf(" EEPROM未配置,使用定义的IP信息配置W5500,并写入EEPROM\r\n");
write_config_to_eeprom(); /*使用默认的IP信息,并初始化EEPROM中数据*/
}
}
/*使用DHCP获取IP参数,需调用DHCP子函数*/
if(ip_from==IP_FROM_DHCP)
{
/*复制DHCP获取的配置信息到配置结构体*/
if(dhcp_ok==1)
{
//printf(" 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
{
//printf(" DHCP子程序未运行,或者不成功\r\n");
//printf(" 使用定义的IP信息配置W5500\r\n");
}
}
/*以下配置信息,根据需要选用*/
ConfigMsg.sw_ver[0]=FW_VER_HIGH;
ConfigMsg.sw_ver[1]=FW_VER_LOW;
/*将IP配置信息写入W5500相应寄存器*/
setSUBR(ConfigMsg.sub);
setGAR(ConfigMsg.gw);
setSIPR(ConfigMsg.lip);
getSIPR (local_ip);
//printf(" W5500 IP地址 : %d.%d.%d.%d\r\n", local_ip[0],local_ip[1],local_ip[2],local_ip[3]);
getSUBR(subnet);
//printf(" W5500 子网掩码 : %d.%d.%d.%d\r\n", subnet[0],subnet[1],subnet[2],subnet[3]);
getGAR(gateway);
//printf(" W5500 网关 : %d.%d.%d.%d\r\n", gateway[0],gateway[1],gateway[2],gateway[3]);
}
/**
*@brief 配置W5500的MAC地址
*@param 无
*@return 无
*/
void set_w5500_mac(void)
{
memcpy(ConfigMsg.mac, mac, 6);
setSHAR(ConfigMsg.mac); /**/
memcpy(DHCP_GET.mac, mac, 6);
}
/**
*@brief 配置W5500的GPIO接口
*@param 无
*@return 无
*/
void gpio_for_w5500_config(void)
{
#ifdef DEMO_W5500 //add by Gavin
GPIO_InitTypeDef GPIO_InitStructure;
SPI_FLASH_Init(); /*初始化STM32 SPI接口*/
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC|RCC_APB2Periph_GPIOE|RCC_APB2Periph_GPIOG, ENABLE);
/*使用SPI1*/
#ifdef STM32_SPI1
/*定义RESET引脚*/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; /*选择要控制的GPIO引脚*/
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; /*设置引脚速率为50MHz*/
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; /*设置引脚模式为通用推挽输出*/
GPIO_Init(GPIOC, &GPIO_InitStructure); /*调用库函数,初始化GPIO*/
GPIO_SetBits(GPIOC, GPIO_Pin_0);
/*定义INT引脚*/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1; /*选择要控制的GPIO引脚*/
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; /*设置引脚速率为50MHz */
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; /*设置引脚模式为通用推挽模拟上拉输入*/
GPIO_Init(GPIOC, &GPIO_InitStructure); /*调用库函数,初始化GPIO*/
#endif
/*使用SPI2*/
#ifdef STM32_SPI2
/*定义RESET引脚*/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; /*选择要控制的GPIO引脚*/
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; /*设置引脚速率为50MHz*/
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; /*设置引脚模式为通用推挽输出*/
GPIO_Init(GPIOB, &GPIO_InitStructure); /*调用库函数,初始化GPIO*/
GPIO_SetBits(GPIOB, GPIO_Pin_9);
/*定义INT引脚*/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6; /*选择要控制的GPIO引脚*/
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; /*设置引脚速率为50MHz */
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; /*设置引脚模式为通用推挽模拟上拉输入*/
GPIO_Init(GPIOC, &GPIO_InitStructure); /*调用库函数,初始化GPIO*/
#endif
#else
GPIO_InitTypeDef GPIO_InitStruct = {0};
GPIO_InitStruct.Pin = W5500_CS_PIN;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
HAL_GPIO_Init(W5500_CS_PORT, &GPIO_InitStruct);
#endif
}
/**
*@brief W5500片选信号设置函数
*@param val: 为“0”表示片选端口为低,为“1”表示片选端口为高
*@return 无
*/
void wiz_cs(uint8_t val)
{
#ifdef DEMO_W5500 //add by Gavin
#ifdef STM32_SPI1
if (val == LOW)
{
GPIO_ResetBits(GPIOA, GPIO_Pin_4);
}
else if (val == HIGH)
{
GPIO_SetBits(GPIOA, GPIO_Pin_4);
}
#endif
#ifdef STM32_SPI2
if (val == LOW)
{
GPIO_ResetBits(GPIOB, GPIO_Pin_12);
}
else if (val == HIGH)
{
GPIO_SetBits(GPIOB, GPIO_Pin_12);
}
#endif
#else
if (val == LOW)
{
RESET_W5500_CS;//GPIO_ResetBits(GPIOB, GPIO_Pin_12);
}
else if (val == HIGH)
{
SET_W5500_CS;//GPIO_SetBits(GPIOB, GPIO_Pin_12);
}
#endif
}
/**
*@brief 设置W5500的片选端口SCSn为低
*@param 无
*@return 无
*/
void iinchip_csoff(void)
{
wiz_cs(LOW);
}
/**
*@brief 设置W5500的片选端口SCSn为高
*@param 无
*@return 无
*/
void iinchip_cson(void)
{
wiz_cs(HIGH);
}
/*
2019.12.04 实测1ms;
环境:主频168MHz,关闭中断,IO取反用示波器测试!! */
void w5500_delay_ms( unsigned short time )
{
unsigned short i = 0;
while( time-- ){
i = 33400;
while( i-- );
}
}
/**
*@brief W5500复位设置函数
*@param 无
*@return 无
*/
void reset_w5500(void)
{
#ifdef DEMO_W5500 //add by Gavin
#ifdef STM32_SPI1
GPIO_ResetBits(GPIOC, GPIO_Pin_0);
delay_us(2);
GPIO_SetBits(GPIOC, GPIO_Pin_0);
delay_ms(1600);
#endif
#ifdef STM32_SPI2
GPIO_ResetBits(GPIOB, GPIO_Pin_9);
delay_us(2);
GPIO_SetBits(GPIOB, GPIO_Pin_9);
delay_ms(1600);
#endif
#endif
if( get_hard_flag() ==0){ //200S_V3 w5500 RST-PA8
GPIO_InitTypeDef GPIO_InitStruct = {0};
GPIO_InitStruct.Pin = GPIO_PIN_8;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
//
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_8, GPIO_PIN_RESET);
w5500_delay_ms(50);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_8, GPIO_PIN_SET);
w5500_delay_ms(50);
}
}
/**
*@brief STM32 SPI1读写8位数据
*@param dat:写入的8位数据
*@return 无
*/
uint8 IINCHIP_SpiSendData(uint8 dat)
{
#ifdef DEMO_W5500 //add by Gavin
return(SPI_FLASH_SendByte(dat));
#else
unsigned char rxdata;
HAL_SPI_TransmitReceive(&hspi3,&dat,&rxdata,1,100);
return rxdata;
#endif
}
/**
*@brief 写入一个8位数据到W5500
*@param addrbsb: 写入数据的地址
*@param data:写入的8位数据
*@return 无
*/
void IINCHIP_WRITE( uint32 addrbsb, uint8 data)
{
iinchip_csoff();
IINCHIP_SpiSendData( (addrbsb & 0x00FF0000)>>16);
IINCHIP_SpiSendData( (addrbsb & 0x0000FF00)>> 8);
IINCHIP_SpiSendData( (addrbsb & 0x000000F8) + 4);
IINCHIP_SpiSendData(data);
iinchip_cson();
}
/**
*@brief 从W5500读出一个8位数据
*@param addrbsb: 写入数据的地址
*@param data:从写入的地址处读取到的8位数据
*@return 无
*/
uint8 IINCHIP_READ(uint32 addrbsb)
{
uint8 data = 0;
iinchip_csoff();
IINCHIP_SpiSendData( (addrbsb & 0x00FF0000)>>16);
IINCHIP_SpiSendData( (addrbsb & 0x0000FF00)>> 8);
IINCHIP_SpiSendData( (addrbsb & 0x000000F8)) ;
data = IINCHIP_SpiSendData(0x00);
iinchip_cson();
return data;
}
/**
*@brief 向W5500写入len字节数据
*@param addrbsb: 写入数据的地址
*@param buf:写入字符串
*@param len:字符串长度
*@return len:返回字符串长度
*/
uint16 wiz_write_buf(uint32 addrbsb,uint8* buf,uint16 len)
{
uint16 idx = 0;
if(len == 0){ //printf(" Unexpected2 length 0\r\n");
}
iinchip_csoff();
IINCHIP_SpiSendData( (addrbsb & 0x00FF0000)>>16);
IINCHIP_SpiSendData( (addrbsb & 0x0000FF00)>> 8);
IINCHIP_SpiSendData( (addrbsb & 0x000000F8) + 4);
for(idx = 0; idx < len; idx++)
{
IINCHIP_SpiSendData(buf[idx]);
}
iinchip_cson();
return len;
}
/**
*@brief 从W5500读出len字节数据
*@param addrbsb: 读取数据的地址
*@param buf:存放读取数据
*@param len:字符串长度
*@return len:返回字符串长度
*/
uint16 wiz_read_buf(uint32 addrbsb, uint8* buf,uint16 len)
{
uint16 idx = 0;
if(len == 0)
{
//printf(" Unexpected2 length 0\r\n");
}
iinchip_csoff();
IINCHIP_SpiSendData( (addrbsb & 0x00FF0000)>>16);
IINCHIP_SpiSendData( (addrbsb & 0x0000FF00)>> 8);
IINCHIP_SpiSendData( (addrbsb & 0x000000F8));
for(idx = 0; idx < len; idx++)
{
buf[idx] = IINCHIP_SpiSendData(0x00);
}
iinchip_cson();
return len;
}
/**
*@brief 写配置信息到EEPROM
*@param 无
*@return 无
*/
void write_config_to_eeprom(void)
{
#ifdef DEMO_W5500 //add by Gavin
uint16 dAddr=0;
ee_WriteBytes(ConfigMsg.mac,dAddr,(uint8)EEPROM_MSG_LEN);
delay_ms(10);
#endif
}
/**
*@brief 从EEPROM读配置信息
*@param 无
*@return 无
*/
void read_config_from_eeprom(void)
{
#ifdef DEMO_W5500 //add by Gavin
ee_ReadBytes(EEPROM_MSG.mac,0,EEPROM_MSG_LEN);
delay_us(10);
#endif
}
/**
*@brief STM32定时器2初始化
*@param 无
*@return 无
*/
void timer2_init(void)
{
#ifdef DEMO_W5500 //add by Gavin
TIM2_Configuration(); /* TIM2 定时配置 */
TIM2_NVIC_Configuration(); /* 定时器的中断优先级 */
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2 , ENABLE); /* TIM2 重新开时钟,开始计时 */
#endif
}
/**
*@brief dhcp用到的定时器初始化
*@param 无
*@return 无
*/
void dhcp_timer_init(void)
{
timer2_init();
}
/**
*@brief ntp用到的定时器初始化
*@param 无
*@return 无
*/
void ntp_timer_init(void)
{
timer2_init();
}
/**
*@brief 定时器2中断函数
*@param 无
*@return 无
*/
#ifdef DEMO_W5500 //add by Gavin
void timer2_isr(void)
{
ms++;
if(ms>=1000)
{
ms=0;
dhcp_time++; /*DHCP定时加1S*/
#ifndef __NTP_H__
ntptimer++; /*NTP重试时间加1S*/
#endif
}
}
#else
void timer2_isr(void)
{
//called by 20ms
if(++ms>=50)
{
ms=0;
dhcp_time++; /*DHCP定时加1S*/
#ifndef __NTP_H__
ntptimer++; /*NTP重试时间加1S*/
#endif
}
}
#endif
/**
*@brief STM32系统软复位函数
*@param 无
*@return 无
*/
void reboot(void)
{
#ifdef DEMO_W5500 //add by Gavin
pFunction Jump_To_Application;
uint32 JumpAddress;
//printf(" 系统重启中……\r\n");
JumpAddress = *(vu32*) (0x00000004);
Jump_To_Application = (pFunction) JumpAddress;
Jump_To_Application();
#endif
}
//----------------------------------- NEXT add by Gavin ----------------------------------------------------------------
//see BASE protocol 5.2.9 TCPIP
struct tcpip_STR{
unsigned char ip_addr[4];
unsigned char mac_addr[6];
unsigned char subnet_mask[4];
unsigned char gateway[4];
#define IP_ADDR_LEN 4
#define MAC_ADDR_LEN 6
#define SUBNET_ADDR_LEN 4
#define GATEWAY_ADDR_LEN 4
};
struct tcpip_STR tcp_ip;
#define STORE_IP_ADDR 0x120 //len=4+1
#define STORE_MAC_ADDR 0x128 //len=6+1
#define STORE_SUBNET_ADDR 0x130 //len=4+1
#define STORE_GATEWAY_ADDR 0x138 //len=4+1
#define W5500_STORE_FLAG 0x5A
//--------------------------------------------------------------------
static void w5500_set_mac_addr(void){
memcpy(ConfigMsg.mac,tcp_ip.mac_addr, 6);// memcpy(ConfigMsg.mac, mac, 6);
setSHAR(ConfigMsg.mac);
}
static void w5500_set_ip_addr(void){
memcpy(ConfigMsg.lip,tcp_ip.ip_addr,4);
setSIPR(ConfigMsg.lip);
}
static void w5500_set_sub_addr(void){
memcpy(ConfigMsg.sub,tcp_ip.subnet_mask,4);
setSUBR(ConfigMsg.sub);
}
static void w5500_set_getway_addr(void){
memcpy(ConfigMsg.gw,tcp_ip.gateway,4);
setGAR(ConfigMsg.gw);
}
/*
设置w5500的网络参数!!!
*/
static void setting_w5500_parameter(void)
{
memcpy(ConfigMsg.mac,tcp_ip.mac_addr, 6);// memcpy(ConfigMsg.mac, mac, 6);
setSHAR(ConfigMsg.mac); /**/
memcpy(DHCP_GET.mac, tcp_ip.mac_addr, 6);// memcpy(DHCP_GET.mac, mac, 6);
//复制定义的配置信息到配置结构体/
memcpy(ConfigMsg.mac, tcp_ip.mac_addr, 6);
memcpy(ConfigMsg.lip,tcp_ip.ip_addr,4);
memcpy(ConfigMsg.sub,tcp_ip.subnet_mask,4);
memcpy(ConfigMsg.gw,tcp_ip.gateway,4);
memcpy(ConfigMsg.dns,dns_server,4);
/*将IP配置信息写入W5500相应寄存器*/
setSUBR(ConfigMsg.sub);
setGAR(ConfigMsg.gw);
setSIPR(ConfigMsg.lip);
}
/*
#define STORE_IP_ADDR 0x120 //len=4+1
#define STORE_MAC_ADDR 0x128 //len=6+1
#define STORE_SUBNET_ADDR 0x130 //len=4+1
#define STORE_GATEWAY_ADDR 0x138 //len=4+1
* 处理来自sdk/PC的配置参数信息
*/
void _0x61_tcpip_sub(const unsigned char *rxpc)
{
unsigned char ack_buf[32],ack_len,wtmp[8];
unsigned char op_flag =0;
switch(rxpc[4]){
case 2:
memcpy(tcp_ip.ip_addr,rxpc+5,IP_ADDR_LEN);
w5500_set_ip_addr();//
memcpy(wtmp+1,tcp_ip.ip_addr,IP_ADDR_LEN);
wtmp[0] =W5500_STORE_FLAG;
platform.e2prom_write(STORE_IP_ADDR,wtmp,IP_ADDR_LEN+1);
case 1: //read ip addr
ack_buf[0] =1;
memcpy(ack_buf+1,tcp_ip.ip_addr,IP_ADDR_LEN);
ack_len =IP_ADDR_LEN;
op_flag =1;
break;
case 4:
memcpy(tcp_ip.mac_addr,rxpc+5,MAC_ADDR_LEN);
w5500_set_mac_addr();//
memcpy(wtmp+1,tcp_ip.mac_addr,MAC_ADDR_LEN);
wtmp[0] =W5500_STORE_FLAG;
platform.e2prom_write(STORE_MAC_ADDR,wtmp,MAC_ADDR_LEN+1);
case 3: //read mac_addr addr
ack_buf[0] =3;
memcpy(ack_buf+1,tcp_ip.mac_addr,MAC_ADDR_LEN);
ack_len =MAC_ADDR_LEN;
op_flag =1;
break;
case 6:
memcpy(tcp_ip.subnet_mask,rxpc+5,SUBNET_ADDR_LEN);
w5500_set_sub_addr();
memcpy(wtmp+1,tcp_ip.subnet_mask,SUBNET_ADDR_LEN);
wtmp[0] =W5500_STORE_FLAG;
platform.e2prom_write(STORE_SUBNET_ADDR,wtmp,SUBNET_ADDR_LEN+1);
case 5: //read subnet_mask addr
ack_buf[0] =5;
memcpy(ack_buf+1,tcp_ip.subnet_mask,SUBNET_ADDR_LEN);
ack_len =SUBNET_ADDR_LEN;
op_flag =1;
break;
case 8:
memcpy(tcp_ip.gateway,rxpc+5,GATEWAY_ADDR_LEN);
w5500_set_getway_addr();
memcpy(wtmp+1,tcp_ip.gateway,GATEWAY_ADDR_LEN);
wtmp[0] =W5500_STORE_FLAG;
platform.e2prom_write(STORE_GATEWAY_ADDR,wtmp,GATEWAY_ADDR_LEN+1);
case 7: //read gateway addr
ack_buf[0] =7;
memcpy(ack_buf+1,tcp_ip.gateway,GATEWAY_ADDR_LEN);
ack_len =GATEWAY_ADDR_LEN;
op_flag =1;
break;
default:break;
}//sw
if(op_flag){
user__pc_cmd_ack(0x61,12,ack_buf,ack_len+1);
}
}
/*
* 从E2prom中的指定位置读取W5500的参数,用于上电初始化
* 初始化设置W5500 :
setting parameter;
*/
static void read_w5500_parameter(void)
{
unsigned char tmp[8];
//12 TCP IP settting
//ip
platform.e2prom_read(STORE_IP_ADDR,tmp,IP_ADDR_LEN+1);
if(tmp[0] ==W5500_STORE_FLAG ){
memcpy(tcp_ip.ip_addr,tmp+1,IP_ADDR_LEN);
}
else{
tcp_ip.ip_addr[0] = 192;
tcp_ip.ip_addr[1] = 168;
tcp_ip.ip_addr[2] = 0;
tcp_ip.ip_addr[3] = 12;
}
//mac
platform.e2prom_read(STORE_MAC_ADDR,tmp,MAC_ADDR_LEN+1);
if( tmp[0] ==W5500_STORE_FLAG ){
memcpy(tcp_ip.mac_addr,tmp+1,MAC_ADDR_LEN);
}
else{
tcp_ip.mac_addr[0] = 0x00;
tcp_ip.mac_addr[1] = 0x08;
tcp_ip.mac_addr[2] = 0xdc;
tcp_ip.mac_addr[3] = 0x11;
tcp_ip.mac_addr[4] = 0x11;
tcp_ip.mac_addr[5] = 0x11;
}
//subnet
platform.e2prom_read(STORE_SUBNET_ADDR,tmp,SUBNET_ADDR_LEN+1);
if(tmp[0] == W5500_STORE_FLAG ){
memcpy(tcp_ip.subnet_mask,tmp+1,SUBNET_ADDR_LEN);
}
else{
tcp_ip.subnet_mask[0] = 255;
tcp_ip.subnet_mask[1] = 255;
tcp_ip.subnet_mask[2] = 255;
tcp_ip.subnet_mask[3] = 0;
}
//gateway
platform.e2prom_read(STORE_GATEWAY_ADDR,tmp,GATEWAY_ADDR_LEN+1);
if(tmp[0] ==W5500_STORE_FLAG ){
memcpy(tcp_ip.gateway,tmp+1,GATEWAY_ADDR_LEN);
}
else{
tcp_ip.gateway[0] = 200;
tcp_ip.gateway[1] = 200;
tcp_ip.gateway[2] = 100;
tcp_ip.gateway[3] = 1;
}
}
/*
* 初始化W5500
* 初始化io控制; rest ; setting ip mac。。。
*/
void w5500_init(void)
{
if( !function.TCPIP__SW) return ;
gpio_for_w5500_config(); /*初始化MCU相关引脚*/
reset_w5500(); /*硬复位W5500*/
//useing to test spi communication;add by Gavin
//w5500_ver = IINCHIP_READ(VERSIONR);
// PHY_check(); /*检查网线是否接入*/
// set_w5500_mac(); /*配置MAC地址*/
// set_w5500_ip(); /*配置IP地址*/
read_w5500_parameter();
setting_w5500_parameter();//
socket_buf_init(txsize, rxsize); /*初始化8个Socket的发送接收缓存大小*/
}