乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      擴(kuò)展NDS掌機(jī)連接Arduino (3)

       quasiceo 2015-08-24

      擴(kuò)展NDS掌機(jī)連接Arduino (3)--硬件中斷設(shè)計(jì)

      作者:c_gao   來源:轉(zhuǎn)自c_gao   點(diǎn)擊數(shù): 177   更新時(shí)間:2014年07月12日   【字體:
      上一篇文章:擴(kuò)展NDS掌機(jī)連接Arduino (2)--NDS端SPI通信協(xié)議解析較詳細(xì)分析了SPI協(xié)議原理,以及NDS端SPI相關(guān)寄存器和使用方法。本篇介紹Arduino與NDS之間的硬件中斷設(shè)計(jì),即一方如何觸發(fā)另一方的硬件中斷。

      由于第一篇文章介紹的方案中,我們將NDS作為SPI通信中的主機(jī)(Master),將Arduino作為從機(jī)(Slave)。在SPI通信中,主機(jī)向從機(jī)發(fā)送數(shù)據(jù)很容易:將SS線打低電平,然后就可以發(fā)送數(shù)據(jù)到MOSI線上。而從機(jī)向主機(jī)發(fā)送數(shù)據(jù)則比較困難,因?yàn)镾PI從機(jī)不能主動(dòng)向主機(jī)發(fā)送數(shù)據(jù)。為了我們最后實(shí)現(xiàn)的方案中使從機(jī)能主動(dòng)向主機(jī)發(fā)送數(shù)據(jù),我們采用從機(jī)向主機(jī)觸發(fā)一個(gè)IRQ中斷,讓主機(jī)知道從機(jī)有數(shù)據(jù)需要發(fā)送,然后由主機(jī)引發(fā)SPI通信,并使從機(jī)的數(shù)據(jù)發(fā)送到主機(jī)。

      一、硬件中斷設(shè)計(jì)

      這里最核心的部分,即如何讓從機(jī)(Arduino)去觸發(fā)一個(gè)主機(jī)(NDS)的IRQ中斷呢?這可以通過以下兩步完成:

      (1)硬件上:連接Atmega 168/328 CPU的 PB6 引腳到NDS Slot 1接口的第7引腳,見圖1;
      (2)軟件上:首先配置NDS端開啟CARD LINE IRQ中斷,然后讓Atmega CPU 在 PB6 引腳上發(fā)生一個(gè)從低電平到高電平的上升沿,或從高電平到低電平的下降沿,來觸發(fā)NDS的IRQ中斷。


      圖1. Atmega 168/328 與NDS Slot 1的連接,紅色線為IRQ硬件連線。

      說明:NDS Slot 1的第7引腳對(duì)應(yīng)Card Line IRQ,可接收Slot 1的外部中斷到NDS內(nèi)部,并進(jìn)行處理。Atmega 168/328的 PB6 (即PORT B 6)和很多其它引腳一樣,是個(gè)多功能復(fù)用的引腳。它有3個(gè)功能,除了可以和PB7一起連接外部晶振等功能外,也可以作為external interrupt source,即外部中斷源。(注:不過因?yàn)镹DS作為SPI主機(jī)和Atmega通信不需要再通過觸發(fā)Atmega的外部硬件中斷來告訴Atmega需要接收NDS即將發(fā)的數(shù)據(jù),而NDS可以直接將SS拉低后發(fā)送,因此這里只用于Atmega去觸發(fā)NDS的外部中斷。所以也可以連接到Atmega的其它空余的數(shù)字引腳。)

      二、NDS端對(duì)外部IRQ硬件中斷的軟件設(shè)置

      步驟如下:
      (1)首先按上篇教程先完成對(duì)NDS端的SPI初始化工作;
      (2)然后編寫CARD INE IRQ中斷服務(wù)函數(shù)代碼,并設(shè)置該中斷調(diào)用的函數(shù)到相應(yīng)的中斷向量表中。使用libnds的庫函數(shù),可如下操作實(shí)現(xiàn):

      irqSet(IRQ_CARD_LINE, card_line_irq);

      其中,參數(shù)IRQ_CARD_LINE為中斷號(hào),該宏對(duì)應(yīng)Slot 1卡帶的CARD LINE IRQ中斷號(hào),值為IRQ_CARD_LINE=(1<<20)。參數(shù)card_line_irq為中斷服務(wù)函數(shù),其函數(shù)原型為:

      static void card_line_irq();

      說明:NDS的各中斷可參考REG_IE/REG_IF寄存器,如圖2所示:


      圖2. REG_IE/REG_IF寄存器。紅色部分為第20位,CARD LINE IRQ中斷標(biāo)記位。

      (3)中斷開啟NDS的CARD LINE IRQ中斷使能,可通過設(shè)置REG_IE寄存器第20位為1實(shí)現(xiàn):
      int oldIME = REG_IME;
      REG_IME = 0;
      REG_IE |= (1<<20);
      REG_IME = oldIME;
      這段代碼首先將NDS的中斷總使能寄存器REG_IME置0, 然后對(duì)REG_IE第20位置1,最后恢復(fù)REG_IME的原有值。這是因?yàn)镽EG_IE寄存器屬于臨界資源,也不允許操作REG_IE寄存器時(shí)發(fā)生別的中斷而轉(zhuǎn)去別的中斷處理代碼。也就是說對(duì)REG_IE的操作是原子操作。

      如果使用libnds庫函數(shù)則比較方便,直接調(diào)用如下函數(shù)便可

      irqEnable(IRQ_CARD_LINE);


      至此,NDS端對(duì)Slot 1接口的CARD LINE IRQ的中斷處理工作就準(zhǔn)備就緒了,一旦Arduino向NDS端發(fā)送一個(gè)電平波動(dòng)引發(fā)NDS的CARD LINE IRQ中斷后,card_line_irq()函數(shù)便會(huì)自動(dòng)執(zhí)行。因此可以在這個(gè)函數(shù)里向Arduino發(fā)送一個(gè)dummy字節(jié),引發(fā)SPI通信,使得Arduino可以在收到這個(gè)dummy字節(jié)后隨隨后把數(shù)據(jù)賦給SPDR寄存器,使該數(shù)據(jù)傳輸給NDS主機(jī)。

      三、Arduino端如何觸發(fā)NDS端CARD LINE IRQ硬件中斷

      上文已述,需要Arduino在PB6接口向NDS端發(fā)送一個(gè)電平波動(dòng)。一般需要跟據(jù)NDS端對(duì)CARD LINE IRQ中斷響應(yīng)的配置進(jìn)行發(fā)送電平波動(dòng),但由于找不到文檔關(guān)于NDS端對(duì)CARD LINE IRQ中斷響應(yīng)的配置信息,所以不知道是該發(fā)送一個(gè)低電平到高電平的上升沿過去,還是發(fā)送一個(gè)從高電平到低電平的下降沿過去。參考DS brut中Atmega端的代碼,是這么做的:
      void do_irq()
      {
        // raise a Card Line hardware interrupt (PB6)
        DDRB |= (1 << 6);
        PORTB &= ~(1 << 6);    // low
        PORTB |= (1 << 6);     // high
        PORTB &= ~(1 << 6);    // low  
      }

      分析該函數(shù):

      1. DDRBPORT B引腳對(duì)應(yīng)的數(shù)據(jù)傳輸方向寄存器 (Port B Data Direction Register),DDRB |= (1 << 6); 的意思是將DDRB第6位置1,查看DataSheet,1代表輸出,0代表輸入。所以這里將PB6引腳配置為輸出,類似于調(diào)于Arduino的庫函數(shù):pinMode (PB6, OUTPUT); 
      2. PORTB為PORT B引腳對(duì)應(yīng)的數(shù)據(jù)傳輸寄存器,相應(yīng)的位如果置1代表電平為HIGH置0代表為LOW。因此上述代碼先產(chǎn)生了一個(gè)由低電平到高電平的上升沿,再產(chǎn)生一個(gè)高電平到低電平的下降沿。這樣一來,肯定能觸發(fā)NDS的CARD LINE IRQ中斷了。

        本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
        轉(zhuǎn)藏 分享 獻(xiàn)花(0

        0條評(píng)論

        發(fā)表

        請(qǐng)遵守用戶 評(píng)論公約

        類似文章 更多