yu2726890744 发表于 2024-11-13 16:48:11

关于 32G12K128驱动W5500模块的问题

在别的版块发过这个帖子:https://www.stcaimcu.com/forum.php?mod=viewthread&tid=11799


如题,本人有一块STC32G12K128-LQFP64的最小系统板
通过对网上基于C51驱动W5500案例程序进行简单修改后编译无错误

在不同的板子上可实现功能如STC89C52RC、STM32F103C8T6最小系统板

在STC32G12K128最小系统板上却无法实现功能
下面是main.c程序
/***************************************************************************************
* 硬件连接:
*                        P3^2 -> W5500_RST   
*      P3^3 -> W5500_INT(本例程没有用到中断,此引脚可以不接)   
*      P3^6 -> W5500_SCS      
*      P3^7 -> W5500_SCK   
*      P3^4 -> W5500_MISO   
*      P3^5 -> W5500_MOSI   
***************************************************************************************/

/*例程网络参数*/
//网关:192.168.1.1
//掩码:      255.255.255.0
//物理地址:0C 29 AB 7C 00 01
//本机IP地址:192.168.1.199
//端口0的端口号:5000
//端口0的目的IP地址:192.168.1.190
//端口0的目的端口号:6000

#include <STC32G.h>
#include "W5500.h"                              
#include <string.h>

unsigned int W5500_Send_Delay_Counter =0;

void Delay(unsigned int d);                        //延时函数(ms)

/*******************************************************************************
* 函数名: W5500_Initialization
* 描述    : W5500初始货配置
* 输入    : 无
* 输出    : 无
* 返回值: 无
* 说明    : 无
*******************************************************************************/
void W5500_Initialization(void)
{
      W5500_Init();                //初始化W5500寄存器函数
      Detect_Gateway();      //检查网关服务器
      Socket_Init(0);                //指定Socket(0~7)初始化,初始化端口0
}

/*******************************************************************************
* 函数名: Load_Net_Parameters
* 描述    : 装载网络参数
* 输入    : 无
* 输出    : 无
* 返回值: 无
* 说明    : 网关、掩码、物理地址、本机IP地址、端口号、目的IP地址、目的端口号、端口工作模式
*******************************************************************************/
void Load_Net_Parameters(void)
{
      Gateway_IP = 192;//加载网关参数
      Gateway_IP = 168;
      Gateway_IP = 1;
      Gateway_IP = 1;

      Sub_Mask=255;//加载子网掩码
      Sub_Mask=255;
      Sub_Mask=255;
      Sub_Mask=0;

      Phy_Addr=0x0c;//加载物理地址
      Phy_Addr=0x29;
      Phy_Addr=0xab;
      Phy_Addr=0x7c;
      Phy_Addr=0x00;
      Phy_Addr=0x01;

      IP_Addr=192;//加载本机IP地址
      IP_Addr=168;
      IP_Addr=1;
      IP_Addr=199;

      S0_Port = 0x13;//加载端口0的端口号5000
      S0_Port = 0x88;

//      S0_DIP=192;//加载端口0的目的IP地址
//      S0_DIP=168;
//      S0_DIP=1;
//      S0_DIP=190;
//      
//      S0_DPort = 0x17;//加载端口0的目的端口号6000
//      S0_DPort = 0x70;

      S0_Mode=TCP_SERVER;//加载端口0的工作模式,TCP服务端模式
}

/*******************************************************************************
* 函数名: W5500_Socket_Set
* 描述    : W5500端口初始化配置
* 输入    : 无
* 输出    : 无
* 返回值: 无
* 说明    : 分别设置4个端口,根据端口工作模式,将端口置于TCP服务器、TCP客户端或UDP模式.
*                        从端口状态字节Socket_State可以判断端口的工作情况
*******************************************************************************/
void W5500_Socket_Set(void)
{
      if(S0_State==0)//端口0初始化配置
      {
                if(S0_Mode==TCP_SERVER)//TCP服务器模式
                {
                        if(Socket_Listen(0)==TRUE)
                              S0_State=S_INIT;
                        else
                              S0_State=0;
                }
                else if(S0_Mode==TCP_CLIENT)//TCP客户端模式
                {
                        if(Socket_Connect(0)==TRUE)
                              S0_State=S_INIT;
                        else
                              S0_State=0;
                }
                else//UDP模式
                {
                        if(Socket_UDP(0)==TRUE)
                              S0_State=S_INIT|S_CONN;
                        else
                              S0_State=0;
                }
      }
}

/*******************************************************************************
* 函数名: Process_Socket_Data
* 描述    : W5500接收并发送接收到的数据
* 输入    : s:端口号
* 输出    : 无
* 返回值: 无
* 说明    : 本过程先调用S_rx_process()从W5500的端口接收数据缓冲区读取数据,
*                        然后将读取的数据从Rx_Buffer拷贝到Temp_Buffer缓冲区进行处理。
*                        处理完毕,将数据从Temp_Buffer拷贝到Tx_Buffer缓冲区。调用S_tx_process()
*                        发送数据。
*******************************************************************************/
void Process_Socket_Data(SOCKET s)
{
      unsigned short size;
      size=Read_SOCK_Data_Buffer(s, Rx_Buffer);
      memcpy(Tx_Buffer, Rx_Buffer, size);                     
      Write_SOCK_Data_Buffer(s, Tx_Buffer, size);
}

/*******************************************************************************
* 函数名: main
* 描述    : 主函数,用户程序从main函数开始运行
* 输入    : 无
* 输出    : 无
* 返回值: int:返回值为一个16位整形数
* 说明    : 无
*******************************************************************************/
int main(void)
{
      WTST = 0;//设置程序指令延时参数,赋值为0可将CPU执行指令的速度设置为最快
EAXFR = 1; //扩展寄存器(XFR)访问使能
CKCON = 0; //提高访问XRAM速度
      
P0M1 = 0x00;   P0M0 = 0x00;   //设置为准双向口
      P1M1 = 0x00;   P1M0 = 0x00;   //设置为准双向口
      P2M1 = 0x00;   P2M0 = 0x00;   //设置为准双向口
      P3M1 = 0x00;   P3M0 = 0x00;   //设置为准双向口
      P4M1 = 0x00;   P4M0 = 0x00;   //设置为准双向口
      P5M1 = 0x00;   P5M0 = 0x00;   //设置为准双向口
      P6M1 = 0x00;   P6M0 = 0x00;   //设置为准双向口
      P7M1 = 0x00;   P7M0 = 0x00;   //设置为准双向口

      Load_Net_Parameters();                //装载网络参数      
      W5500_Hardware_Reset();                //硬件复位W5500
      W5500_Initialization();                //W5500初始货配置
      
      while (1)
      {
                W5500_Socket_Set();//W5500端口初始化配置
               
                W5500_Interrupt_Process();//W5500中断处理程序框架

                if((S0_Data & S_RECEIVE) == S_RECEIVE)//如果Socket0接收到数据
                {
                        S0_Data&=~S_RECEIVE;
                        Process_Socket_Data(0);//W5500接收并发送接收到的数据
                }
                else if(W5500_Send_Delay_Counter >= 3000)//定时发送字符串
                {
                        if(S0_State == (S_INIT|S_CONN))
                        {
                              S0_Data&=~S_TRANSMITOK;
                              memcpy(Tx_Buffer, "\r\nHello World!\r\n", 23);      
                              Write_SOCK_Data_Buffer(0, Tx_Buffer, 23);//指定Socket(0~7)发送数据处理,端口0发送23字节数据
                        }
                        W5500_Send_Delay_Counter=0;
                }
                W5500_Send_Delay_Counter++;
      }
}

/*******************************************************************************
* 函数名: Delay
* 描述    : 延时函数(ms)
* 输入    : d:延时系数,单位为毫秒
* 输出    : 无
* 返回    : 无
* 说明    : 延时是利用Timer2定时器产生的1毫秒的计数来实现的
*******************************************************************************/
void Delay(unsigned intx)
{
    unsigned int i,j;

    for(j=0;j<5;j++)
                for(i=0;i<x;i++);
}
案例使用的是TCP Server端
具体的问题是引脚间连线后,插上网线用cmd Ping代码中192.168.1.199地址,无法通信
而在STC89C52RC和STM32F103C8T6上不用修改程序即可运行

想问下C51和STM32例程如果进行移植应该怎么移植到STC32G12K128上




DebugLab 发表于 2024-11-13 17:39:18

没用过W5500,移植到 32G12K128需要用keil C251编译器

yu2726890744 发表于 2024-11-13 18:09:55

DebugLab 发表于 2024-11-13 17:39
没用过W5590,移植到AI32G12K128需要用keil C251编译器
{:4_167:}

我是这样移植C51程序的,头文件改成STC32G.h后keilv5配置C251选择STC32G芯片,代码大小什么的也改了,编译0报错
之前移植C51例程驱动TFT的也是这个步骤,但在STC32G上完美运行,移植C51驱动W5500模块到STC32G上无法实现正常功能

EasyLad 发表于 2024-11-13 18:52:15

STC32G上的SPI输出管脚要设置为推挽输出模式

yu2726890744 发表于 2024-11-14 09:48:25

EasyLad 发表于 2024-11-13 18:52
STC32G上的SPI输出管脚要设置为推挽输出模式

{:4_167:}这样吗?我都给设置成推挽模式了,还是ping不通

hande5 发表于 2024-11-14 10:45:07

{:4_165:}

zxcv1973 发表于 2024-11-14 11:44:44

yu2726890744 发表于 2024-11-14 09:48
这样吗?我都给设置成推挽模式了,还是ping不通
你这把主机SPI的MISO管脚也设置为输出管脚了,直接给整短路了

yu2726890744 发表于 2024-11-14 14:13:31

zxcv1973 发表于 2024-11-14 11:44
你这把主机SPI的MISO管脚也设置为输出管脚了,直接给整短路了

佬,那请问这样设置对吗?我才刚学这个东西但着急搞毕设{:4_167:}
页: [1]
查看完整版本: 关于 32G12K128驱动W5500模块的问题