已经完成了网络,DI口,RS485的数据透传,可通过RS485接收数据
This commit is contained in:
321
User/wiz_interface/wiz_interface.c
Normal file
321
User/wiz_interface/wiz_interface.c
Normal file
@ -0,0 +1,321 @@
|
||||
#include "wiz_interface.h"
|
||||
#include "wiz_platform.h"
|
||||
#include "wizchip_conf.h"
|
||||
#include "dhcp.h"
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
#define W5500_VERSION 0x04
|
||||
|
||||
struct wiz_timer
|
||||
{
|
||||
void (*func)(void); // Callback function pointer for a function to execute when the timer fires
|
||||
uint32_t trigger_time; // Trigger time(ms)
|
||||
uint32_t count_time; // Current count value(ms)
|
||||
struct wiz_timer *next; // next timer node
|
||||
};
|
||||
|
||||
struct wiz_timer *wiz_timer_head = NULL;
|
||||
volatile uint32_t wiz_delay_ms_count = 0;
|
||||
|
||||
/**
|
||||
* @brief Create wiz_timer Node
|
||||
* @param func :Callback function pointer for a function to execute when the timer fires
|
||||
* @param time :Trigger time, usually in milliseconds
|
||||
*
|
||||
* @return Returns pointer to wiz_timer node when successfully created, otherwise returns NULL
|
||||
*/
|
||||
static struct wiz_timer *create_wiz_timer_node(void (*func)(void), uint32_t time)
|
||||
{
|
||||
struct wiz_timer *newNode = (struct wiz_timer *)malloc(sizeof(struct wiz_timer));
|
||||
if (newNode == NULL)
|
||||
{
|
||||
printf("Memory allocation failed.\n");
|
||||
return NULL;
|
||||
}
|
||||
newNode->func = func;
|
||||
newNode->trigger_time = time;
|
||||
newNode->count_time = 0;
|
||||
newNode->next = NULL;
|
||||
return newNode;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Add a new timer node to the timer chain table
|
||||
* @param func Callback function pointer, called when the timer time is reached
|
||||
* @param time Trigger time (ms)
|
||||
*/
|
||||
void wiz_add_timer(void (*func)(void), uint32_t time)
|
||||
{
|
||||
struct wiz_timer *newNode = create_wiz_timer_node(func, time);
|
||||
if (wiz_timer_head == NULL)
|
||||
{
|
||||
wiz_timer_head = newNode;
|
||||
return;
|
||||
}
|
||||
struct wiz_timer *temp = wiz_timer_head;
|
||||
while (temp->next != NULL)
|
||||
{
|
||||
temp = temp->next;
|
||||
}
|
||||
temp->next = newNode;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Delete the timer for the specified callback function
|
||||
* @param func callback function pointer
|
||||
* @return none
|
||||
*/
|
||||
void wiz_delete_timer(void (*func)(void))
|
||||
{
|
||||
struct wiz_timer *temp = wiz_timer_head;
|
||||
struct wiz_timer *prev = NULL;
|
||||
|
||||
if (temp != NULL && temp->func == func)
|
||||
{
|
||||
wiz_timer_head = temp->next;
|
||||
free(temp);
|
||||
return;
|
||||
}
|
||||
|
||||
while (temp != NULL && temp->func != func)
|
||||
{
|
||||
prev = temp;
|
||||
temp = temp->next;
|
||||
}
|
||||
|
||||
if (temp == NULL)
|
||||
return;
|
||||
|
||||
prev->next = temp->next;
|
||||
free(temp);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief wiz timer event handler
|
||||
*
|
||||
* You must add this function to your 1ms timer interrupt
|
||||
*
|
||||
*/
|
||||
void wiz_timer_handler(void)
|
||||
{
|
||||
|
||||
wiz_delay_ms_count++;
|
||||
struct wiz_timer *temp = wiz_timer_head;
|
||||
while (temp != NULL)
|
||||
{
|
||||
temp->count_time++;
|
||||
if (temp->count_time >= temp->trigger_time)
|
||||
{
|
||||
temp->count_time = 0;
|
||||
temp->func();
|
||||
}
|
||||
temp = temp->next;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Delay function in milliseconds
|
||||
* @param nms :Delay Time
|
||||
*/
|
||||
void wiz_user_delay_ms(uint32_t nms)
|
||||
{
|
||||
wiz_delay_ms_count = 0;
|
||||
while (wiz_delay_ms_count < nms)
|
||||
{
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Check the WIZCHIP version
|
||||
*/
|
||||
void wizchip_version_check(void)
|
||||
{
|
||||
uint8_t error_count = 0;
|
||||
while (1)
|
||||
{
|
||||
wiz_user_delay_ms(1000);
|
||||
if (getVERSIONR() != W5500_VERSION)
|
||||
{
|
||||
error_count++;
|
||||
if (error_count > 5)
|
||||
{
|
||||
printf("error, W5500 version is 0x%02x, but read W5500 version value = 0x%02x\r\n", W5500_VERSION, getVERSIONR());
|
||||
while (1)
|
||||
;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Print PHY information
|
||||
*/
|
||||
void wiz_print_phy_info(void)
|
||||
{
|
||||
uint8_t get_phy_conf;
|
||||
get_phy_conf = getPHYCFGR();
|
||||
printf("The current Mbtis speed : %dMbps\r\n", get_phy_conf & 0x02 ? 100 : 10);
|
||||
printf("The current Duplex Mode : %s\r\n", get_phy_conf & 0x04 ? "Full-Duplex" : "Half-Duplex");
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Ethernet Link Detection
|
||||
*/
|
||||
void wiz_phy_link_check(void)
|
||||
{
|
||||
uint8_t phy_link_status;
|
||||
do
|
||||
{
|
||||
wiz_user_delay_ms(1000);
|
||||
ctlwizchip(CW_GET_PHYLINK, (void *)&phy_link_status);
|
||||
if (phy_link_status == PHY_LINK_ON)
|
||||
{
|
||||
printf("PHY link\r\n");
|
||||
wiz_print_phy_info();
|
||||
}
|
||||
else
|
||||
{
|
||||
printf("PHY no link\r\n");
|
||||
}
|
||||
} while (phy_link_status == PHY_LINK_OFF);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief wizchip init function
|
||||
* @param none
|
||||
* @return none
|
||||
*/
|
||||
void wizchip_initialize(void)
|
||||
{
|
||||
printf(" -> [WIZ] 注册SPI回调...\r\n");
|
||||
wizchip_spi_cb_reg();
|
||||
|
||||
printf(" -> [WIZ] 执行硬件复位(测试延时是否卡死)...\r\n");
|
||||
wizchip_reset(); // <--- 之前是死在这里
|
||||
printf(" -> [WIZ] 硬件复位通过!说明 TIM2 定时器工作完全正常!\r\n");
|
||||
|
||||
printf(" -> [WIZ] 检查SPI通信与芯片版本号...\r\n");
|
||||
wizchip_version_check(); // <--- 如果 SPI 线接错了会死在这里
|
||||
printf(" -> [WIZ] 版本号检查通过!SPI 通信正常!\r\n");
|
||||
|
||||
wiz_phy_link_check();
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief print network information
|
||||
* @param none
|
||||
* @return none
|
||||
*/
|
||||
void print_network_information(void)
|
||||
{
|
||||
wiz_NetInfo net_info;
|
||||
wizchip_getnetinfo(&net_info); // Get chip configuration information
|
||||
|
||||
if (net_info.dhcp == NETINFO_DHCP)
|
||||
{
|
||||
printf("====================================================================================================\r\n");
|
||||
printf(" %s network configuration : DHCP\r\n\r\n", _WIZCHIP_ID_);
|
||||
}
|
||||
else
|
||||
{
|
||||
printf("====================================================================================================\r\n");
|
||||
printf(" %s network configuration : static\r\n\r\n", _WIZCHIP_ID_);
|
||||
}
|
||||
|
||||
printf(" MAC : %02X:%02X:%02X:%02X:%02X:%02X\r\n", net_info.mac[0], net_info.mac[1], net_info.mac[2], net_info.mac[3], net_info.mac[4], net_info.mac[5]);
|
||||
printf(" IP : %d.%d.%d.%d\r\n", net_info.ip[0], net_info.ip[1], net_info.ip[2], net_info.ip[3]);
|
||||
printf(" Subnet Mask : %d.%d.%d.%d\r\n", net_info.sn[0], net_info.sn[1], net_info.sn[2], net_info.sn[3]);
|
||||
printf(" Gateway : %d.%d.%d.%d\r\n", net_info.gw[0], net_info.gw[1], net_info.gw[2], net_info.gw[3]);
|
||||
printf(" DNS : %d.%d.%d.%d\r\n", net_info.dns[0], net_info.dns[1], net_info.dns[2], net_info.dns[3]);
|
||||
printf("====================================================================================================\r\n\r\n");
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief DHCP process
|
||||
* @param sn :socket number
|
||||
* @param buffer :socket buffer
|
||||
*/
|
||||
static uint8_t wiz_dhcp_process(uint8_t sn, uint8_t *buffer)
|
||||
{
|
||||
wiz_NetInfo conf_info;
|
||||
uint8_t dhcp_run_flag = 1;
|
||||
uint8_t dhcp_ok_flag = 0;
|
||||
/* Registration DHCP_time_handler to 1 second timer */
|
||||
wiz_add_timer(DHCP_time_handler, 1000);
|
||||
DHCP_init(sn, buffer);
|
||||
printf("DHCP running\r\n");
|
||||
while (1)
|
||||
{
|
||||
switch (DHCP_run()) // Do the DHCP client
|
||||
{
|
||||
case DHCP_IP_LEASED: // DHCP Acquiring network information successfully
|
||||
{
|
||||
if (dhcp_ok_flag == 0)
|
||||
{
|
||||
dhcp_ok_flag = 1;
|
||||
dhcp_run_flag = 0;
|
||||
}
|
||||
break;
|
||||
}
|
||||
case DHCP_FAILED:
|
||||
{
|
||||
dhcp_run_flag = 0;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (dhcp_run_flag == 0)
|
||||
{
|
||||
printf("DHCP %s!\r\n", dhcp_ok_flag ? "success" : "fail");
|
||||
DHCP_stop();
|
||||
|
||||
/*DHCP obtained successfully, cancel the registration DHCP_time_handler*/
|
||||
wiz_delete_timer(DHCP_time_handler);
|
||||
|
||||
if (dhcp_ok_flag)
|
||||
{
|
||||
getIPfromDHCP(conf_info.ip);
|
||||
getGWfromDHCP(conf_info.gw);
|
||||
getSNfromDHCP(conf_info.sn);
|
||||
getDNSfromDHCP(conf_info.dns);
|
||||
conf_info.dhcp = NETINFO_DHCP;
|
||||
getSHAR(conf_info.mac);
|
||||
wizchip_setnetinfo(&conf_info); // Update network information to network information obtained by DHCP
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief set network information
|
||||
*
|
||||
* First determine whether to use DHCP. If DHCP is used, first obtain the Internet Protocol Address through DHCP.
|
||||
* When DHCP fails, use static IP to configure network information. If static IP is used, configure network information directly
|
||||
*
|
||||
* @param sn: socketid
|
||||
* @param ethernet_buff:
|
||||
* @param net_info: network information struct
|
||||
* @return none
|
||||
*/
|
||||
void network_init(uint8_t *ethernet_buff, wiz_NetInfo *conf_info)
|
||||
{
|
||||
int ret;
|
||||
wizchip_setnetinfo(conf_info); // Configuring Network Information
|
||||
if (conf_info->dhcp == NETINFO_DHCP)
|
||||
{
|
||||
ret = wiz_dhcp_process(0, ethernet_buff);
|
||||
if (ret == 0)
|
||||
{
|
||||
conf_info->dhcp = NETINFO_STATIC;
|
||||
wizchip_setnetinfo(conf_info);
|
||||
}
|
||||
}
|
||||
print_network_information();
|
||||
}
|
||||
Reference in New Issue
Block a user