0
问答首页 最新问题 热门问题 等待回答标签广场
我要提问

RS-485

【快乐分享】用单片机做的RS232/485与网络数据透传

【一背景介绍 】     

      以太网具有复杂的通信协议比如TCP/IP协议簇。某个设备想要与网络设备通信或者说要开发一台网络设备,不光需要信号电平和通信协议的转换,还需要一部分复杂的编程工作。当然也需要硬件接口的配合来做信号的变换。所以一般的MCU需要扩展以太网的接口。不仅仅一般的单片机需要扩展,ARM家族,包括包含网络功能的其直系血亲Cortex系列也需要扩展PHY。Cortex系列或者说ARM家族所支持的网络功能是位于OSI七层协议中数据链路层,再具体一点就是MAC层。对于一般的非计算机专业的电工来说,以太网设备的开发有一定的难度。      

    所以,有不少公司开发出了很多针对不同OSI层的芯片,使得开发越来越简化,比如RTL8139D,ENC28J60是包含MAC和PHY层的接口芯片应用这种接口芯片TCP/IP协议簇是在软件中实现,一般包含在操作系统中。

    W5100 内部 集成了全硬件的TCP/IP 协议簇(TCP, UDP, ICMP, IGMP, IPv4, ARP, PPPoE, Ethernet)、4个独立的Socket接口、一个MAC和PHY、支持MDI/MDIX,本议题就是基于该芯片所开发的应用,在没有操作系统的情况下只需要做socket编程即可,也不用理睬网络协议  。

                        

    Socket是应用层与TCP/IP协议簇通信的中间软件抽象层,它是一组接口。它把复杂的TCP/IP协议簇隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部。

【二方案】

      好了,下边详细介绍一下本议题的详细方案,

      首先电源转换是必须的。一是可直接使用的电源适配器较少,二是为了板级电源的稳定。选用物美价廉的MC36063,加上外围元件,成本在一元到两元之间。

      其次,是主控单片机,选用Mega128L,3.3v低电压,内部存储器极其巨大,单片机中的航空母舰。

      再次网络接口,之前说过了选用W5100,好像是棒子国的产品。

      最后是两个通用串行接口RS232/485,不详细介绍了。需要说明一点的是,RS485的接口是用一个RJ45网座是针对具体应用所设计的。

      在本帖最后分享的程序,数据透传的基本功能都已经实现。

       肯定有人会说,这样的产品网上一大把,随便买一个会比自己开发便宜省事。不可否认,事实的确是这样。但是换个角度想想各位在做应用开发的有几个人的工作是具有开创性的。应用开发,只是对应不同的需求将已经成熟的技术拿来放在一起,仅此而已。

【三结构简图】

接口包括一个网口,一个RS232,一个RS485,电源

  

各模块单元连接关系

【四各部分原理图】

电源MC34063,价格好,这个设计是比较经典的电路,很多设计中都是用这个电路

Mega128L最小系统,不多说

网络W5100的外围电路

RS232,这个也没什么说的

RS485,这个也是常用电路

【八部分函数】

1)W5100初始化

void W5100_Init(void)

{

        unsigned char i,j;

        SPI_Write(W5100_MODE,MODE_RST);               

        i=timer0_cnt;

        while(Interval(i)<10);                                

        SPI_Write(W5100_MODE,0);               

        for(i=0;i<4;i++)                                       

                SPI_Write(W5100_GAR+i,EEPROMread(GAR_EE+i));

        for(i=0;i<4;i++)                                       

                SPI_Write(W5100_SUBR+i,EEPROMread(SUBR_EE+i));

        for(i=0;i<6;i++)                                       

                SPI_Write(W5100_SHAR+i,EEPROMread(SHAR_EE+i));

        for(i=0;i<4;i++)                                       

                SPI_Write(W5100_SIPR+i,EEPROMread(SIPR_EE+i));

        SPI_Write(W5100_RMSR,0x55);               

        SPI_Write(W5100_TMSR,0x55);               

        SPI_Write(W5100_IMR,(IMR_CONFLICT|IMR_UNREACH|IMR_S0_INT|IMR_S1_INT|IMR_S2_INT|IMR_S3_INT));

}

2)Socket0初始化

unsigned char Socket0_Init(void)

{

        unsigned char i;

        SPI_Write(W5100_S0_MR,S_MR_TCP);               

        SPI_Write(W5100_S0_CR,S_CR_OPEN);               

        i=SPI_Read(W5100_S0_SSR);

        if(i!=S_SSR_INIT)

        {

                SPI_Write(W5100_S0_CR,S_CR_CLOSE);

                return false;

        }

        //Detect gateway

        for(i=0;i<4;i++)

                SPI_Write(W5100_S0_DIPR+1,(EEPROMread(SIPR_EE+i)+1));               

        SPI_Write(W5100_S0_CR,S_CR_CONNECT);        

        i=timer0_cnt;

        while(Interval(i)<2);                                

        for(i=0;i<6;i++)

                GateWay_PHY=SPI_Read(W5100_S0_DHAR);                                

        if(GateWay_PHY[0]==0xff)

        {

                //No gateway process

        }

        SPI_Write(W5100_S0_CR,S_CR_CLOSE);

        SPI_Write(W5100_S0_MSS,0x05);                        

        SPI_Write(W5100_S0_MSS+1,0xb4);

        return true;

}

3)Socket0连接

unsigned char Socket0_connect(void)

{

        unsigned char i;

        SPI_Write(W5100_S0_PORT,EEPROMread(S0_SPORT_EE));                        

        SPI_Write(W5100_S0_PORT+1,EEPROMread(S0_SPORT_EE+1));

        for(i=0;i<4;i++)                        

                SPI_Write(W5100_S0_DIPR+i,EEPROMread(S0_DIPR_EE+i));

        SPI_Write(W5100_S0_DPORT,EEPROMread(S0_DPORT_EE));                        

        SPI_Write(W5100_S0_DPORT+1,EEPROMread(S0_DPORT_EE+1));

        SPI_Write(W5100_S0_CR,S_CR_OPEN);                        

        i=SPI_Read(W5100_S0_SSR);

        if(i!=S_SSR_INIT)

        {

                SPI_Write(W5100_S0_CR,S_CR_CLOSE);

                return false;

        }

        SPI_Write(W5100_S0_CR,S_CR_CONNECT);                        

        return true;

}

4)Socket0侦听

unsigned char Socket0_listen(void)

{

        unsigned char i;

        SPI_Write(W5100_S0_PORT,EEPROMread(S0_SPORT_EE));                        

        SPI_Write(W5100_S0_PORT+1,EEPROMread(S0_SPORT_EE+1));

        SPI_Write(W5100_S0_CR,S_CR_OPEN);

        i=SPI_Read(W5100_S0_SSR);

        if(i!=S_SSR_INIT)

        {        

                SPI_Write(W5100_S0_CR,S_CR_CLOSE);

                return false;

        }

        SPI_Write(W5100_S0_CR,S_CR_LISTEN);                        

        i=timer0_cnt;

        while(Interval(i)<2);                                       

        i=SPI_Read(W5100_S0_SSR);

        if(i!=S_SSR_LISTEN)

        {

                SPI_Write(W5100_S0_CR,S_CR_CLOSE);

                return false;

        }

        return true;

}

5)Socket0_UDP模式

unsigned char Socket0_UDP(void)

{

        unsigned char i;

        SPI_Write(W5100_S0_PORT,EEPROMread(S0_SPORT_EE));                        

        SPI_Write(W5100_S0_PORT+1,EEPROMread(S0_SPORT_EE+1));

        SPI_Write(W5100_S0_MR,S_MR_UDP);                        

        SPI_Write(W5100_S0_CR,S_CR_OPEN);                        

        i=SPI_Read(W5100_S0_SSR);

        if(i!=S_SSR_UDP)

        {

                SPI_Write(W5100_S0_CR,S_CR_CLOSE);                //Close Socket 0 UDP mode

                return false;

        }

        else

                return true;

}

6)实现的功能是将网络数据保存到片上缓存

unsigned char S0_shift_data(unsigned int size)

{

        unsigned int i;

        if(S0_Mode==0x02)

        {

                if(size!=(Rx_buffer[10]+11))         

                        return false;

                for(i=0;i<4;i++)                                

                        UDP_DIPR=Rx_buffer;

                UDP_DPORT[0]=Rx_buffer[4];               

                UDP_DPORT[1]=Rx_buffer[5];

                size=Rx_buffer[7];                                

                for(i=0;i                        Rx_buffer=Rx_buffer[i+8];

        }

        else

        {

                if(size!=(Rx_buffer[2]+3))

                        return false;

        }

        if(Rx_buffer[0]!=0xaa)

                return false;

        if(Rx_buffer[1]!=0x55)

                return false;

        Rx_data_process();        

        return true;

}

【九资源共享】

W5100中文用户数据手册-v1.1.8.pdf(939.08 KB, 下载次数: 61)2013-7-23 18:48 上传点击文件名下载附件

W5100_Datasheet_v1_1_8.pdf(1.47 MB, 下载次数: 97)2013-7-23 18:47 上传点击文件名下载附件

说明一下,附件源码中针对网络编程是用TCP/IP协议中的UDP协议。

【十结论】

      从整个设计的角度来说,硬件没有难度,数据手册描述的非常详细,按照参考设计来做电路即可。难点可能在socket编程。或许多数电工对各种网络协议并不熟悉,又或者没有socket编程经验。本设计采用的方案不用考虑过多的网络协议,避免了大量网络相关开发,只需将共享程序中的Socket代码稍加修改即可实现简单网络通讯。

The End!

提问者:niggle 地点:- 浏览次数:3268 提问时间:10-15 15:59
我有更好的答案
提 交
14条回答
Dockert 05-14 09:56
好,叔球程序
yzrui 05-17 04:40
猜对有奖不?
便便面天天菜 05-20 01:19


奖励小红花一朵

@linfeng24 这是我的帖子,这个帖子修改了没有十遍也有七八遍


蔡甸一角 05-21 08:03
不得不说  番薯   这帖子真水
vnwueurw 05-21 06:58
貌似pcb画的还像个样子
谢璐晨123 05-13 11:17
shizhe样啊
萌的想要飞 05-15 12:41
好牛啊lz!!
lukyhong 05-15 17:15
其实,老刘还是挺牛逼的
一根玉米须 05-12 19:35


一般水吧。还没到看海的程度吧?



2011jiangzhou 05-15 14:49
好高深的样子,屌丝表示有点看不懂啊。。。。。
hgimtk 05-18 10:39
瓜哥,真NB!!
hope710 05-13 11:43
新手报道              
btvwerwer 05-16 12:35
还好了,要向叔学习啊,如果用无线就更好了,叔你是好样的
mingodong 05-17 12:25
呵呵,W5100是个以太网傻瓜芯片,集成硬件TCP/IP协议,用起来的确很方便,国内的IC设计厂商为啥就不搞这些应用呢?这芯片全球出货量还是蛮大的,就象VS1003B也是一样的,唉,瓷器国最擅长的可能就是盖高楼大厦了。
撰写答案
提 交
1 / 3
1 / 3
相关RS-485
关于RS485隔离防雷的信号地和大地的处理的疑问
关于RS485上拉电阻和下拉电阻阻值的问题
四种RS485防雷保护接地电路
3.3V供电的RS485接口远距离数据通信电路设计
采用C8051F020的RS485串行通信电路设计