【WCH以太网接口系列芯片】STM32+CH390+Lwip协议栈简单应用测试

本篇文章基于STM32F103和CH390H芯片进行例程移植及相关注意事项,简单验证TCP\UDP\Ping基础功能。

硬件:STM32F103开发板+沁恒CH390H的评估版图一示,SPI使用接口为:INT->PA0,RST->PA1,CS->PA2,SCK->PA5,MISO->PA6,MOSI->PA7,WOL->PA8。

图一

软件移植:采用的沁恒官方提供的CH390EVT中的Lwip例程进行移植,主要为CH390的驱动和Lwip协议栈部分,移植过程中注意有一个文件名为slipif.c文件会在编译过程中报错(图二),该文件可以删除,正常情况下用不到,如果需要可以重新自定义下。

图二

移植完成后,注意main函数中lwip初始化函数,IP地址为192.168.1.120,子网掩码255.255.255.0,网关为192.168.1.1。

复制代码
void init_lwip_netif(void)
{
    struct ip4_addr ipaddr, netmask, gateway;

    IP4_ADDR(&ipaddr, 192, 168, 1, 120);
    IP4_ADDR(&netmask, 255, 255, 255, 0);
    IP4_ADDR(&gateway, 192, 168, 1, 1);
    /* Initialize the LwIP stack without RTOS */
    lwip_init();
    /* add the network interface (IPv4/IPv6) without RTOS */
    netif_add(&ch390_netif, &ipaddr, &netmask, &gateway, NULL,
              &ethernetif_init, &ethernet_input);

    /* Registers the default network interface */
    netif_set_default(&ch390_netif);
    netif_set_up(&ch390_netif);
}

一、Ping测试:

CH390正常初始化后,用网线将CH390和电脑直连,PHY连接正常后D1灯会亮起,若未正常初始化评估版灯微亮,检查SPI接口时序和打印信息是否异常,图三打印信息。

图三

使用电脑CMD命令,ping192.168.1.120地址,图四示:

图四

正常ping通,说明网络连接正常,若出现ping不通,但网口灯已经常亮,建议关闭电脑防火墙,重新复位测试。


二、TCP连接测试

(1)TCP Client:main函数注意修改tcp_clinet_int函数中的服务器IP地址,即电脑的IP地址为192.168.1.21,服务器端口为1000,本地端口是随机的。

复制代码
void tcp_client_init(void)
 {
     ip4_addr_t server_ip;
     IP4_ADDR(&server_ip, 192, 168, 1, 21);

     tcp_client_pcb = tcp_new();

     tcp_connect(tcp_client_pcb, (const ip_addr_t *)&server_ip,
                 1000, tcp_client_connected);
     tcp_err(tcp_client_pcb, tcp_client_error);
 }

采用网络测试工具建立TCP服务器,注意IP地址和端口号,建立成功后,会建立连接。程序中是回环测试,通过软件向CH390发送数据后,会进行数据回传,图五示。

图五

(2)TCP Server:注意本地端口为2300,图五示,创建一个TCP客户端连接,目标IP为192.168.1.120,目标端口为2300。

复制代码
void tcp_server_init(void)
{
    tcp_server_pcb = tcp_new_ip_type(IPADDR_TYPE_ANY);
    tcp_bind(tcp_server_pcb, IP_ANY_TYPE, 2300);
    tcp_server_pcb = tcp_listen(tcp_server_pcb);
    tcp_accept(tcp_server_pcb, tcp_server_accept);
}


三、UDP连接测试

UDP模式中:注意本地端口为2300,对端UDP端口为1000。

复制代码
void udpecho_init(void)
{
    struct udp_pcb *udp_echo_pcb;
    udp_echo_pcb = udp_new();

    udp_bind(udp_echo_pcb, IP_ADDR_ANY, 2300);
    udp_connect(udp_echo_pcb, IP_ADDR_ANY, 1000);
    udp_recv(udp_echo_pcb, udpecho_recv, NULL);
}

通过软件建立UDP连接,图六示,注意目标端口和本地端口是否和程序设置对应。

以上为STM32+CH390H的应用测试,代码自取连接:https://files.cnblogs.com/files/blogs/805237/CH390.rar?t=1712129908&download=true