CH394Q_IPV6使用学习
注意到沁恒CH394Q芯片DS1手册的第8章节新增了IPv6功能的介绍,本文旨在一起解读学习并初步简单运用一下
1.手册介绍说明:
从第8章的概述中可以得到几点信息:
(1)IPv6是在原有功能基础上新增,并不影响基本功能,用不到则无需关注
(2)进入IPv6模式后,芯片将既支持IPv4,也支持IPv6
(3)进入IPv6的方式是设置对应寄存器,且进入IPv6后,诸如收发通信、读写寄存器等基本操作流程等同IPv4
(4)为了和IPv4寄存器做区分,引入页的概念,通过页的选择从而来选择操作的是哪部分寄存器
更多详细介绍参考芯片手册:CH394DS1.PDF - 南京沁恒微电子股份有限公司
2.接下来看一下详细的寄存器改动
(1)新增页选择寄存器
总结:共有页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寄存器介绍
对于这些寄存器的详细介绍和说明,请移步手册,本文不多赘述
3.手册介绍看完后,实操如何使用?
测试程序:官网EVT中的例程,CH394Q_TCP_CLIENT例程(下载链接:CH394EVT.ZIP - 南京沁恒微电子股份有限公司)
测试工具:TCPIPDEBUG网络调试工具(下载链接:TcpIpDebug.ZIP - 南京沁恒微电子股份有限公司)
测试芯片:CH394Q
(1)开启IPv6
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地址
②点击创建服务器,填写对应的源端口号
③创建后,服务器前的绿色圆形为灰色,点击启动服务器,当绿色圆形亮后,服务器打开成功