顯示具有 CC2430 標籤的文章。 顯示所有文章
顯示具有 CC2430 標籤的文章。 顯示所有文章

CC2430 Zstack的基本網路傳輸和架構

1.開啟SampleApp
預設路徑:
C:\Texas Instruments\ZStack-1.4.3\Projects\zstack\Samples\Location\CC2430DB\SampleApp.eww

2.首先要先找到程式最先執行的地方
Zmain→Zmain.c裡面有main
所以程式執行的開端就在這裡
它裡面就是init一些zstack所寫好的函數
不過最重要的就是它有init OSAL
什麼是OSAL??
它是IT在Zstack下所開發的小型OS
它會自己分配時間
所以有很多內部事件可以不需要再另外寫程式處理
所以去OSAL裡面看就可以知道有什麼事件
App→OSAL_SampleApp.c
在這個tasksArr的變數
裡面可以發現好幾個事件的函數
也就是說可以在這裡加入自己想要新增的事件
在這個osalInitTasks的函式裡面
你可以輸入自己想要Init事件的函數

3.接下來知道程式裡面有執行到App→SampleApp.c
這裡是Zstack預設用來給開發者開發的區域
所以先看
SampleApp_Init的函數
SampleApp_TaskID是用來記錄這個事件在OSAL裡面的編號
是可以用來註冊其他中斷發生需要啟動事件的編號

SampleApp_NwkState是用來記錄發生什麼事件
zStack有內涵這些事件
typedef enum
{
  DEV_HOLD,               // Initialized - not started automatically
  DEV_INIT,               // Initialized - not connected to anything
  DEV_NWK_DISC,           // Discovering PAN's to join
  DEV_NWK_JOINING,        // Joining a PAN
  DEV_NWK_REJOIN,         // ReJoining a PAN, only for end devices
  DEV_END_DEVICE_UNAUTH,  // Joined but not yet authenticated by trust center
  DEV_END_DEVICE,         // Started as device after authentication
  DEV_ROUTER,             // Device joined, authenticated and is a router
  DEV_COORD_STARTING,     // Started as Zigbee Coordinator
  DEV_ZB_COORD,           // Started as Zigbee Coordinator
  DEV_NWK_ORPHAN          // Device has lost information about its parent..
} devStates_t;
不過我也不太懂裡面的所有狀態

SampleApp_TransID我也不知道宣告來幹麻的後面會有用到
但是我看過有沒有都可以執行

SampleApp_Periodic_DstAddr
SampleApp_Flash_DstAddr
是用來記錄要zigbee傳送的方式
裡面的變數有
typedef struct {
  union {
    uint16  shortAddr;
  } addr;
  afAddrMode_t addrMode;
  byte endPoint;
} afAddrType_t;

typedef enum {
  afAddrNotPresent = AddrNotPresent,
  afAddr16Bit      = Addr16Bit,
  afAddrGroup      = AddrGroup,
  afAddrBroadcast  = AddrBroadcast
} afAddrMode_t; 

在addrMode的表示下
也就是說在Zstack的zigbee傳送方式有4種
AddrNotPresent→沒動作
Addr16Bit→用指定位置傳送
AddrGroup→用指定群組傳送
AddrBroadcast→廣播
endPoint是zigbee用來認領的ID
所以SampleApp_Periodic_DstAddr是設定為廣播的狀態
SampleApp_Flash_DstAddr是設定為對群組傳送

SampleApp_epDesc
就是設定接收的ID和事件的編號
typedef struct {
  byte endPoint;
  byte *task_id;
  SimpleDescriptionFormat_t *simpleDesc;
  afNetworkLatencyReq_t latencyReq;
} endPointDesc_t;
也就是說要輸入要接收的ID
和事件的編號
其他我就不太知道了....

afRegister( &SampleApp_epDesc );
這是將上面設定的註冊到另一個專門用來接收zigbee的事件

RegisterForKeys( SampleApp_TaskID );
是將按鍵的硬體事件註冊到自訂的事件
 
SampleApp_Group.ID = 0x0001;
osal_memcpy( SampleApp_Group.name, "Group 1", 7  );
aps_AddGroup( SAMPLEAPP_ENDPOINT, &SampleApp_Group );
是將ID再劃分其他的區域


SampleApp_ProcessEvent的函數
afIncomingMSGPacket_t *MSGpkt
是用來取回OSAL傳來的信號
typedef struct {
  osal_event_hdr_t hdr;
  uint16 groupId;
  uint16 clusterId;
  afAddrType_t srcAddr;
  byte endPoint;
  byte wasBroadcast;
  byte LinkQuality;
  byte SecurityUse;
  uint32 timestamp;
  afMSGCommandFormat_t cmd;
} afIncomingMSGPacket_t;

typedef struct {
  byte   TransSeqNumber;
  uint16 DataLength;
  byte  *Data;
} afMSGCommandFormat_t;

typedef struct {
  uint8  event;
  uint8  status;
} osal_event_hdr_t;
裡面有很多設定就用原來的來修改
比較快
KEY_CHANGE
就是有按鍵動作所要做的事
AF_INCOMING_MSG_CMD
就是有接收到zigbee的訊息所要做的事
ZDO_STATE_CHANGE
有接上zigbee的連接時所要做的事

osal_start_timerEx( SampleApp_TaskID, SAMPLEAPP_SEND_INFO_EVT, 30000 );
這是設定時間到就會執行這個事件
也就是會有SAMPLEAPP_SEND_INFO_EVT的訊號出來

SampleApp_HandleKeys的函數
SampleApp_SendFlashMessage( SAMPLEAPP_FLASH_DURATION )
這是用來傳送閃燈的訊號出去

aps_FindGroup( SAMPLEAPP_ENDPOINT, SAMPLEAPP_FLASH_GROUP )
找有沒有這個GROUP

aps_RemoveGroup( SAMPLEAPP_ENDPOINT, SAMPLEAPP_FLASH_GROUP )
移除這個GROUP

aps_AddGroup( SAMPLEAPP_ENDPOINT, &SampleApp_Group )
增加這個GROUP

SampleApp_MessageMSGCB的函數
這是用來處理從zigbee接收過來的訊息
HalLedBlink( HAL_LED_4, 4, 50, (flashTime / 4) )
這是用來閃燈用的
也就是說有訊號接收到LED就會閃

SampleApp_SendPeriodicMessage( void ) 的函數
SampleApp_SendFlashMessage( uint16 flashTime ) 的函數
就是傳送zigbee的訊號

CC2430 ZStack的Uart使用方法

1.首先要知道CC2430Uart的接腳在哪裡
在CC2430的datasheet裡有一張表有寫(p. 80)
這樣看起來Uart有兩個
且都有兩種接腳的方式
Uart0分別是P0.3 P0.2或是P1.5 P1.4
Uart1分別是P0.5 P0.4或是P1.7 P1.6

2.要如何設定
在datasheet有寫(p.83)
將PERCFG(reg中的0xF1)中的bit0設為0就是Uart0腳位為P0.3 P0.2
將PERCFG(reg中的0xF1)中的bit0設為1就是Uart0腳位為P1.5 P1.4
將PERCFG(reg中的0xF1)中的bit1設為0就是Uart1腳位為P0.5 P0.4
將PERCFG(reg中的0xF1)中的bit1設為1就是Uart1腳位為P1.7 P1.6

3.接下來就要將I/O的Port設定
在datasheet有寫(p.83)
也就是說假設你需要使用Uart0中的Alt.1
就要這樣寫
PERCFG &= 0xFE;
P0SEL |= 0x0C;
這樣P0.3 P0.2就會變成Uart0的Tx Rx

4.接下來就要找ZStack的程式如何啟動
ZStack將一些硬體部分寫在以下的預設路徑
C:\Texas Instruments\ZStack-1.4.3\Components\hal\target\
我所要使用的是CC2430EB所以就看CC2430EB裡面的東西
裡面有hal_uart.c這個檔案
裡面寫的很完整所以幾乎不需要修改它
不過要知道裡面的函數名稱
因為要使用Uart就要使用裡面的函數
在開頭的define有寫到開啟Uart的參數HAL_UART
可以自行開啟
或是在hal_board_cfg.h有寫到(hal_board_cfg.h第239行)
沒設定的話它會先看ZAPP_P1、ZAPP_P2、ZTOOL_P1或是ZTOOL_P2有沒有設定
有的話就開啟
在hal_board_cfg.h第247行寫到要開啟那個Uart
預設只有開啟Uart0
而且在hal_uart.c寫到他Uart0預設是用P0.3 P0.2(hal_uart.c第451行)
Uart1預設是用P1.7 P1.6(hal_uart.c第468行)

5.接下來就開始使用它
開啟預設的IAR
C:\Texas Instruments\ZStack-1.4.3\Projects\zstack\Samples\SampleApp\CC2430DB\SampleApp.eww
在Project→Options→C/C++ Compiler→Preprocessor→Defined symbols
可以下達設定
裡面預設有ZTOOL_P1所以因該有開啟Uart
但是他不會去執行到ISR的UART
而且它會顯示出它內部有寫好的一些字串
所以需要修改
刪除
ZTOOL_P1
加上
HAL_UART

HAL_UART_ISR
接下來開啟
SampleAppHw.c
將第92行刪除或是註解
#error The UART will not work with this configuration. The RX & TX pins are used.
上面這一行是說
因為之前設定ZTOOL_P1 所以RX TX已經被用了
但是我將它取消所以是不會被抵觸的

6.接下來就開始寫程式
開啟SampleApp.c裡面
就是已經寫好的程式
SampleApp_Init->程式初始值
SampleApp_ProcessEvent ->程式的事件(程式撰寫的地方)
所以在SampleApp.c前面加上
hal_uart.c
void rx_function (uint8 port,uint8 event); 
在SampleApp_Init裡面加上
halUARTCfg_t uartConfig;

uartConfig.configured           = TRUE;  // 2430 don't care.
uartConfig.baudRate             = HAL_UART_BR_38400;
uartConfig.flowControl          = TRUE;
uartConfig.flowControlThreshold = 48;  //接收緩衝區
uartConfig.rx.maxBufSize        = 64;
uartConfig.tx.maxBufSize        = 64;
uartConfig.idleTimeout          = 6;  // 2430 don't care.
uartConfig.intEnable            = TRUE;  // 2430 don't care.
uartConfig.callBackFunc         = rx_function; //接收的function名稱

HalUARTInit();

HalUARTOpen(HAL_UART_PORT_0, &uartConfig);

在最後面加上
void rx_function(uint8 port,uint8 event)
{
  uint8 temp[8];
  HalUARTRead(HAL_UART_PORT_0,temp,8);
  HalUARTWrite(HAL_UART_PORT_0,temp, 8);
} 


7.baudRate
不知道原因
在CC2430的Zstack
它只支援34800和115200這兩種baudRate
所以就只設定這兩種
接下來可以去看它是設定
是否有同位檢查
是否為8bit或是9bi
Endbit是1個還是2個
需不需要硬體控置流量
在cc2430的datasheet裡面有寫
可以控制的方式和bits
在zstack裡的hal_uart.c的第641行
它預設是8bit,沒有同位檢查,1bit停止碼,有硬體控制流量

8.接下來就可以編輯且開啟超級終端機來測試

TI Zigbee 環境建置 CC2430

1.首先先到TI官網下載ZStack的安裝套件
按此連結
找到CC2430的ZStack
我撰寫此文章時檔案名稱是
swrc072c.zip
內附ZStack和範例程式

2.安裝IAR for 8051
一定是要8051的
而且要7.30B以上的版本才行
但是我安裝7.51A編譯不過
也不知道是什麼原因
也許是因為用謎之方法沒過
因為網路上說7.50A的產生器可以用在7.51A
可以安裝但是不知道有沒有破解完成
所以我灌7.50A
編譯有成功

3.接下來接上CC2430的版子
會顯示要安裝驅動程式
驅動程式放在IAR裡面
預設存放路徑為
C:\Proram Files\IAR Systems\Embedded Workbench 5.0\8051\drivers\Chipcon


4.開啟Sample的專案
預設路徑為
C:\Texas Instruments\ZStack-1.4.3\Projects\zstack\Samples\Location\CC2430DB\SampleApp.eww

應該會出現This project file'SampleApp.eww' is in an old format......
這是正常的吧!!
因為當初TI在開發的時候因該是用IAR for 8051 v7.30B
所以按是

5.將專案選擇CoordinatorDB
點取Make
成功的話
因該會出現errors為0
按下Debug的按鈕
它就會自動燒入
再按下GO就會跑程式