RS-485
【一背景介紹 】
以太網(wǎng)具有復(fù)雜的通信協(xié)議比如TCP/IP協(xié)議簇。某個(gè)設(shè)備想要與網(wǎng)絡(luò)設(shè)備通信或者說(shuō)要開發(fā)一臺(tái)網(wǎng)絡(luò)設(shè)備,不光需要信號(hào)電平和通信協(xié)議的轉(zhuǎn)換,還需要一部分復(fù)雜的編程工作。當(dāng)然也需要硬件接口的配合來(lái)做信號(hào)的變換。所以一般的MCU需要擴(kuò)展以太網(wǎng)的接口。不僅僅一般的單片機(jī)需要擴(kuò)展,ARM家族,包括包含網(wǎng)絡(luò)功能的其直系血親Cortex系列也需要擴(kuò)展PHY。Cortex系列或者說(shuō)ARM家族所支持的網(wǎng)絡(luò)功能是位于OSI七層協(xié)議中數(shù)據(jù)鏈路層,再具體一點(diǎn)就是MAC層。對(duì)于一般的非計(jì)算機(jī)專業(yè)的電工來(lái)說(shuō),以太網(wǎng)設(shè)備的開發(fā)有一定的難度。
所以,有不少公司開發(fā)出了很多針對(duì)不同OSI層的芯片,使得開發(fā)越來(lái)越簡(jiǎn)化,比如RTL8139D,ENC28J60是包含MAC和PHY層的接口芯片應(yīng)用這種接口芯片TCP/IP協(xié)議簇是在軟件中實(shí)現(xiàn),一般包含在操作系統(tǒng)中。
W5100 內(nèi)部 集成了全硬件的TCP/IP 協(xié)議簇(TCP, UDP, ICMP, IGMP, IPv4, ARP, PPPoE, Ethernet)、4個(gè)獨(dú)立的Socket接口、一個(gè)MAC和PHY、支持MDI/MDIX,本議題就是基于該芯片所開發(fā)的應(yīng)用,在沒(méi)有操作系統(tǒng)的情況下只需要做socket編程即可,也不用理睬網(wǎng)絡(luò)協(xié)議 。
Socket是應(yīng)用層與TCP/IP協(xié)議簇通信的中間軟件抽象層,它是一組接口。它把復(fù)雜的TCP/IP協(xié)議簇隱藏在Socket接口后面,對(duì)用戶來(lái)說(shuō),一組簡(jiǎn)單的接口就是全部。
【二方案】
好了,下邊詳細(xì)介紹一下本議題的詳細(xì)方案,
首先電源轉(zhuǎn)換是必須的。一是可直接使用的電源適配器較少,二是為了板級(jí)電源的穩(wěn)定。選用物美價(jià)廉的MC36063,加上外圍元件,成本在一元到兩元之間。
其次,是主控單片機(jī),選用Mega128L,3.3v低電壓,內(nèi)部存儲(chǔ)器極其巨大,單片機(jī)中的航空母艦。
再次網(wǎng)絡(luò)接口,之前說(shuō)過(guò)了選用W5100,好像是棒子國(guó)的產(chǎn)品。
最后是兩個(gè)通用串行接口RS232/485,不詳細(xì)介紹了。需要說(shuō)明一點(diǎn)的是,RS485的接口是用一個(gè)RJ45網(wǎng)座是針對(duì)具體應(yīng)用所設(shè)計(jì)的。
在本帖最后分享的程序,數(shù)據(jù)透?jìng)鞯幕竟δ芏家呀?jīng)實(shí)現(xiàn)。
肯定有人會(huì)說(shuō),這樣的產(chǎn)品網(wǎng)上一大把,隨便買一個(gè)會(huì)比自己開發(fā)便宜省事。不可否認(rèn),事實(shí)的確是這樣。但是換個(gè)角度想想各位在做應(yīng)用開發(fā)的有幾個(gè)人的工作是具有開創(chuàng)性的。應(yīng)用開發(fā),只是對(duì)應(yīng)不同的需求將已經(jīng)成熟的技術(shù)拿來(lái)放在一起,僅此而已。
【三結(jié)構(gòu)簡(jiǎn)圖】
接口包括一個(gè)網(wǎng)口,一個(gè)RS232,一個(gè)RS485,電源
各模塊單元連接關(guān)系
【四各部分原理圖】
電源MC34063,價(jià)格好,這個(gè)設(shè)計(jì)是比較經(jīng)典的電路,很多設(shè)計(jì)中都是用這個(gè)電路
Mega128L最小系統(tǒng),不多說(shuō)
網(wǎng)絡(luò)W5100的外圍電路
RS232,這個(gè)也沒(méi)什么說(shuō)的
RS485,這個(gè)也是常用電路
【八部分函數(shù)】
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偵聽(tīng)
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)實(shí)現(xiàn)的功能是將網(wǎng)絡(luò)數(shù)據(jù)保存到片上緩存
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中文用戶數(shù)據(jù)手冊(cè)-v1.1.8.pdf(939.08 KB, 下載次數(shù): 61)2013-7-23 18:48 上傳點(diǎn)擊文件名下載附件
W5100_Datasheet_v1_1_8.pdf(1.47 MB, 下載次數(shù): 97)2013-7-23 18:47 上傳點(diǎn)擊文件名下載附件
說(shuō)明一下,附件源碼中針對(duì)網(wǎng)絡(luò)編程是用TCP/IP協(xié)議中的UDP協(xié)議。
【十結(jié)論】
從整個(gè)設(shè)計(jì)的角度來(lái)說(shuō),硬件沒(méi)有難度,數(shù)據(jù)手冊(cè)描述的非常詳細(xì),按照參考設(shè)計(jì)來(lái)做電路即可。難點(diǎn)可能在socket編程?;蛟S多數(shù)電工對(duì)各種網(wǎng)絡(luò)協(xié)議并不熟悉,又或者沒(méi)有socket編程經(jīng)驗(yàn)。本設(shè)計(jì)采用的方案不用考慮過(guò)多的網(wǎng)絡(luò)協(xié)議,避免了大量網(wǎng)絡(luò)相關(guān)開發(fā),只需將共享程序中的Socket代碼稍加修改即可實(shí)現(xiàn)簡(jiǎn)單網(wǎng)絡(luò)通訊。
The End!