本帖最后由 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建立连接,请问,我的问题出在哪里,各位看看,拜托啦!
|