本帖最后由 地瓜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! |