天天看點

UIP移植到CC2530上

最近老闆有個項目,其中要做一個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

  1. <span style="font-size:18px;">#include "spi.h"  
  2. void WriteByte(u8_t dat)  
  3. {  
  4.   u8_t i;  
  5.   for(i=0;i<8;i++)  
  6.   {  
  7.     SCKN = 0;  
  8.     asm("nop");  
  9.     if(dat&0x80)  
  10.     {  
  11.        SIN = 1;  
  12.     }  
  13.     else   
  14.        SIN = 0;  
  15.     dat <<= 1;  
  16.     asm("nop");  
  17.     SCKN = 1;  
  18.     asm("nop");  
  19.   }  
  20.   SCKN=0; //空閑狀态為低電平  
  21. }  
  22. u8_t ReadByte(void)  
  23. {  
  24.   u8_t i,dat;  
  25.   SCKN=0;  
  26.   dat1=0;  
  27.   for(i=0;i<8;i++)  
  28.   {   
  29.     SCKN=1;  
  30.     dat1 <<=1;  
  31.     dat1 |= SON;   
  32.     SCKN=0;   
  33.   }  
  34.   return dat;  
  35. }  
  36. </span>  

     spi.h檔案定義了與enc28j60spi接口的GPIO,

[cpp]  view plain copy

  1. <span style="font-size:18px;">#ifndef SPI_H  
  2. #define SPI_H  
  3. #include <ioCC2530.h>  
  4. #define SON   P0_5    // MISO  
  5. #define SIN   P0_6    // MOSI  
  6. #define SCKN  P0_7    // SCK  
  7. #define CSN   P1_3    // 28J60-- CS  
  8. #define RESET P1_2    // Reset   
  9. void WriteByte(u8_t dat);  
  10. u8_t ReadByte(void);  
  11. #endif  
  12. </span>  

        enc28j60.c檔案:

[cpp]  view plain copy

  1. <span style="font-size:18px;">#include "enc28j60.h"  
  2. #include "spi.h"  
  3. #define MIN(a,b) (a) < (b) ? (a) : (b)  
  4. XDATA u8_t Enc28j60Bank;  
  5. XDATA u16_t NextPacketPtr;  
  6. void delay_100ns()  
  7. {  
  8.      asm("nop");  
  9.      asm("nop");  
  10.      asm("nop");  
  11. }  
  12. void delay_ms(int t1)  
  13. {   
  14.      int i;   
  15.      while(t1--)   
  16.      {  
  17.     for(i=10;i;--i)  
  18.         {  
  19.            delay_100ns();  
  20.         }  
  21.      }   
  22. }  
  23. /  

          還有個編譯設定的問題,具體按照如下來:

    UIP移植到CC2530上

         好了,然後編譯連接配接,過程中可能有一些警告和錯誤,一個一個耐心排除,很容易。

         用網線連上電腦,然後打開指令終端,輸入ping 219.223.173.242  我主機ip是219.223.173.243

        如下結果:

    UIP移植到CC2530上
            然後打開網絡調試助手
    UIP移植到CC2530上

          如程式需要的結果相同,哈哈!過幾天實作一個web伺服器!

        接下來的工作就是将uip移植到z-stack上,在cc2530上實作網關的功能!

        有需要源碼的可以聯系我!

版權聲明:本文為CSDN部落客「u011034150」的原創文章,遵循CC 4.0 BY-SA版權協定,轉載請附上原文出處連結及本聲明。

原文連結:https://blog.csdn.net/u011034150/article/details/53561126