打印

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

[复制链接]
5073|40
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
地瓜patch|  楼主 | 2013-7-23 13:39 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 地瓜patch 于 2013-8-28 11:20 编辑

【一背景介绍 】     
      以太网具有复杂的通信协议比如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<size;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;
}


【九资源共享】

ENC28J60.pdf (1.68 MB)

W5100中文用户数据手册-v1.1.8.pdf (939.08 KB)

W5100_Datasheet_v1_1_8.pdf (1.47 MB)

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


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

The End!
评分
参与人数 6威望 +16 收起 理由
linfeng24 + 3 很给力!
xlhtracy + 5 赞一个!
kk5290122 + 4 很给力!
gaoyang9992006 -2 神马都是浮云
sdnumcu + 4 赞一个!

查看全部评分

相关帖子

沙发
vv123456| | 2013-7-23 15:08 | 只看该作者
好,叔球程序

使用特权

评论回复
板凳
赛普拉斯| | 2013-7-23 15:17 | 只看该作者
猜对有奖不?

使用特权

评论回复
地板
地瓜patch|  楼主 | 2013-7-23 15:36 | 只看该作者
本帖最后由 地瓜patch 于 2013-8-23 07:10 编辑
赛普拉斯 发表于 2013-7-23 15:17
猜对有奖不?

奖励小红花一朵

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


使用特权

评论回复
评分
参与人数 3威望 +10 收起 理由
kk5290122 + 2 神马都是浮云
gaoyang9992006 + 2
qin552011373 + 6 山寨
5
赛普拉斯| | 2013-7-23 15:37 | 只看该作者
:lol

使用特权

评论回复
6
qin552011373| | 2013-7-23 15:47 | 只看该作者
不得不说  番薯   这帖子真水

使用特权

评论回复
7
qin552011373| | 2013-7-23 15:48 | 只看该作者
貌似pcb画的还像个样子

使用特权

评论回复
评论
地瓜patch 2013-7-24 15:38 回复TA
看到你夸奖的机会不多啊,谢啦,大牛 
8
seven102856| | 2013-7-23 17:22 | 只看该作者
shizhe样啊

使用特权

评论回复
9
tubin85| | 2013-7-23 19:21 | 只看该作者
新手报道

使用特权

评论回复
10
zqh1630| | 2013-7-23 19:36 | 只看该作者
好牛啊lz!!

使用特权

评论回复
11
sdnumcu| | 2013-7-23 22:49 | 只看该作者
其实,老刘还是挺牛X的

使用特权

评论回复
12
Yang_Jia| | 2013-7-24 09:44 | 只看该作者
顶个~

使用特权

评论回复
13
地瓜patch|  楼主 | 2013-7-24 15:37 | 只看该作者
本帖最后由 地瓜patch 于 2013-8-23 07:09 编辑
qin552011373 发表于 2013-7-23 15:47
不得不说  番薯   这帖子真水

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



使用特权

评论回复
14
地瓜patch|  楼主 | 2013-7-24 15:38 | 只看该作者
sdnumcu 发表于 2013-7-23 22:49
其实,老刘还是挺牛X的

你们将来一定会比我更牛X。加油吧

使用特权

评论回复
15
568581185| | 2013-7-24 16:42 | 只看该作者
好高深的样子,屌丝表示有点看不懂啊。。。。。

使用特权

评论回复
16
kk5290122| | 2013-7-24 16:43 | 只看该作者
瓜哥,真NB!!

使用特权

评论回复
17
MRZHANGge| | 2013-7-24 16:44 | 只看该作者
新手报道              

使用特权

评论回复
18
vv123456| | 2013-7-24 16:48 | 只看该作者
还好了,要向叔学习啊,如果用无线就更好了,叔你是好样的

使用特权

评论回复
19
古道热肠| | 2013-7-24 16:53 | 只看该作者
呵呵,W5100是个以太网傻瓜芯片,集成硬件TCP/IP协议,用起来的确很方便,国内的IC设计厂商为啥就不搞这些应用呢?这芯片全球出货量还是蛮大的,就象VS1003B也是一样的,唉,瓷器国最擅长的可能就是盖高楼大厦了。

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
断沙竹 + 1 赞一个!
20
sdnumcu| | 2013-7-24 21:41 | 只看该作者
地瓜patch 发表于 2013-7-24 15:38
你们将来一定会比我更牛X。加油吧

哎:(累死我了,老刘

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:出一块TI-PLABS-AMP-EVM

1168

主题

11245

帖子

27

粉丝