音影先锋亚洲天堂网|电影世界尽头的爱完整版播放|国产 熟女 91|高清无码免费观看欧美日韩|韩国一区二区三区黄色录像|美女亚洲加勒比在线|亚洲综合网 开心五月|7x成人在线入口|成人网站免费日韩毛片区|国产黄片?一级?二级?三级

登錄 免費注冊 首頁 | 行業(yè)黑名單 | 幫助
維庫電子市場網
技術交流 | 電路欣賞 | 工控天地 | 數字廣電 | 通信技術 | 電源技術 | 測控之家 | 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
多看書,多考慮
前面3個定義是為了后面對應位置操作;IO0CLR和IO0SET的寄存器你看看定義,它們分別是將對應位置清零和置1.

3樓: >>參與討論
qianlong30
這是書上最基本的
 
4樓: >>參與討論
bush_em
謝謝 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
re:
zrslight 大哥和 qianlong30 大哥
再幫我鼎鼎!
謝謝!

6樓: >>參與討論
bush_em
re
zrslight 大哥和 qianlong30 大哥
再幫我鼎鼎!
謝謝!


7樓: >>參與討論
hwarm
估計是!
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
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
rel:
我沒看過SPI通訊,不是很清楚,不過照程序流程來看:
SPI_CS應該是SPI使能選擇(低電平數據傳輸開始標志),SPI_CLK是時鐘信號,也就是CLK低電平時讀DATA線電平,類似SPI_CS set“1”應該是數據傳輸結束標志。

10樓: >>參與討論
bush_em
謝謝 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  的是嗎?



謝謝大哥!



參與討論
昵稱:
討論內容:
 
 
相關帖子
關于BLS0~3的字節(jié)定位問題
首先祝各位大哥中秋快樂,有個開發(fā)板的問題請各位大哥幫我看看!
向各位大俠請教幾個存儲器映射方面的問題!
[求教]jtag接口pcb布線有什么注意事項么?
S3C2410用戶手冊LCD章節(jié)中關于單色4位雙掃描的插圖是不是錯了啊
免費注冊為維庫電子開發(fā)網會員,參與電子工程師社區(qū)討論,點此進入


Copyright © 1998-2006 m.58mhw.cn 浙ICP證030469號