2.9 rt-thread实操 stm32l496 w5500
1.W5500内置MAC和PHY,内置硬件协议栈。
2、名词解释。MAC是将上层的数据进行封包,PHY是物理层。


3、W5500想要使用,依赖的东西

使能SAL组件和网络接口

使能WIZNET软件包




退出配置,更新软件包,生成更新工程,修改硬件spi2引脚

找到挂载spi驱动总线的文件,发现没有打开宏定义,kconfig处理下

这几个宏都应该可配
BSP_USING_SPI2,BSP_SPI2_RX_USING_DMA,BSP_SPI2_TX_USING_DMA

编译运行后提示让我注册spi设备到总线上,定位在wiz.c文件中,原来wiz初始化时,有注释提示我们要注册设备到总线上,因为我的内核是rt-thread5.1.0的,所以用它注释的注册总线方法是不好使的,我用我当前版本的方式进行设备注册到总线上

烧录运行后正常。
ifconfig可以看到信息,待结合网线实际测试下

结合网线实际测试正常
#include "thread_webserver.h" #include <rtthread.h> #define DBG_TAG "net_thread" #define DBG_LVL DBG_LOG #include <rtdbg.h> #include <arpa/inet.h> /* 包含 ip_addr_t 等地址相关的头文件 */ #include <netdev.h> /* 包含全部的 netdev 相关操作接口函数 */ #include <sal_socket.h> #include <sys/socket.h> #include <rtdef.h> #include <sal_netdb.h> ip_addr_t ip_addr; void set_static_ip_all() { struct netdev *netdev; netdev = netdev_get_by_name("W5500"); //netdev = netdev_get_by_family(AF_WIZ); netdev_dhcp_enabled(netdev, 0);//disable shcp ip_addr.addr = inet_addr("192.168.0.252"); netdev_set_ipaddr(netdev, &ip_addr); ip_addr.addr = inet_addr("192.168.0.1"); netdev_set_gw(netdev, &ip_addr); ip_addr.addr = inet_addr("255.255.255.0"); netdev_set_netmask(netdev, &ip_addr); } //MSH_CMD_EXPORT(set_static_ip,set_static_ip); #define SERVER_HOST "192.168.0.55" #define SERVER_PORT 6800 //void tcpclient(int argc, char **argv) int tcpclient(void) { struct sockaddr_in client_addr; struct sockaddr_in server_addr; struct netdev *netdev = RT_NULL; int ret = 0; char *recv_data; struct hostent *host; int sockfd = -1, bytes_received = 0; char *send_data = "send net test"; // /* 接收到的参数小于 3 个 */ // if (argc < 3) // { // rt_kprintf("Usage: tcpclient URL PORT\n"); // rt_kprintf("Like: tcpclient 192.168.12.44 5000\n"); // return ; // } // // url = argv[1]; // port = strtoul(argv[2], 0, 10); //*((struct in_addr *)host->h_addr) /* 通过名称获取 netdev 网卡对象 */ netdev = netdev_get_by_name("W5500"); if (netdev == RT_NULL) { LOG_E("get network interface device W5500 failed.\n"); return -RT_ERROR; } LOG_D("11111"); /* 分配用于存放接收数据的缓冲 */ recv_data = rt_malloc(1024); if (recv_data == RT_NULL) { LOG_E("No memory\n"); return -RT_ERROR; } LOG_D("22222"); if ((sockfd = socket(AF_WIZ, SOCK_STREAM, 0)) < 0) { LOG_E("Socket create failed.\n"); return -RT_ERROR; } LOG_D("33333"); /* 初始化预连接的服务端地址 */ server_addr.sin_family = AF_WIZ; server_addr.sin_port = htons(SERVER_PORT); LOG_D("77777"); server_addr.sin_addr.s_addr = (inet_addr(SERVER_HOST)); LOG_D("56666"); rt_memset(&(server_addr.sin_zero), 0, sizeof(server_addr.sin_zero)); LOG_D("44444"); /* 连接到服务端 */ if (connect(sockfd, (struct sockaddr *)&server_addr, sizeof(struct sockaddr)) < 0) { /* 连接失败 */ LOG_E("Connect fail!\n"); closesocket(sockfd); /* 释放接收缓冲 */ rt_free(recv_data); return -RT_ERROR; } else { LOG_D("connect success"); } while (1) { /* 从 sock 连接中接收最大 BUFSZ - 1 字节数据 */ bytes_received = recv(sockfd, recv_data, 1024 - 1, 0); if (bytes_received < 0) { /* 接收失败,关闭这个连接 */ closesocket(sockfd); LOG_E("\nreceived error,close the socket.\r\n"); /* 释放接收缓冲 */ rt_free(recv_data); break; } else if (bytes_received == 0) { /* 打印 recv 函数返回值为 0 的警告信息 */ LOG_D("\nReceived warning,recv function return 0.\r\n"); continue; } /* 有接收到数据,把末端清零 */ recv_data[bytes_received] = '\0'; if (strncmp(recv_data, "q", 1) == 0 || strncmp(recv_data, "Q", 1) == 0) { /* 如果是首字母是 q 或 Q,关闭这个连接 */ closesocket(sockfd); LOG_D("\n got a'q'or'Q',close the socket.\r\n"); /* 释放接收缓冲 */ rt_free(recv_data); break; } else { /* 在控制终端显示收到的数据 */ rt_kprintf("\nReceived data = %s", recv_data); } /* 发送数据到 sock 连接 */ ret = send(sockfd, send_data, strlen(send_data), 0); if (ret < 0) { /* 接收失败,关闭这个连接 */ closesocket(sockfd); LOG_E("\nsend error,close the socket.\r\n"); rt_free(recv_data); break; } else if (ret == 0) { /* 打印 send 函数返回值为 0 的警告信息 */ LOG_D("\n Send warning,send function return 0.\r\n"); } } return -RT_ERROR; } void net_test_thread(void *parameter) { LOG_D("net_test_thread..."); set_static_ip_all(); tcpclient(); while (1) { LOG_D("net_test_thread..."); rt_thread_mdelay(500); } }


浙公网安备 33010602011771号