2009年5月23日 星期六

DIO的程式碼測試

Jennic公司的zigbee子版的Exansion Connector一共有40隻腳位
根據"JN-RM-2001-Integrated-Peripherals-API-2v4"這份文件的說明
其中1~20這些pin腳稱為DIO(Digital I/O)可供外接
程式中有幾個比較重要的參數如下

vAHI_DioSetDirection 設置方向
vAHI_DioSetOutput 設置輸入輸出
u32AHI_DioReadInput 讀所有的IO口
u8AHI_DioSetByte 輸出一個字節
u8AHI_DioReadByte 讀一個字節

Zigbee的開發是以C為基礎,借了幾本書來參考
也上網找了資訊,大陸的Bocon 公司也有針對Zigbee研究,公司也有開發一個資訊論壇

http://www.bocon.com.cn/boconbbs/forumdisplay.php?fid=19

由於以往並沒有什麼程式的基礎,唯一會的程式也只有在單晶片課程學到的組合語言,而Zigbee主要的應用都是要修改其內部的程式架構,除了翻譯說明書之外,我只能一步一步的Try,參考別人的打法,針對DIO的應用在Bocon中下載了一個對於DIO的應用檔JN-AP-1040-JN5139-UsingDioInterrupts-1v0。

裡頭主要的程式就是以下這段:

PRIVATE void vInitSystem(void){ /* Setup interface to MAC */ u32AppQApiInit(NULL, NULL, NULL); u32AHI_Init();
{


/* Set SW1(dio9)/SW2(dio10)to input and LED1(dio16)/LED2(dio17)to output */ vAHI_DioSetDirection(E_AHI_DIO9_INTE_AHI_DIO10_INT, 0);
vAHI_DioSetDirection(0, E_AHI_DIO16_INTE_AHI_DIO17_INT);
/* enable pullups on all inputs/unused pins */
vAHI_DioSetPullup(!(E_AHI_DIO16_INTE_AHI_DIO17_INT),E_AHI_DIO16_INTE_AHI_DIO17_INT);
/* turn LED off */
vAHI_DioSetOutput(E_AHI_DIO16_INTE_AHI_DIO17_INT, 0);
/* set interrupt for DIO9 /DIO10 to occur on button release - rising edge */
vAHI_DioInterruptEdge(E_AHI_DIO9_INTE_AHI_DIO10_INT, 0);
/* enable interrupt for DIO9/DIO10 */
vAHI_DioInterruptEnable(E_AHI_DIO9_INTE_AHI_DIO10_INT, 0);


}

註解的地方通通以紅色呈現,將這個範例燒進去之後,並不會發送感測的訊號給母版,於是針對程式的註腳研究,
/* Set SW1(dio9)/SW2(dio10)to input and LED1(dio16)/LED2(dio17)to output */
vAHI_DioSetDirection(E_AHI_DIO9_INTE_AHI_DIO10_INT, 0);
vAHI_DioSetDirection(0, E_AHI_DIO16_INTE_AHI_DIO17_INT);
根據註解的意義,是將DIO9以及10設為input,DIO16以及17設為output
/* turn LED off */
vAHI_DioSetOutput(E_AHI_DIO16_INTE_AHI_DIO17_INT, 0);
而這段程式是將兩個LED關閉,在開機時,兩顆LED也確實是熄滅未開燈的(原本在enddevice的時候是兩顆燈會開啟代表運作中) *尚未把後面的0改成1試試,也許會開啟LED*

註解說將DIO9以及10設為input,DIO16以及17設為output,但這是什麼意思?我拿彩虹排線將16以及17接39的VCC,兩顆LED都熄滅,而將9接Gnd LED沒反應,10接Gnd LED1滅了,奇怪的是接9沒反應,接11的時候LED2熄滅,而根據說明書的硬體電路圖,Pin腳16跟17是接在兩顆LED的負端,若是將其接上vcc則就不會有亮燈的現象,而sw1,sw2之前接了pin9和10,而sw1、sw2、LED1、LED2都是共用同一vcc,所以將pin9以及10接Gnd的話,理論上電流將不會流向LED,也因此會讓燈熄滅,但是經測試的結果,卻是10.11腳才有這樣的效果,也因此讓我困擾很久。

但更令我困擾的是將DIO9以及10設為input,DIO16以及17設為output這段話的意義,我從9.10輸入高電位以及低電位,應該要是output的16.17卻都是一直沒反應,到底是要在多加程式碼進去讓輸入的資料做處理,還是程式碼的應用不對還要再苦惱 .....