12
返回列表 发新帖

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

[复制链接]
楼主: stm32lover
 楼主 | 2017-12-12 10:57 | 显示全部楼层
写入了四个字节。
这个似乎指针加了四次。
 楼主 | 2017-12-12 11:04 | 显示全部楼层
unsigned char Read_1_Byte(unsigned short reg)
{
        unsigned char 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,(FDM1|RWB_READ|COMMON_R));
        while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);

        /* Write a dummy byte */
        i=SPI_I2S_ReceiveData(SPI1);
        SPI_I2S_SendData(SPI1,0x00);
        while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);

        /* Read 1 byte */
        i=SPI_I2S_ReceiveData(SPI1);

        /* Set W5500 SCS High*/
        W5500_SCS_HIGH;
        return i;
}
 楼主 | 2017-12-12 11:04 | 显示全部楼层
unsigned char Read_SOCK_1_Byte(SOCKET s, unsigned short reg)
{
        unsigned char 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,(FDM1|RWB_READ|(s*0x20+0x08)));
        while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);

        /* Write a dummy byte */
        i=SPI_I2S_ReceiveData(SPI1);
        SPI_I2S_SendData(SPI1,0x00);
        while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);

        /* Read 1 byte */
        i=SPI_I2S_ReceiveData(SPI1);

        /* Set W5500 SCS High*/
        W5500_SCS_HIGH;
        return i;
}
 楼主 | 2017-12-12 11:05 | 显示全部楼层
读取一个字节,就是谢了一个 Write Control Byte 读控制字节
 楼主 | 2017-12-12 11:05 | 显示全部楼层
unsigned short Read_SOCK_2_Byte(SOCKET s, unsigned short reg)
{
        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,(FDM2|RWB_READ|(s*0x20+0x08)));
        while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);

        /* Write a dummy byte */
        i=SPI_I2S_ReceiveData(SPI1);
        SPI_I2S_SendData(SPI1,0x00);
        while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);
        i=SPI_I2S_ReceiveData(SPI1);

        SPI_I2S_SendData(SPI1,0x00);
        while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);
        i*=256;
        i+=SPI_I2S_ReceiveData(SPI1);

        /* Set W5500 SCS High*/
        W5500_SCS_HIGH;
        return i;
}
 楼主 | 2017-12-12 11:06 | 显示全部楼层
读取两个字节 拼接成一个 unsigned short 类型的数据
 楼主 | 2017-12-12 11:11 | 显示全部楼层
unsigned short Read_SOCK_Data_Buffer(SOCKET s, unsigned char *dat_ptr)
{
        unsigned short rx_size;
        unsigned short offset, offset1;
        unsigned short i;
        unsigned char j;

        rx_size=Read_SOCK_2_Byte(s,Sn_RX_RSR);
        if(rx_size==0)                /* if no data received, return */
                return 0;
        if(rx_size>1460)
                rx_size=1460;

        offset=Read_SOCK_2_Byte(s,Sn_RX_RD);
        offset1=offset;
        offset&=(S_RX_SIZE-1);                /* Calculate the real physical address */

        /* Set W5500 SCS Low */
        W5500_SCS_LOW;

        /* Write Address */
        SPI_I2S_SendData(SPI1,offset/256);
        while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);
        SPI_I2S_SendData(SPI1,offset);
        while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);

        /* Write Control Byte */
        SPI_I2S_SendData(SPI1,(VDM|RWB_READ|(s*0x20+0x18)));                /* Read variable size */
        while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);
        j=SPI_I2S_ReceiveData(SPI1);
       
        if((offset+rx_size)<S_RX_SIZE)
        {
                /* Read Data */
                for(i=0;i<rx_size;i++)
                {
                        SPI_I2S_SendData(SPI1,0x00);                /* Send a dummy byte */
                        while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);
                        j=SPI_I2S_ReceiveData(SPI1);
                        *dat_ptr=j;
                        dat_ptr++;
                }
        }
        else
        {
                offset=S_RX_SIZE-offset;
                for(i=0;i<offset;i++)
                {
                        SPI_I2S_SendData(SPI1,0x00);                 /* Send a dummy byte */
                        while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);
                        j=SPI_I2S_ReceiveData(SPI1);
                        *dat_ptr=j;
                        dat_ptr++;
                }
                /* Set W5500 SCS High*/
                W5500_SCS_HIGH;

                /* Set W5500 SCS Low */
                W5500_SCS_LOW;
                /* Write Address */
                SPI_I2S_SendData(SPI1,0x00);
                while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);
                SPI_I2S_SendData(SPI1,0x00);
                while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);
                /* Write Control Byte */
                SPI_I2S_SendData(SPI1,(VDM|RWB_READ|(s*0x20+0x18)));                /* Read variable size */
                while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);
                j=SPI_I2S_ReceiveData(SPI1);
                /* Read Data */
                for(;i<rx_size;i++)
                {
                        SPI_I2S_SendData(SPI1,0x00);                /* Send a dummy byte */
                        while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);
                        j=SPI_I2S_ReceiveData(SPI1);
                        *dat_ptr=j;
                        dat_ptr++;
                }
        }
        /* Set W5500 SCS High*/
        W5500_SCS_HIGH;

        /* Update offset*/
        offset1+=rx_size;
        Write_SOCK_2_Byte(s, Sn_RX_RD, offset1);
        Write_SOCK_1_Byte(s, Sn_CR, RECV);                                        /* Write RECV Command */
        return rx_size;
}
读取N个数据
 楼主 | 2017-12-12 11:15 | 显示全部楼层
void Write_SOCK_Data_Buffer(SOCKET s, unsigned char *dat_ptr, unsigned short size)
{
        unsigned short offset,offset1;
        unsigned short i;

        offset=Read_SOCK_2_Byte(s,Sn_TX_WR);
        offset1=offset;
        offset&=(S_TX_SIZE-1);                /* Calculate the real physical address */

        /* Set W5500 SCS Low */
        W5500_SCS_LOW;

        /* Write Address */
        SPI_I2S_SendData(SPI1,offset/256);
        while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);
        SPI_I2S_SendData(SPI1,offset);
        while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);

        /* Write Control Byte */
        SPI_I2S_SendData(SPI1,(VDM|RWB_WRITE|(s*0x20+0x10)));                /* Read variable size */
        while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);

        if((offset+size)<S_TX_SIZE)
        {
                /* Write Data */
                for(i=0;i<size;i++)
                {
                        SPI_I2S_SendData(SPI1,*dat_ptr);                /* Send a byte*/
                        while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);
               
                        dat_ptr++;
                }
        }
        else
        {
                offset=S_TX_SIZE-offset;
                for(i=0;i<offset;i++)
                {
                        SPI_I2S_SendData(SPI1,*dat_ptr);                 /* Send a byte */
                        while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);
       
                        dat_ptr++;
                }
                /* Set W5500 SCS High*/
                W5500_SCS_HIGH;

                /* Set W5500 SCS Low */
                W5500_SCS_LOW;
                /* Write Address */
                SPI_I2S_SendData(SPI1,0x00);
                while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);
                SPI_I2S_SendData(SPI1,0x00);
                while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);
                /* Write Control Byte */
                SPI_I2S_SendData(SPI1,(VDM|RWB_WRITE|(s*0x20+0x10)));                /* Read variable size */
                while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);
                /* Read Data */
                for(;i<size;i++)
                {
                        SPI_I2S_SendData(SPI1,*dat_ptr);                /* Send a byte */
                        while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);
               
                        dat_ptr++;
                }
        }
        /* Set W5500 SCS High*/
        W5500_SCS_HIGH;

        /* Updata offset */
        offset1+=size;
        Write_SOCK_2_Byte(s, Sn_TX_WR, offset1);
        Write_SOCK_1_Byte(s, Sn_CR, SEND);                                        /* Write SEND Command */
}
感觉 这些东西吗 理解起来或许少有问题 但是 拿来会用就行楼!
 楼主 | 2017-12-12 11:18 | 显示全部楼层
unsigned int Socket_Connect(SOCKET s)
{
        /* Set Socket n in TCP mode */
        Write_SOCK_1_Byte(s,Sn_MR,MR_TCP);
        /* Open Socket n */
        Write_SOCK_1_Byte(s,Sn_CR,OPEN);

        Delay_ms(5);        /* Wait for a moment */
        if(Read_SOCK_1_Byte(s,Sn_SR)!=SOCK_INIT)
        {
                Write_SOCK_1_Byte(s,Sn_CR,CLOSE);                /* Close Socket n */
                return FALSE;
        }

        /* Set Socket n in Server mode */
        Write_SOCK_1_Byte(s,Sn_CR,CONNECT);
        return TRUE;
}
 楼主 | 2017-12-12 11:18 | 显示全部楼层
unsigned int Socket_Listen(SOCKET s)
{
        /* Set Socket n in TCP mode */
        Write_SOCK_1_Byte(s,Sn_MR,MR_TCP);
        /* Open Socket n */
        Write_SOCK_1_Byte(s,Sn_CR,OPEN);

        Delay_ms(5);        /* Wait for a moment */
        if(Read_SOCK_1_Byte(s,Sn_SR)!=SOCK_INIT)
        {
                Write_SOCK_1_Byte(s,Sn_CR,CLOSE);                /* Close Socket n */
                return FALSE;
        }

        /* Set Socket n in Server mode */
        Write_SOCK_1_Byte(s,Sn_CR,LISTEN);
        Delay_ms(5);        /* Wait for a moment */
        if(Read_SOCK_1_Byte(s,Sn_SR)!=SOCK_LISTEN)
        {
                Write_SOCK_1_Byte(s,Sn_CR,CLOSE);                /* Close Socket n */
                return FALSE;
        }
        return TRUE;
}
 楼主 | 2017-12-12 11:19 | 显示全部楼层
监听 某地址的端口号

其实感觉这个W5500 要想弄明白 还是很复杂的!
| 2017-12-12 11:22 | 显示全部楼层
请问一下 这个使用 模拟的IO口 可以实现吗?
 楼主 | 2017-12-12 11:22 | 显示全部楼层
可以是可以,但是强烈不推荐!强烈不推荐!不推荐!
 楼主 | 2017-12-12 11:28 | 显示全部楼层
/* W5500 configuration */
void W5500_Configuration()
{
    unsigned char array[6];

    GPIO_SetBits(GPIO_W5500_RST_PORT, GPIO_W5500_RST_Pin);
    Delay_ms(100);    /*delay 100ms 使用systick 1ms时基的延时*/
    while((Read_1_Byte(PHYCFGR)&LINK)==0);                 /* Waiting for Ethernet Link */

    Write_1_Byte(MR, RST);
    Delay_ms(20);                /*delay 20ms */

    /* Set Gateway IP as: 192.168.1.1 */
    array[0]=192;
    array[1]=168;
    array[2]=1;
    array[3]=1;
    Write_Bytes(GAR, array, 4);

    /* Set Subnet Mask as: 255.255.255.0 */
    array[0]=255;
    array[1]=255;
    array[2]=255;
    array[3]=0;
    Write_Bytes(SUBR, array, 4);

    /* Set MAC Address as: 0x48,0x53,0x00,0x57,0x55,0x00 */
    array[0]=0x48;
    array[1]=0x53;
    array[2]=0x00;
    array[3]=0x57;
    array[4]=0x55;
    array[5]=0x00;
    Write_Bytes(SHAR, array, 6);

    /* Set W5500 IP as: 192.168.1.128 */
    array[0]=192;
    array[1]=168;
    array[2]=1;
    array[3]=128;
    Write_Bytes(SIPR, array, 4);
}
 楼主 | 2017-12-12 11:28 | 显示全部楼层
W5500 配置与初始化
| 2017-12-12 11:29 | 显示全部楼层
这个W5500 和野火的差不多吧!
扫描二维码,随时随地手机跟帖
您需要登录后才可以回帖 登录 | 注册 手机登录

本版积分规则

快速回复

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

论坛热帖

关闭

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

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