最近老闆有個項目,其中要做一個Zigbee的無線接入點,即将ZigBee無線傳感網絡中的資料通過TCP/IP協定傳輸到以太網上。傳統的這種無線接入點即網關都是上位機加下位機模式做成的,即主要晶片(如ARM)加無線子產品(如cc2530),ARM與cc2530通過UARST通信,cc2530建立WSN網絡,ARM與PC機通過TCP/IP通信,考慮到此系統的成本以及其中的資料傳輸量不大,就不用ARM,直接将cc2530做成網關,這就需要将TCP/IP協定棧移植到cc2530上,同時與ZigBee協定棧能很好的協同運作。
因為cc2530的FLASH有256K,Z-stack占用了大部分,是以要用TCP/IP,隻能移植一個輕量型網絡協定棧,現在比較流行的就是Adam Dunkels寫的lwIP和uIP,還有Micrium的uc/IP,lwip和uc/ip所占空間較大,移植較為麻煩,是以就用uip。uip是一種免費可的極小的TCP/IP協定棧,主要實作了ARP,ICMP,TCP,UDP協定,在8位或16位單片機上用的較多,對rom和ram要求很少。
在網上看了一些uip移植到51或STM32的文章,同時也花了兩天時間看了uip的實作源碼,如果不熟悉TCP/IP協定的話讀起來還是很吃力,是以先看看TCP/IP,建議看TCP/IP協定詳解——卷一。看完之後大概知道移植過程了。
移植之前先要寫網絡晶片驅動程式,我用的是enc28j60,獨立控制的SPI接口,因為cc2530的spi接口用來下載下傳調試了,另一個spi被序列槽複用了,是以隻用用GPIO模拟SPI。
寫驅動程式之前認真讀了enc28j60的datasheet,在網上也找到了相關的驅動程式,可以稍加修改拿來用。下面貼出spi程式和enc28j60的程式。
[cpp] view plain copy
- <span style="font-size:18px;">#include "spi.h"
- void WriteByte(u8_t dat)
- {
- u8_t i;
- for(i=0;i<8;i++)
- {
- SCKN = 0;
- asm("nop");
- if(dat&0x80)
- {
- SIN = 1;
- }
- else
- SIN = 0;
- dat <<= 1;
- asm("nop");
- SCKN = 1;
- asm("nop");
- }
- SCKN=0; //空閑狀态為低電平
- }
- u8_t ReadByte(void)
- {
- u8_t i,dat;
- SCKN=0;
- dat1=0;
- for(i=0;i<8;i++)
- {
- SCKN=1;
- dat1 <<=1;
- dat1 |= SON;
- SCKN=0;
- }
- return dat;
- }
- </span>
spi.h檔案定義了與enc28j60spi接口的GPIO,
[cpp] view plain copy
- <span style="font-size:18px;">#ifndef SPI_H
- #define SPI_H
- #include <ioCC2530.h>
- #define SON P0_5 // MISO
- #define SIN P0_6 // MOSI
- #define SCKN P0_7 // SCK
- #define CSN P1_3 // 28J60-- CS
- #define RESET P1_2 // Reset
- void WriteByte(u8_t dat);
- u8_t ReadByte(void);
- #endif
- </span>
enc28j60.c檔案:
[cpp] view plain copy
- <span style="font-size:18px;">#include "enc28j60.h"
- #include "spi.h"
- #define MIN(a,b) (a) < (b) ? (a) : (b)
- XDATA u8_t Enc28j60Bank;
- XDATA u16_t NextPacketPtr;
- void delay_100ns()
- {
- asm("nop");
- asm("nop");
- asm("nop");
- }
- void delay_ms(int t1)
- {
- int i;
- while(t1--)
- {
- for(i=10;i;--i)
- {
- delay_100ns();
- }
- }
- }
-
/
還有個編譯設定的問題,具體按照如下來:
好了,然後編譯連接配接,過程中可能有一些警告和錯誤,一個一個耐心排除,很容易。
用網線連上電腦,然後打開指令終端,輸入ping 219.223.173.242 我主機ip是219.223.173.243
如下結果:
然後打開網絡調試助手如程式需要的結果相同,哈哈!過幾天實作一個web伺服器!
接下來的工作就是将uip移植到z-stack上,在cc2530上實作網關的功能!
有需要源碼的可以聯系我!
版權聲明:本文為CSDN部落客「u011034150」的原創文章,遵循CC 4.0 BY-SA版權協定,轉載請附上原文出處連結及本聲明。
原文連結:https://blog.csdn.net/u011034150/article/details/53561126