MCU/FPGA没有以太网?CH390系列MAC+PHY二合一芯片轻松来搞定

描述

  目录

一、前言

二、CH390简介    

 2.1、框图   

 2.2、特点    

 2.3、和其他型号对比    

 2.4、获取资源

三、评估板

四、测试    

 4.1、MAC测试        

  4.1.1、测试发送速率    

 4.2、唤醒测试    

 4.3、LWIP测试       

  4.3.1、UDP测试        

  4.3.2、TCP服务端测试        

  4.3.3、TCP客户端测试

五、总结
 

一、前言

    很多MCU可能没有以太网MAC,但是又有联网需求,此时一款MAC+PHY集一体的芯片就是刚需;类似的FPGA平台要集成MAC的IP既占用空间又需要额外IP成本,MAC+PHY芯片也特别适用于FPGA平台,省得再自己去折腾MAC。

    刚好看到了沁恒的CH390系列MAC+PHY芯片,完美的解决了上述需求。CH390系列具备封装小、集成度高外围BOM简单、开发简单等优点,确实是一款小而美,解决刚需的芯片。我们本文就来分享下该款芯片。

二、CH390简介

    CH390是沁恒一款自带10/100M以太网介质传输层(MAC)和物理层收发器(PHY)的工业级以太网控制器芯片,支持10BASE-T的CAT3、4、5和100BASE-TX的CAT5、6连接,支持Auto-MDIX,低功耗设计,符合IEEE 802.3u规范。CH390内置16K字节SRAM,支持并行接口和SPI串行接口,用于兼容各种MCU、MPU、DSP,FPGA等控制器。

2.1、框图

    CH390的系统框图如下, 集PHY+MAC于一体。

以太网

2.2、特点

    CH390系列具备以下特点,下面红色部分是个人觉得比较独特的。

1)集以太网介质传输层(MAC)和物理层(PHY)一体。常规MCU+CH390也可以方便地实现以太网连接。

2)不同型号分别支持SPI、8位并口、16位并口, 适合MCU和FPGA等主控使用。

以太网

CH390L支持8位并行接口和16位并行接口,CH390F支持8位并行接口,CH390H和CH390D支持SPI串行接口。CH390F/H具有独立的I/O电源引脚VDDIO,支持1.2V~3.3V接口电压。

3)每个芯片内置唯一的以太网MAC地址,无需另外购买或分配,无需外部EEPROM。

4)集成基于DSP算法实现的低功耗10/100M收发器Transceiver。

5)支持Auto-MDIX交换TX/RX,自动识别正负信号线。

6)支持10BASE-T和100BASE-TX及自动协商。

7)支持UTP CAT5、CAT6双绞线,支持120米传输距离。

8)支持用于远程唤醒的样本帧、链路状态变化和魔法包事件。

9)支持IEEE 802.3x的流量控制。

10)支持IPv4 TCP/UDP和IPv6 TCP/UDP校验和的生成和检查。

这个特性非常有用,可以降低主控运行协议栈时的校验计算时间,极大地提高效率。我们之前有测试过协议栈跑起来很大一部分主控的消耗就是计算校验和。

11)内置50Ω阻抗匹配电阻,内置晶体振荡器所需电容,外围电路精简。这降低了BOM成本,价格敏感产品选型时这就是很大的优势。

12)支持可选的外部EEPROM配置芯片。

13)支持QFN20(CH390D)/QFN28(CH390F)/QFN32X5(CH390H)/LQFP48(CH390L),QFN20封装尺寸才3x3mm, 特别适合空间受限应用场景。

2.3、和其他型号对比

    市面上也能搜到其他厂家的类似的芯片比如DAVICOM的DM9000和DM9051,和CH390的对应如下。

以太网

    CH390H引脚兼容DM9051,CH390L引脚兼容DM9000。可以看到CH390的特点、优点还是很明显的,CH390有更宽的VIO电压域、更低的运行功耗,更小的封装尺寸,更高的集成度(BOM要求简单成本低),并提供MAC地址。

2.4、获取资源

官网提供了相关的资料,可从如下地址下载:

资源包:包括CH390评估板说明,原理图及参考例程等内容。

 

https://www.wch.cn/downloads/CH390EVT_ZIP.html

 

数据手册:

 

https://www.wch.cn/downloads/CH390DS1_PDF.html

 

三、评估板

    评估板实物图如下,我手里的是CH390D,就以该评估板配合自己的主控开发板来进行相关功能的测试。

以太网

原理图如下:

可以看到外围器件超级简单,CH390D外围只需要5个电容加一个25MHz晶体,降低了BOM成本,同时PCB布局布线也很简单,占用空间也小。

网络变压器这边只需要两个电阻和两个电容。

以太网

以太网

四、测试

4.1、MAC测试

这里使用STM32F103ZET6的开发板测试,使用Demo:EVTEXAMNET_MACNET_MAC.uvprojx。

我这里用的是MDKV5.43 默认ARMCC编译器版本是版本6,需要配置为对应版本。

以太网以太网

切换到编译器版本6,编译会提示

 

../SRC/CMSIScore_cm3.h(1204): error: unknown type name 'inline'

 

等错误

需要更新CMSIS, 更新core_cm3.h为

 

https://github.com/ARM-software/CMSIS_6/blob/main/CMSIS/Core/Include/core_cm3.h

 

删除core_cm3.c

添加以下文件

 

https://github.com/ARM-software/CMSIS_6/blob/main/CMSIS/Core/Include/cmsis_version.h
https://github.com/ARM-software/CMSIS_6/blob/main/CMSIS/Core/Include/cmsis_compiler.h
https://github.com/ARM-software/CMSIS_6/blob/main/CMSIS/Core/Include/cmsis_armclang.h
https://github.com/ARM-software/CMSIS_6/blob/main/CMSIS/Core/Include/m-profile/cmsis_armclang_m.h

 

还提示 NVIC- >IP[NVIC_InitStruct- >NVIC_IRQChannel] = tmppriority;错误则

 

NVIC- >IP[NVIC_InitStruct- >NVIC_IRQChannel] = tmppriority;

 

改为

 

NVIC- >IPR[NVIC_InitStruct- >NVIC_IRQChannel] = tmppriority;

 

CH390.h中选择接口模式

我这里使用SPI,如果支持并口可配置对应的接口,

 


#define CH390_INTERFACE_SPI     // CH390H/CH390D
// #define CH390_INTERFACE_8_BIT   // CH390L/CH390F 8-bit mode
// #define CH390_INTERFACE_16_BIT  // CH390L 16-bit mode

 

如果并口支持FSMC还可以使用FSMC,可以极大提高效率。

 

#define USE_FSMC 1

 

对应使用的引脚如下

 

#define CH390_INT_PIN GPIO_Pin_0 // PA0
#define CH390_RST_PIN GPIO_Pin_1 // PA1
#define CH390_CS_PIN GPIO_Pin_4 // PA4
#define CH390_SCK_PIN GPIO_Pin_5 // PA5
#define CH390_MISO_PIN GPIO_Pin_6 // PA6
#define CH390_MOSI_PIN GPIO_Pin_7 // PA7
#define CH390_WOL_PIN GPIO_Pin_8 // PA8

 

默认调试串口为USART1 PA9/PA10

 


#ifndef DEBUG
#define DEBUG DEBUG_UART1
#endif

 

接线如下

以太网

运行后打印如下,打印状态以及收到的数据包,说明收发正常。

以太网

4.1.1、发送测试

使用STM32F103的SPI1,时钟来源于APB2(72MHz)。

CH390_Interface.c中配置分频

 

SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_2;

 

STM32F103最大可配置为

2分频36MHz, CH390实际支持最大72MHz。

main.c中ch390_int_handler下注释掉打印

 

//print_packet(receive_buff, length);

 

main.c中可以修改一次发送大小

 

#define TEST_DATA_LEN 1500

 

main函数中连续发送

/**

* @brief  Main program

* @param  None

* @retval None

*/

int main(void)

{

  //Delay_Init();

  SysTick_Config(SystemCoreClock/1000);

  NVIC_EnableIRQ(SysTick_IRQn);

  USART_Printf_Init(115200);

  ch390_gpio_init();

  #ifdef CH390_INTERFACE_SPI

  ch390_spi_init();

  #endif

  ch390_hardware_reset();

  // Don't read/write CH390 registers within 10ms after power on

  Delay_Ms(10);

  ch390_default_config();

  ch390_print_info();

  init_packet_data();

  while (1)

  {

    if (ch390_get_int_pin())

    {

      ch390_int_handler();

    }

    if (phy_linked)

    {

      ch390_send_packet(packet_data, TEST_DATA_LEN);

    }

  }

}

    以上简单测试一下。CH390使用SPI时最大支持72M时钟, 网上看到用CH390单发速度有68.6Mbps,可能的优化方向是,提高SPI时钟频率到最大72MHz,优化SPI发送接口比如使用DMA等。 也可以使用8/16位并口的型号,使用fsmc提高效率。

4.2、唤醒测试

使用Demo:EVTEXAMWakeOnLanWakeOnLan.uvprojx

关键代码如下

配置GPIO引脚输入中断,这里用PA8,中断可唤醒MCU:

 

ch390_interrupt_init();  

 

配置CH390唤醒帧过滤器:

 


sample_frame_filter_config(); 
// Enable magic packet and sample packet wake up

 

配置帧唤醒事件

 

ch390_wakeup_config(WCR_MAGICEN | WCR_SAMPLEEN); 

 

每收到5包,配置CH390进入等待唤醒状态,MCU进入WFI状态,如果唤醒则产生WOL中断,触发MCU唤醒继续执行。

 


// Sleep every 5 packets received
if(receive_count >= 5)
{
  receive_count = 0;
  ch390_wake_notify();
  printf("Sleeprn");
  __WFI();
  printf("Wake on LAN!rn");
}

 

运行打印如下

以太网

4.3、LWIP测试

使用Demo:EVTEXAMLwIP_ExampleLwIP_Example.uvprojx

Cc.h中

 


typedef unsigned long    u32_t;
typedef signed long    s32_t;

 

改为

 


typedef unsigned int    u32_t;
typedef signed int    s32_t;

 

开发板IP配置 IP4_ADDR(&ipaddr, 192, 168, 1, 120);

所以电脑配置为同网段 192, 168, 1, 119

main.c中可以配置是否使能DHCP,这里不使能

 

#define USE_DHCP 0

 

4.3.1、UDP测试

main.c中测试udp收发

 


udpecho_init();
//tcp_client_init();
//tcp_server_init();

 

本地端口是2300,远程端口是1000

 


void udpecho_init(void)
{
  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);
}

 

上位机中使用网络调试助手收发测试,开发板收到数据原样返回,测试功能正常。

以太网

4.3.2、TCP服务端测试

 


//udpecho_init();
//tcp_client_init();
tcp_server_init();

 

开发板收到数据原样返回, 使用上位机调试助手,测试收发如下,功能测试正常。

以太网

4.3.3、TCP客户端测试

 


//udpecho_init();
tcp_client_init();
//tcp_server_init();

 

如下函数中修改服务端地址和端口

 

void tcp_client_init(void)
{
  extern struct netif ch390_netif;
  ip4_addr_t server_ip;
  uint16_t server_port = 2200;
  IP4_ADDR(&server_ip, 192, 168, 1, 119);
  tcp_client_pcb = tcp_new();
  if (tcp_client_pcb == NULL)
  {
    printf("tcp_new errorn");
    return;
  }
  tcp_bind(tcp_client_pcb, IP_ANY_TYPE, 0);
  tcp_err(tcp_client_pcb, tcp_client_error);
  tcp_connect(tcp_client_pcb, (const ip_addr_t *)&server_ip,
  server_port, tcp_client_connected);
}

 

开发板收到数据原样返回, 使用上位机调试助手,测试收发如下,功能测试正常。

以太网

五、总结

    从上可以看出CH390集成MAC+PHY,适用于无MAC的MCU和FPGA等主控快速实现以太网连接。CH390有较宽的VIO电压域、较低的功耗、小的封装尺寸、高的集成度(BOM要求简单成本低)、提供MAC地址等明显的优点,是相应需求时非常不错的选择。有了该芯片,妈妈再也不用担心我无MAC的MCU和无MAC IP的FPGA联网了。

    官方提供了STM32F103的例程, 可以直接基于此实现以太网RAW、UDP、TCP数据收发的应用,其他平台移植也很简单,只需要实现简单的接口替换即可。

审核编辑 黄宇

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分