打印
[技术讨论]

回复 “以太网芯片] ch395能不能和LWIP结合?”

[复制链接]
148|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
丙丁先生|  楼主 | 2025-7-6 06:18 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
CH395(或CH395T)是一款集成了以太网、WiFi和USB功能的网络芯片,常用于嵌入式系统中实现网络通信。LWIP是一个轻量级的开源TCP/IP协议栈,广泛应用于嵌入式设备中。将CH395与LWIP结合使用是完全可行的,但需要一定的配置和驱动开发工作。

以下是CH395与LWIP结合的完整例程和步骤:



1. 硬件连接
确保CH395与主控芯片(如STM32、ESP32等)正确连接。典型连接包括:
SPI接口:用于与CH395通信。
中断引脚:用于接收CH395的中断信号。
电源和地:提供稳定的电源。



2. 软件环境
开发环境:Keil、IAR、STM32CubeIDE等。
LWIP库:下载并集成到项目中。
CH395驱动库:从官方获取CH395的驱动库(通常为C语言实现)。



3. 配置LWIP
在`lwipopts.h`中配置LWIP以适应CH395的特性:
```c
#define LWIP_TCP 1
#define LWIP_UDP 1
#define LWIP_DHCP 1
#define LWIP_DNS 1
#define NO_SYS 1 // 使用异步API
#define LWIP_STATS 0
#define LWIP_CHECKSUM_CTRL_PER_NETIF 0
```



### **4. CH395驱动初始化**
在`main.c`中初始化CH395和LWIP:
```c
#include "ch395.h"
#include "lwip/init.h"
#include "lwip/netif.h"
#include "lwip/tcpip.h"
#include "netif/etharp.h"

struct netif lwip_netif;
ip4_addr_t ipaddr, netmask, gw;

void CH395_IRQHandler(void) {
    CH395_HandleIRQ(); // 处理CH395中断
}

int main(void) {
    // 初始化硬件(SPI、GPIO等)
    HAL_Init();
    CH395_Init(); // 初始化CH395

    // 配置LWIP IP地址
    IP4_ADDR(&ipaddr, 192, 168, 1, 100);
    IP4_ADDR(&netmask, 255, 255, 255, 0);
    IP4_ADDR(&gw, 192, 168, 1, 1);

    // 初始化LWIP
    lwip_init();
    netif_add(&lwip_netif, &ipaddr, &netmask, &gw, NULL, CH395_ethernetif_init, tcpip_input);
    netif_set_up(&lwip_netif);

    // 启动TCPIP任务
    sys_timeout(1000, periodic_timer, NULL);

    while (1) {
        // 主循环
        sys_check_timeouts();
    }
}
```



5. CH395与LWIP的接口函数
实现`ethernetif_init`和`low_level_input`函数:
```c
err_t CH395_ethernetif_init(struct netif *netif) {
    // 初始化CH395硬件
    CH395_Init();
    return ERR_OK;
}

err_t low_level_input(struct netif *netif, struct pbuf *p) {
    // 从CH395接收数据
    uint8_t buffer[1500];
    int len = CH395_ReadData(buffer, sizeof(buffer));
    if (len > 0) {
        void *payload = LWIP_MEMPOOL_ALLOC(len);
        if (payload == NULL) return ERR_MEM;
        memcpy(payload, buffer, len);
        struct pbuf *pb = pbuf_alloc(PBUF_RAW, len, PBUF_RAM);
        memcpy(pb->payload, payload, len);
        LWIP_MEMPOOL_FREE(payload);
        return netif->input(p, netif);
    }
    return ERR_ABRT;
}
```



6. 发送数据
在LWIP中发送数据时,调用CH395的发送函数:
```c
err_t CH395_low_level_output(struct netif *netif, struct pbuf *p) {
    // 通过CH395发送数据
    CH395_WriteData((uint8_t *)p->payload, p->len);
    return ERR_OK;
}
```



7. 完整例程
以下是一个完整的例程框架:
```c
#include "ch395.h"
#include "lwip/init.h"
#include "lwip/netif.h"
#include "lwip/tcpip.h"
#include "netif/etharp.h"

struct netif lwip_netif;
ip4_addr_t ipaddr, netmask, gw;

void CH395_IRQHandler(void) {
    CH395_HandleIRQ();
}

err_t CH395_ethernetif_init(struct netif *netif) {
    CH395_Init();
    return ERR_OK;
}

err_t low_level_input(struct netif *netif, struct pbuf *p) {
    uint8_t buffer[1500];
    int len = CH395_ReadData(buffer, sizeof(buffer));
    if (len > 0) {
        void *payload = LWIP_MEMPOOL_ALLOC(len);
        if (payload == NULL) return ERR_MEM;
        memcpy(payload, buffer, len);
        struct pbuf *pb = pbuf_alloc(PBUF_RAW, len, PBUF_RAM);
        memcpy(pb->payload, payload, len);
        LWIP_MEMPOOL_FREE(payload);
        return netif->input(p, netif);
    }
    return ERR_ABRT;
}

err_t CH395_low_level_output(struct netif *netif, struct pbuf *p) {
    CH395_WriteData((uint8_t *)p->payload, p->len);
    return ERR_OK;
}

void periodic_timer(void *arg) {
    // 定期处理CH395中断
    CH395_CheckInt();
    sys_timeout(1000, periodic_timer, NULL);
}

int main(void) {
    HAL_Init();
    CH395_Init();

    IP4_ADDR(&ipaddr, 192, 168, 1, 100);
    IP4_ADDR(&netmask, 255, 255, 255, 0);
    IP4_ADDR(&gw, 192, 168, 1, 1);

    lwip_init();
    netif_add(&lwip_netif, &ipaddr, &netmask, &gw, NULL, CH395_ethernetif_init, tcpip_input);
    netif_set_up(&lwip_netif);

    sys_timeout(1000, periodic_timer, NULL);

    while (1) {
        sys_check_timeouts();
    }
}
```



8. 调试与测试
Ping测试:使用`ping`命令测试LWIP是否成功接收和发送数据。
日志输出:在关键位置添加日志输出,检查数据是否正确传输。
性能优化:根据实际需求调整LWIP和CH395的配置,优化性能。



通过以上步骤,您可以将CH395与LWIP成功结合,实现嵌入式系统的网络通信功能。

使用特权

评论回复

相关帖子

沙发
丙丁先生|  楼主 | 2025-7-6 06:19 | 只看该作者
[技术讨论]  回复 “以太网芯片] ch395能不能和LWIP结合?”  https://bbs.21ic.com/icview-3467920-1-1.html

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1156

主题

4493

帖子

7

粉丝