打印
[以太网芯片]

求助:由ch9121改ch395下的TCP SERVER问题

[复制链接]
4076|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
gaobq|  楼主 | 2021-1-27 10:43 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 gaobq 于 2021-1-27 14:13 编辑

PCB板设计的网口芯片使用了CH9121,由于上位机要求工作在TCP SERVER模式下,由于CH9121是透传芯片,多个上位机连接时,不好控制单片机发出数据的流向,于是改为了CH395Q。
CH395和CH9121供电、时钟和网口都是兼容的,所以把9121吹下来,重新焊上了395Q。
依据exam5编写STM32F103驱动的TCP SERVER程序。

void CH395_TCP_Server_Init(void)
{
  uint8_t i,k=0,Flag1=1;

  CH395Q_RST(); //复位,要求大于50ms

  //1-和CH395Q握手,握手失败一直蜂鸣器报警
  while(Flag1)
  {
    i = CH395CMDCheckExist(0x55);
    if(i==0xAA) break;
    k++;
    if(k>=10)
    {
      k = 0;
      HAL_GPIO_WritePin(BUZZER_GPIO_Port, BUZZER_Pin, GPIO_PIN_SET);//响一声
      osDelay(300);
      HAL_GPIO_WritePin(BUZZER_GPIO_Port, BUZZER_Pin, GPIO_PIN_RESET);
    }
    osDelay(100);
  }

  //2-握手通过,修改波特率
  if(Flag1)
  {   
    //CH395CMDSetUartBaudRate(1000000);
    //MX_UART4_Init_1000000bps();
  }
  osDelay(10);

   //3-初始化CH395相关变量,IP地址等
  InitCH395InfParam();
  CH395CMDSetIPAddr(CH395Inf.IPAddr);                              /* 设置CH395的IP地址 */
  CH395CMDSetGWIPAddr(CH395Inf.GWIPAddr);                          /* 设置网关地址 */
  CH395CMDSetMASKAddr(CH395Inf.MASKAddr);                          /* 设置子网掩码,默认为255.255.255.0*/   
  osDelay(10);
  i = CH395CMDInitCH395();                                         /* 初始化CH395芯片,500ms */
  osDelay(100);

  CH395SetSocketRecvBuf(0,0,4);           /* Socket 0接收缓冲区4*512 = 2K,发送缓冲区 2*512 = 1K*/
  CH395SetSocketSendBuf(0,4,2);  
  CH395SetTCPMss(TcpMss);   

  //4-检测物理连接,网线正常可以PING通,
  //keeplive_set();   //保活定时器参数设置
  Flag1 = 1;        
  k = 0;
  osDelay(100);
  while(Flag1)
  {               
    /* 等待以太网连接成功*/
    if(CH395CMDGetPHYStatus() == PHY_DISCONN)                     /* 查询CH395是否连接 */
    {
      Delay_ms(200);   //未连接则等待200MS后再次查询
      k++;  
      if(k>=10) Flag1=0;
    }
    else
    {
      break;
    }
  }

  //5-获取MAC地址
  CH395CMDGetMACAddr(CH395MACAddr);

  //6-建立TCP连接,socket 0为TCP Server模式
  Server_Connect();
}

-----------------------------------------------------------------------------------
void Server_Connect(void)
{
  uint8_t i;

  memset(&SockInf,0,sizeof(SockInf));                              /* 将SockInf[0]全部清零*/
  memcpy(SockInf.IPAddr,Socket0DesIP,sizeof(Socket0DesIP));        /* 将目的IP地址写入 */
  SockInf.SourPort = Socket0SourPort;                              /* 源端口 */
  SockInf.ProtoType = PROTO_TYPE_TCP;                              /* TCP模式 */
  SockInf.TcpMode = TCP_SERVER_MODE;

  /* socket 0为TCP 服务器模式 */
  CH395SetSocketDesIP(0,SockInf.IPAddr);                           /* 设置socket 0目标IP地址 */         
  CH395SetSocketProtType(0,SockInf.ProtoType);                     /* 设置socket 0协议类型 */
  CH395SetSocketDesPort(0,SockInf.DesPort);                        /* 设置socket 0目的端口 */
  CH395SetSocketSourPort(0,SockInf.SourPort);                      /* 设置socket 0源端口 */
  i = CH395OpenSocket(0);                                          /* 打开socket 0 */
  mStopIfError(i);                                                 /* 检查是否成功 */
  i = CH395TCPListen(0);                                           /* TCP连接 */
  mStopIfError(i);            

  while(1)
  {
    //osDelay(1);
    CH395GlobalInterrupt();
  }
}

----------------------------------------------------------------------------
CH395_TCP_Server_Init()程序执行完毕,能够ping通CH395Q,说明395正常工作了;
Server_Connect()程序执行,打开socket0 和TCP侦听,返回值都是00,成功执行;
ch395的例程都是检测到中断后,执行 CH395GlobalInterrupt();我的PCB上没有接395的中断管脚,于是就在while(1)中不断的执行 CH395GlobalInterrupt();
但TCP Clinet客户端一直不能和CH395的SERVER建立连接,请问,我的问题出在哪里,各位看看,拜托啦!


使用特权

评论回复
沙发
WCHTech2| | 2021-1-27 15:33 | 只看该作者
参考附件中的程序
CH395_Exam_1-4__Final3.zip (19.22 MB)

使用特权

评论回复
板凳
gaobq|  楼主 | 2021-1-27 16:28 | 只看该作者
谢谢您,我再仔细研究一下

使用特权

评论回复
地板
banalsheep| | 2021-9-8 16:53 | 只看该作者
大神可以晒一下ch9121例程么?第一次用以太网芯片

使用特权

评论回复
5
banalsheep| | 2021-9-8 16:53 | 只看该作者
WCHTech2 发表于 2021-1-27 15:33
参考附件中的程序

版主,咱有官方的CH9121例程么?第一次用以太网芯片

使用特权

评论回复
6
gaobq|  楼主 | 2021-9-9 10:24 | 只看该作者
banalsheep 发表于 2021-9-8 16:53
版主,咱有官方的CH9121例程么?第一次用以太网芯片

CH9121是个透传芯片,使用官方的配置软件,配置好网口和串口参数,单片机端就是一个串口通信,没什么例程的

使用特权

评论回复
7
banalsheep| | 2021-9-9 13:09 | 只看该作者
gaobq 发表于 2021-9-9 10:24
CH9121是个透传芯片,使用官方的配置软件,配置好网口和串口参数,单片机端就是一个串口通信,没什么例程 ...

我需要uart配置等。。。

使用特权

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

本版积分规则

166

主题

804

帖子

5

粉丝