当前位置:首页 > 技术 > 正文内容

STM32F103C8T6与DM9051以太网接口实现方案

访客 技术 2026年5月24日 4

一、系统概述

该方案采用DM9051单芯片以太网控制器(集成MAC/PHY,支持SPI/并口),配合STM32F103C8T6微控制器(Cortex-M3内核,72MHz主频,64KB闪存,20KB内存)通过SPI总线构建网络通信模块。系统集成LwIP协议栈实现TCP/IP功能,可完成数据传输、远程控制及信息采集等应用,适用于工业物联网终端设备开发。

二、硬件架构

1. 系统拓扑

graph TD A[STM32F103C8T6] -- SPI --> B[DM9051网络模块] B -- MII --> C[HR911105A变压器] C -- RJ45 --> D[以太网] A -- I2C --> E[传感单元] A -- GPIO --> F[状态指示] G[3.3V电源] --> A,B,C

2. 电路连接

(1)核心接口配置

DM9051引脚 功能说明 STM32引脚 连接要点
VDD 3.3V供电 3.3V 并联100nF去耦电容
GND 接地 GND 与主控共地
CSN 片选信号 PA4 低电平有效
SCLK 时钟信号 PA5 模式0时序(CPOL=0, CPHA=0)
MOSI 主发从收 PA7 数据传输线
MISO 主收从发 PA6 数据传输线
INT 中断输出 PB0 下降沿触发中断
RESET 硬件复位 PB1 低电平复位

(2)物理层设计

  • 变压器接口:HR911105A模块连接TXP/TXN和RXN/RXP引脚,中心抽头通过100nF电容接地
  • RJ45接口:配置TVS保护管(SMAJ5.0A)防静电,LED指示灯连接DM9051的LED引脚

3. 电路设计规范

  • 电源滤波:VDD引脚采用10μF电解电容+100nF陶瓷电容组合
  • SPI时序:配置主模式,8位数据帧,最大时钟频率10MHz(DM9051支持20MHz)
  • 中断处理:INT引脚连接EXTI0中断线,在ISR中读取接收缓冲区数据

三、软件实现

1. 开发环境配置

  • IDE:Keil MDK-ARM V5.38
  • 协议栈:LwIP 2.1.3
  • 外设库:STM32标准外设库 V3.5.0

2. 软件架构

graph TD A[应用层] -- API调用 --> B[LwIP协议栈] B -- 数据交互 --> C[DM9051驱动] C -- SPI通信 --> D[STM32硬件层] D -- GPIO/EXTI --> E[DM9051芯片] E -- MII --> F[网络变压器]

3. 核心代码实现

(1)初始化流程

#include "dm9051.h"
#include "spi.h"
#include "stm32f10x_gpio.h"

// 寄存器地址定义
#define REG_NCR      0x00  
#define REG_TCR      0x01  
#define REG_RCR      0x05  
#define REG_MAC      0x0A  
#define REG_PHY      0x10  

void Init_Dm9051(void) {
  // 硬件复位
  GPIO_ResetBits(GPIOB, GPIO_PIN_1); 
  Delay_ms(10);
  GPIO_SetBits(GPIOB, GPIO_PIN_1);    
  Delay_ms(100);
  
  // 校验芯片ID
  uint16_t chip_id = Read_Reg(VIDL) | (Read_Reg(VIDH) << 8);
  if(chip_id != 0x9051) { /* 错误处理 */ }
  
  // 配置MAC地址
  uint8_t mac_addr[6] = {0x00, 0xE0, 0x4C, 0x12, 0x34, 0x56};
  for(int i=0; i<6; i++) {
    Write_Reg(REG_MAC + i, mac_addr[i]);
  }
  
  // 设置接收控制寄存器
  Write_Reg(REG_RCR, 0x2F);  
  // 设置发送控制寄存器
  Write_Reg(REG_TCR, 0x00);  
  // 使能接收中断
  Write_Reg(IMR, 0x01);  
}

(2)SPI通信函数

// 寄存器写操作
void Write_Reg(uint8_t addr, uint8_t data) {
  GPIO_ResetBits(GPIOA, GPIO_PIN_4); 
  SPI_SendData(addr | 0x80);  
  SPI_SendData(data);
  GPIO_SetBits(GPIOA, GPIO_PIN_4);    
}

// 寄存器读操作
uint8_t Read_Reg(uint8_t addr) {
  GPIO_ResetBits(GPIOA, GPIO_PIN_4); 
  SPI_SendData(addr & 0x7F);  
  uint8_t val = SPI_ReceiveData();
  GPIO_SetBits(GPIOA, GPIO_PIN_4);    
  return val;
}

(3)LwIP配置示例

// lwipopts.h配置
#define MEM_SIZE        8192
#define TCP_MSS         1460
#define IP_ADDR         "192.168.1.100"
#define NETMASK         "255.255.255.0"
#define GW_ADDR         "192.168.1.1"

// 网络接口初始化
void Init_LwIP(void) {
  lwip_init();
  
  struct ip_addr ipaddr, netmask, gw;
  IP4_ADDR(&ipaddr, 192,168,1,100);
  IP4_ADDR(&netmask, 255,255,255,0);
  IP4_ADDR(&gw, 192,168,1,1);
  netif_add(&netif, &ipaddr, &netmask, &gw, NULL, &ethernetif_init, &tcpip_input);
  
  netif_set_default(&netif);
  netif_set_up(&netif);
}

(4)TCP服务器实现

#include "lwip/tcp.h"

// 数据接收回调
err_t Server_Recv(void *arg, struct tcp_pcb *tpcb, struct pbuf *p, err_t err) {
  if(p != NULL) {
    tcp_write(tpcb, p->payload, p->len, 1);
    tcp_output(tpcb);
    pbuf_free(p);
  } else {
    tcp_close(tpcb);
  }
  return ERR_OK;
}

// 服务器初始化
void Start_Server(void) {
  struct tcp_pcb *pcb = tcp_new();
  tcp_bind(pcb, IP_ADDR_ANY, 8080);
  pcb = tcp_listen(pcb);
  tcp_accept(pcb, Server_Recv);
}

四、测试验证

1. 测试工具

  • 网络分析仪(如Wireshark)
  • 命令行工具(Ping, Telnet)
  • 协议分析软件(NetAssist)

2. 验证步骤

  1. 电源检测:确认3.3V供电及SPI信号波形
  2. 芯片识别:读取VID寄存器验证通信
  3. 协议栈验证:通过netif结构体检查IP配置
  4. 通信测试:建立TCP连接并验证数据收发

五、优化建议

1. 性能提升

  • 提升SPI时钟至18MHz
  • 启用静态内存分配(MEM_LIBC_MALLOC=0)
  • 设置中断优先级为抢占式1级

2. 故障排查

  • 连接异常:检查MAC地址配置及TX/RX交叉
  • 数据丢失:增加接收缓冲区大小(PBUF_POOL_SIZE)
  • 通信失败:使用示波器验证SPI时序是否符合要求

六、应用拓展

本方案可扩展为Web服务器或MQTT客户端,通过HTTP协议或云平台实现远程监控,适用于工业数据采集终端、智能网关等应用场景。

相关文章

Linux crontab 详解

1) crontab 是什么cron 是 Linux 的定时任务守护进程;crontab 是用来编辑/查看“按时间周期执行命令”的表(cron table)。常见两类:用户 crontab:每个用户一份(crontab -e 编辑)系统级 crontab / cron.d:可指定执行用户(/etc/crontab、/etc/cron.d/*)2) crontab 时间...

富文本里可以允许的 HTML 属性

一、所有标签默认允许的安全属性(极少)class        (可选)id           (通常建议禁用)title️ 注意:id 容易被滥用做锚点注入,很多系统直接禁用class 允许的话最好只允许固定前缀(如 editor-*)二、a 标签允许属性<a href="" t...

Mac 安装 Node.js 指南

方法一:通过官网安装包(最简单,适合初学者)如果你只是想快速安装并开始使用,这是最直接的方法。访问 Node.js 官网。页面会显示两个版本:LTS (Recommended For Most Users):长期支持版,最稳定。建议选这个。Current:最新特性版,包含最新功能但可能不够稳定。下载 .pkg 安装包并运行。按照安装向导点击“下一步”即可完成。方法二:使用 Homebrew 安装(...

Dom\HTML_NO_DEFAULT_NS 的副作用:自动加闭合标签

在使用Dom\HTMLDocument时,Dom\HTML_NO_DEFAULT_NS 将禁止在解析过程中设置元素的命名空间, 此设置是为了与DOMDocument向后兼容而存在的。当使用它时,已知的一个副作用就是:自动加闭合标签例如 </img> 为什么会这样?当你使用:Dom\HTML_NO_DEFAULT_NS文档会变成 无命名空间模式,此时内部更接近 XML...

Laravel 事件和监听器创建

在 Laravel 中,使用 Artisan 命令创建 Events(事件) 和 Listeners(监听器) 是非常高效的。你可以通过以下几种方式来实现:1. 手动创建单个 Event如果你只想创建一个事件类,可以使用 make:event 命令:Bashphp artisan make:event UserRegistered执行后,文件将生成在 app/Even...

自定义域名解析神器 dnsmasq

什么是 dnsmasq?dnsmasq 是一个轻量级、功能强大的网络服务工具,专为小型和中等规模网络设计。它是一个综合的网络基础设施解决方案[1]。dnsmasq 能做什么?功能说明应用场景DNS 转发与缓存将 DNS 查询转发到上游服务器(ISP、Google DNS 等),并在本地缓存结果加快 DNS 查询速度,减少外部 DNS 流量本地 DNS解析本地网络设备的主机名,无需编辑&n...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。