关于STM32与W5500组成的MODBUS-1(freemodbus)

[复制链接]
350|35
 楼主 | 2017-12-12 09:56 | 显示全部楼层 |阅读模式
要准备的工作:
1 硬件
2 软件
3 网线
4 开始编写代码
 楼主 | 2017-12-12 09:58 | 显示全部楼层
步骤1
--------------------------------
硬件:
STM32开发板、W5500网络模块、电源适配器、杜邦线
 楼主 | 2017-12-12 10:01 | 显示全部楼层
步骤2
--------------------------------
软件:
KEIL_MDK
MODBUS_POLL
 楼主 | 2017-12-12 10:02 | 显示全部楼层
步骤3
--------------------------------
软件:
超五类交叉网线一根
 楼主 | 2017-12-12 10:03 | 显示全部楼层
步骤4
--------------------------------
开始编写代码:
重头戏来啦!
 楼主 | 2017-12-12 10:17 | 显示全部楼层
需要准备的工作:
调通W5500
下载freemodbus固件包
 楼主 | 2017-12-12 10:18 | 显示全部楼层
主程序框架

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册 手机登录

x
 楼主 | 2017-12-12 10:19 | 显示全部楼层
文件的包含路径与结构

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册 手机登录

x
 楼主 | 2017-12-12 10:19 | 显示全部楼层
关于freemodbus 文件结构的内容

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册 手机登录

x
 楼主 | 2017-12-12 10:22 | 显示全部楼层
关于 PORT 接口部分的文件

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册 手机登录

x
 楼主 | 2017-12-12 10:43 | 显示全部楼层
关于W5500的开发,网络上很多的资料,野火的,其他的,官方的 等……
 楼主 | 2017-12-12 10:45 | 显示全部楼层
以下便是 SPI 读写与W5500读写的基本函数
void Write_1_Byte(unsigned short reg, unsigned char dat)
void Write_2_Byte(unsigned short reg, unsigned short dat)
void Write_Bytes(unsigned short reg, unsigned char *dat_ptr, unsigned short size)
void Write_SOCK_1_Byte(SOCKET s, unsigned short reg, unsigned char dat)
void Write_SOCK_2_Byte(SOCKET s, unsigned short reg, unsigned short dat)
void Write_SOCK_4_Byte(SOCKET s, unsigned short reg, unsigned char *dat_ptr)
unsigned char Read_1_Byte(unsigned short reg)
unsigned char Read_SOCK_1_Byte(SOCKET s, unsigned short reg)
unsigned short Read_SOCK_2_Byte(SOCKET s, unsigned short reg)
unsigned short Read_SOCK_Data_Buffer(SOCKET s, unsigned char *dat_ptr)
void Write_SOCK_Data_Buffer(SOCKET s, unsigned char *dat_ptr, unsigned short size)
unsigned int Socket_Connect(SOCKET s)
unsigned int Socket_Listen(SOCKET s)

 楼主 | 2017-12-12 10:47 | 显示全部楼层
void Write_1_Byte(unsigned short reg, unsigned char dat)
{
        /* Set W5500 SCS Low */拉低片选
        W5500_SCS_LOW;
       
        /* Write Address */写地址
        SPI_I2S_SendData(SPI1,reg/256);
        while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);
        SPI_I2S_SendData(SPI1,reg);
        while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);

        /* Write Control Byte */写控制
        SPI_I2S_SendData(SPI1,(FDM1|RWB_WRITE|COMMON_R));
        while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);

        /* Write 1 byte */写入数据
        SPI_I2S_SendData(SPI1,dat);
        while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);

        /* Set W5500 SCS High */拉高
        W5500_SCS_HIGH;
}
 楼主 | 2017-12-12 10:49 | 显示全部楼层
void Write_2_Byte(unsigned short reg, unsigned short dat)写入两个数据与写入一个数据一样,就是把数据分开来写
{
        /* Set W5500 SCS Low */
        W5500_SCS_LOW;
       
        /* Write Address */
        SPI_I2S_SendData(SPI1,reg/256);
        while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);
        SPI_I2S_SendData(SPI1,reg);
        while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);

        /* Write Control Byte */
        SPI_I2S_SendData(SPI1,(FDM2|RWB_WRITE|COMMON_R));
        while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);

        /* Write 2 bytes */
        SPI_I2S_SendData(SPI1,dat/256);
        while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);
        SPI_I2S_SendData(SPI1,dat);
        while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);

        /* Set W5500 SCS High */
        W5500_SCS_HIGH;
}
 楼主 | 2017-12-12 10:50 | 显示全部楼层
void Write_Bytes(unsigned short reg, unsigned char *dat_ptr, unsigned short size)写入N个数据,采用指针写法
{
        unsigned short i;

        /* Set W5500 SCS Low */
        W5500_SCS_LOW;
       
        /* Write Address */
        SPI_I2S_SendData(SPI1,reg/256);
        while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);
        SPI_I2S_SendData(SPI1,reg);
        while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);

        /* Write Control Byte */
        SPI_I2S_SendData(SPI1,(VDM|RWB_WRITE|COMMON_R));
        while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);

        /* Write n bytes */
        for(i=0;i<size;i++)
        {
                SPI_I2S_SendData(SPI1,*dat_ptr);
                while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);

                dat_ptr++;
        }

        /* Set W5500 SCS High */
        W5500_SCS_HIGH;
}
 楼主 | 2017-12-12 10:54 | 显示全部楼层
void Write_SOCK_1_Byte(SOCKET s, unsigned short reg, unsigned char dat)
{
        /* Set W5500 SCS Low */
        W5500_SCS_LOW;
       
        /* Write Address */
        SPI_I2S_SendData(SPI1,reg/256);
        while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);
        SPI_I2S_SendData(SPI1,reg);
        while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);

        /* Write Control Byte */
        SPI_I2S_SendData(SPI1,(FDM1|RWB_WRITE|(s*0x20+0x08)));
        while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);

        /* Write 1 byte */
        SPI_I2S_SendData(SPI1,dat);
        while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);

        /* Set W5500 SCS High */
        W5500_SCS_HIGH;
}
 楼主 | 2017-12-12 10:55 | 显示全部楼层
写入 SOCKET 一个字节,可以看看与SPI的写入有什么不同!
 楼主 | 2017-12-12 10:55 | 显示全部楼层
void Write_SOCK_2_Byte(SOCKET s, unsigned short reg, unsigned short dat)
{
        /* Set W5500 SCS Low */
        W5500_SCS_LOW;
       
        /* Write Address */
        SPI_I2S_SendData(SPI1,reg/256);
        while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);
        SPI_I2S_SendData(SPI1,reg);
        while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);

        /* Write Control Byte */
        SPI_I2S_SendData(SPI1,(FDM2|RWB_WRITE|(s*0x20+0x08)));
        while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);

        /* Write 2 bytes */
        SPI_I2S_SendData(SPI1,dat/256);
        while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);
        SPI_I2S_SendData(SPI1,dat);
        while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);

        /* Set W5500 SCS High */
        W5500_SCS_HIGH;
}
 楼主 | 2017-12-12 10:56 | 显示全部楼层
基本上一样!唯一的修改点就是字节的控制命令不同!
 楼主 | 2017-12-12 10:56 | 显示全部楼层
void Write_SOCK_4_Byte(SOCKET s, unsigned short reg, unsigned char *dat_ptr)
{
        /* Set W5500 SCS Low */
        W5500_SCS_LOW;
       
        /* Write Address */
        SPI_I2S_SendData(SPI1,reg/256);
        while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);
        SPI_I2S_SendData(SPI1,reg);
        while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);

        /* Write Control Byte */
        SPI_I2S_SendData(SPI1,(FDM4|RWB_WRITE|(s*0x20+0x08)));
        while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);

        /* Write 4 bytes */
        SPI_I2S_SendData(SPI1,*dat_ptr);
        while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);

        dat_ptr++;
        SPI_I2S_SendData(SPI1,*dat_ptr);
        while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);

        dat_ptr++;
        SPI_I2S_SendData(SPI1,*dat_ptr);
        while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);

        dat_ptr++;
        SPI_I2S_SendData(SPI1,*dat_ptr);
        while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);

        /* Set W5500 SCS High */
        W5500_SCS_HIGH;
}
扫描二维码,随时随地手机跟帖
您需要登录后才可以回帖 登录 | 注册 手机登录

本版积分规则

快速回复

您需要登录后才可以回帖
登录 | 注册 手机登录
高级模式

论坛热帖

关闭

热门推荐上一条 /4 下一条

分享 快速回复 返回顶部 返回列表