|
|||||||||||
| 技術交流 | 電路欣賞 | 工控天地 | 數字廣電 | 通信技術 | 電源技術 | 測控之家 | EMC技術 | ARM技術 | EDA技術 | PCB技術 | 嵌入式系統(tǒng) 驅動編程 | 集成電路 | 器件替換 | 模擬技術 | 新手園地 | 單 片 機 | DSP技術 | MCU技術 | IC 設計 | IC 產業(yè) | CAN-bus/DeviceNe |
請教:各位大俠,幫我看看下面這段程序,我有幾個地方不理解! |
| 作者:bush_em 欄目:ARM技術 |
// GPIO 輸出控制實驗 // 實驗內容:使用 GPIO 口摸以 SPI 總線與 74HC595 進行連接, // 控制 74HC595 驅動 8 個 LED 流水燈顯示。 #include "config.h" #define SPI_CS 0x00000100 /*P0.8*/ #define SPI_DATA 0x00000040 /*P0.4*/ #define SPI_CLK 0x00000010 /*P0.4*/ #define SPI_IOCON 0x00000150 /*定義 SPI 接口的 I/O 設置字*/ delay() //延時 { int i,j; for (i=0;i<1000;i++) { for (j=0;j<25;j++) { } } } void HC595_sendDat(unit8 dat) { uint i; IO0CLR = SPI_CS; //SPI_CS=0 for (i=0;i<8;i++) //發(fā)送 8 位數據 { IO0CLR = SPI_CLK; //SPI_CLK = 0 /*設置 SPI_DATA 輸出值 */ if (dat&0x80)!=0) IO0SET = SPI_DATA; else IO0CLR = SPI_DATA; dat<<=1; IO0SET = SPI_CLK; //SPI_CLK=1 } IO0SET = SPI_CS; //SPI_CS = 1,輸出顯示數據 } const unit8 DISP_TAB[16]={0x01,0x02,0x04,0x08, 0x10,0x20,0x40,0x80, 0x81,0x42,0x24,0x18, 0x24,0x42,0x81,0x00}; int Main() { unit8 i; PINSEL0 = 0x00000000; //設置引腳連接 GPIO IO0DIR = SPI_IOCON; //設置 SPI 控制口為輸出 while(1) { for (i=0;i<16;i++) { HC595_sendDat(~DISP_TAB[i]); //輸出 LED 顯示數據 delay(); } } return(0); } 這里有幾個問題向各位大哥請教: 問題1: 為什么要定義 #define SPI_CS 0x00000100 /*P0.8*/ #define SPI_DATA 0x00000040 /*P0.4*/ #define SPI_CLK 0x00000010 /*P0.4*/ 這三個東西?他們有什么用? 問題2: IO0CLR = SPI_CS; //SPI_CS=0 這條語句 為什么得到的結果是 //SPI_CS=0 呢? 為什么不是把 SPI_CS 的值賦給 IO0CLR呢? 而使 IO0CLR 的值為 0x00000100? 這條語句有什么用? 問題3: IO0CLR = SPI_CLK; //SPI_CLK = 0 這條語句 為什么得到的結果是 //SPI_CLK = 0 呢?這條語句有什么用? 問題4: IO0SET = SPI_CLK; //SPI_CLK=1 這條語句 為什么得到的結果是 //SPI_CLK=1呢?這條語句有什么用? 問題5: IO0SET = SPI_CS; //SPI_CS = 1,輸出顯示數據 這條語句 為什么得到的結果是 //SPI_CS = 1 呢? 謝謝各位大哥! |
| 2樓: | >>參與討論 |
| 作者: zrslight 于 2005/9/20 11:07:00 發(fā)布:
多看書,多考慮 前面3個定義是為了后面對應位置操作;IO0CLR和IO0SET的寄存器你看看定義,它們分別是將對應位置清零和置1. |
|
| 3樓: | >>參與討論 |
| 作者: qianlong30 于 2005/9/20 11:29:00 發(fā)布:
這是書上最基本的 |
|
| 4樓: | >>參與討論 |
| 作者: bush_em 于 2005/9/20 11:50:00 發(fā)布:
謝謝 zrslight 大哥和 qianlong30 大哥! 謝謝 zrslight 大哥和 qianlong30 大哥! 不過我還是不理解 GPIO 輸出清零寄存器(IO0CLR) 當引腳配置為 GPIO 輸出模式時,可使用該寄存器引腳輸出低電平。寫入1 使 對應引腳輸出低電平,并清零 IOSET 寄存器中相應的位;寫入0 無效。 zrslight 大哥說:“它們分別是將對應位置清零和置1” #define SPI_CS 0x00000100 相當于 #define SPI_CS 0000 0000 0000 0000 0001 0000 0000 現(xiàn)在 IO0CLR = SPI_CS; 那么也是 清零 IOSET 寄存器中相應的位 ,怎么會使 SPI_CS=0 呢? 謝謝! |
|
| 5樓: | >>參與討論 |
| 作者: bush_em 于 2005/9/20 13:43:00 發(fā)布:
re: zrslight 大哥和 qianlong30 大哥 再幫我鼎鼎! 謝謝! |
|
| 6樓: | >>參與討論 |
| 作者: bush_em 于 2005/9/20 15:37:00 發(fā)布:
re zrslight 大哥和 qianlong30 大哥 再幫我鼎鼎! 謝謝! |
|
| 7樓: | >>參與討論 |
| 作者: hwarm 于 2005/9/20 18:27:00 發(fā)布:
估計是! define SPI_CS 0x00000100 /*P0.8*/ #define SPI_DATA 0x00000040 /*P0.4*/ #define SPI_CLK 0x00000010 /*P0.4*/ #define SPI_IOCON 0x00000150 /*定義 SPI 接口的 I/O 設置字*/ 這些應該是定義 SPI 各接口的端口地址,是硬件寄存器的地址. 端口 P0.8 為 SPI_CS 地址是:0x00000100 ^^^^^^^^^^^^^^ |
|
| 8樓: | >>參與討論 |
| 作者: bush_em 于 2005/9/20 20:42:00 發(fā)布:
hwarm 大哥,謝謝! hwarm 大哥: 幫我解釋: void HC595_sendDat(unit8 dat) { uint i; IO0CLR = SPI_CS; //SPI_CS=0 for (i=0;i<8;i++) //發(fā)送 8 位數據 { IO0CLR = SPI_CLK; //SPI_CLK = 0 /*設置 SPI_DATA 輸出值 */ if (dat&0x80)!=0) IO0SET = SPI_DATA; else IO0CLR = SPI_DATA; dat<<=1; IO0SET = SPI_CLK; //SPI_CLK=1 } IO0SET = SPI_CS; //SPI_CS = 1,輸出顯示數據 } 這段話,好嗎? IO0CLR = SPI_CS; //是不是使 P0.8 輸出 0;它寫 在 for 循環(huán)語句前有什么用? IO0CLR = SPI_CLK; //是不是使 P0.4 輸出 0; 這個語句又是有什么用呢? if (dat&0x80)!=0) IO0SET = SPI_DATA; else IO0CLR = SPI_DATA; 是什么意思啊? IO0SET = SPI_CLK; 是什么意思?有什么作用? IO0SET = SPI_CS; 是什么意思?有什么作用? 謝謝大哥! |
|
| 9樓: | >>參與討論 |
| 作者: kyoky82 于 2005/9/20 22:51:00 發(fā)布:
rel: 我沒看過SPI通訊,不是很清楚,不過照程序流程來看: SPI_CS應該是SPI使能選擇(低電平數據傳輸開始標志),SPI_CLK是時鐘信號,也就是CLK低電平時讀DATA線電平,類似SPI_CS set“1”應該是數據傳輸結束標志。 |
|
| 10樓: | >>參與討論 |
| 作者: bush_em 于 2005/9/21 11:44:00 發(fā)布:
謝謝 kyoky82 大哥 謝謝 kyoky82 大哥: 我還是不很清楚, 一: IO0CLR = SPI_CS;為什么要寫在 for 語句的前面呢? 還有 IO0CLR = SPI_CS;可不可以理解成:使 P0.8 輸出 0,但是 P0.8 輸出 0 ,又有什么用呢?是不是選中 74HC595 。 二: IO0CLR = SPI_CLK; 可不可以理解成:使 P0.4 輸出 0,但是 P0.4 輸出 0 ,又有什么用呢? 三: IO0SET = SPI_CLK;可不可以理解成:使 P0.4 輸出 1,但是 P0.4 輸出 1 ,又有什么用呢? 四: if (dat&0x80)!=0) //這句話有什么用啊? 五: 是在時鐘上升沿還是在時鐘線下降沿,輸出到SPI數據線上 。 六 kyoky82 大哥您說:" 類似SPI_CS set“1”應該是數據傳輸結束標志。" 可是 IO0SET = SPI_CS; //SPI_CS = 1,輸出顯示數據 為什么是在傳輸結束,才顯示數據? 七: P0.8,和 P0.6 和 P0.4 這三個引教都應該是接在 74HC595 的是嗎? 謝謝大哥! |
|
|
|
| 免費注冊為維庫電子開發(fā)網會員,參與電子工程師社區(qū)討論,點此進入 |
Copyright © 1998-2006 m.58mhw.cn 浙ICP證030469號 |