CH394Q_IPV6使用学习

注意到沁恒CH394Q芯片DS1手册的第8章节新增了IPv6功能的介绍,本文旨在一起解读学习并初步简单运用一下

1.手册介绍说明:

image

从第8章的概述中可以得到几点信息:

(1)IPv6是在原有功能基础上新增,并不影响基本功能,用不到则无需关注

(2)进入IPv6模式后,芯片将既支持IPv4,也支持IPv6

(3)进入IPv6的方式是设置对应寄存器,且进入IPv6后,诸如收发通信、读写寄存器等基本操作流程等同IPv4

(4)为了和IPv4寄存器做区分,引入页的概念,通过页的选择从而来选择操作的是哪部分寄存器

更多详细介绍参考芯片手册:CH394DS1.PDF - 南京沁恒微电子股份有限公司

2.接下来看一下详细的寄存器改动

(1)新增页选择寄存器

image

总结:共有页0、页1、页2,操作寄存器前,要确保页设置对应正确

(2)原本的页0中相关寄存器改动

①全局中断寄存器:GINT(0x0015) ---  该寄存器bit2,bit3,bit5由原来的保留位变为IPv6相关的标志位,其他不变

②Socket n 模式寄存器:Sn_MODE(0x0000) ---  socket由原本的4种(关闭、TCP、UDP、MACRAW)改动为10种(关闭、TCP4、UDP4、IPRAW4、MACRAW、TCP6、UDP6、IPRAW6、TCPD、UDPD)

其他模式顾名思义都是单独用于IPv4或者IPv6,对于TCPD/UDPD这两个模式,手册8.3.1注释有详细说明,此处总结下:在这两个模式下,通过选择对应的操作可以在无需重新设置socket模式的前提下实现IPv4和IPv6功能的切换

③Socket n 控制寄存器:Sn_CTRL(0x0001)  ----  除了对新增的模式做了对应功能的介绍,还新增了0x84(CONNECT6)和0xA0(SEND6)这两个控制命令,用于TCP6/TCPD模式下,发起tcp连接以及发生tcp数据,详细介绍见手册

④Socket n 状态寄存器:Sn_STA(0x0003) ---   除了对新增的模式做了对应功能的介绍,还新增了两个查询状态IPRAW4和IPRAW6,详细介绍见手册

⑤Socket n IP协议寄存器:Sn_IPPRO(0x0014) ---  新增寄存器,在IPRAW4和IPRAW6模式下用以设置socket的IP协议号,详细介绍见手册

⑥Socket n IP生存时间寄存器:Sn_TTL(0x0016) ---  设置IPv4和IPv6下的IP层首部生存时间,详细介绍见手册

(3)新增页1和页2寄存器介绍

image

 

image

 

image

 对于这些寄存器的详细介绍和说明,请移步手册,本文不多赘述

 3.手册介绍看完后,实操如何使用?

测试程序:官网EVT中的例程,CH394Q_TCP_CLIENT例程(下载链接:CH394EVT.ZIP - 南京沁恒微电子股份有限公司

测试工具:TCPIPDEBUG网络调试工具(下载链接:TcpIpDebug.ZIP - 南京沁恒微电子股份有限公司

测试芯片:CH394Q

(1)开启IPv6

image

 

    i = CH394Q_Read(0x3E00);
    printf("IPV-:%x\r\n",i);

(2)设置本地链路地址和网关

 1     uint8_t link_local_addr[16] = {
 2         // fe80::5054:3
 3         0xfe, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 4         0x00, 0x00, 0x00, 0x00, 0x50, 0x54, 0x00, 0x05,
 5     };
 6     uint8_t  CH394Q_GWIPAddr_IPv6[16] = {
 7              // fe80:1723::fe50:1
 8             0xfe, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 9             0x82, 0xea, 0x07, 0xff, 0xfe, 0xe1, 0x97, 0x76};    /* CH394Q 网关 */
10     i = CH394Q_Read(0x3E00);
11     printf("3IPV-:%x\r\n",i);
12     Delay_Ms(100);
13     if( i == 1)
14     {
15         CH394Q_Write(0x3f00,1);
16         while(CH394Q_Read(0x3f00) != 1);//切到页1
17 
18         for(uint8_t i = 0; i < 16; i ++)
19         {
20             CH394Q_Write(0x000000 + (i << 8),link_local_addr[i]);
21         }
22 //        CH394Q_Write(0x3f00,0);
23 //        while(CH394Q_Read(0x3f00) != 0);//切到页0
24         Delay_Ms(1);
25 //        CH394Q_Write(0x3f00,1);
26 //        while(CH394Q_Read(0x3f00) != 1);//切到页1
27         for(uint8_t i = 0; i < 16; i ++)
28         {
29             CH394Q_Write(0x002000 + (i << 8),CH394Q_GWIPAddr_IPv6[i]);
30         }
31 
32         CH394Q_Write(0x3f00,0);
33         while(CH394Q_Read(0x3f00) != 0);//切到页0

 (3)创建TCP客户端并发起连接

CH394Q_TCPClientSocketInit6(0,0x09,CH394Q_Port,DesIP_IPv6,DesPort_IPv6);  //参数中,0x09是新增TCP6模式

void CH394Q_TCPClientSocketInit6(uint8_t sockindex, uint8_t mode, uint16_t sourport, uint8_t *desip, uint16_t desport)
{
    CH394Q_Socket_Init(sockindex, mode, sourport);
    CH394Q_Socket_Connect6(sockindex, desip, desport);
    socketmode[sockindex] = TCPClient;
}

void CH394Q_Socket_Connect6(uint8_t sockindex, uint8_t *desip, uint16_t desport)
{
//   设置目的IP由常规的CH394Q_SetSn_DIP(sockindex, desip);函数转变为下面一段

    CH394Q_Write(0x3f00,1);
    while(CH394Q_Read(0x3f00) != 1);//切到页1
    for(uint8_t i = 0; i < 16; i ++)
    {
        CH394Q_Write(0x000008 + (i << 8),desip[i]);//socket0
    }
    CH394Q_Write(0x3f00,0);
    while(CH394Q_Read(0x3f00) != 0);//切到页0

//下面例程原代码保持不动
    CH394Q_SetSn_DPORT(sockindex, desport);
    CH394Q_SetSn_CTRL(sockindex, Sn_CTRL_CONNECT);
    while (CH394Q_GetSn_CTRL(sockindex));
}

 注释:为保证代码操作不出错,建议每次切换到页1或页2操作相应寄存器结束后,切回初始页0保证操作的正确性

(4)使用TCPIPDebug网络调试工具,创建一个IPv6服务器

①选择和394相连的网卡,选择IPv6地址

image

 ②点击创建服务器,填写对应的源端口号

image

 ③创建后,服务器前的绿色圆形为灰色,点击启动服务器,当绿色圆形亮后,服务器打开成功

image

image

 

posted on 2025-09-01 15:50  Lqqq123  阅读(16)  评论(0)    收藏  举报

导航