久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

專注電子技術學習與研究
當前位置:單片機教程網 >> Arduino >> 瀏覽文章

擴展NDS掌機連接Arduino (3)--硬件中斷設計

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

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

一、硬件中斷設計

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

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


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

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

二、NDS端對外部IRQ硬件中斷的軟件設置

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

irqSet(IRQ_CARD_LINE, card_line_irq);

其中,參數IRQ_CARD_LINE為中斷號,該宏對應Slot 1卡帶的CARD LINE IRQ中斷號,值為IRQ_CARD_LINE=(1<<20)。參數card_line_irq為中斷服務函數,其函數原型為:

static void card_line_irq();

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


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

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

如果使用libnds庫函數則比較方便,直接調用如下函數便可

irqEnable(IRQ_CARD_LINE);


至此,NDS端對Slot 1接口的CARD LINE IRQ的中斷處理工作就準備就緒了,一旦Arduino向NDS端發送一個電平波動引發NDS的CARD LINE IRQ中斷后,card_line_irq()函數便會自動執行。因此可以在這個函數里向Arduino發送一個dummy字節,引發SPI通信,使得Arduino可以在收到這個dummy字節后隨隨后把數據賦給SPDR寄存器,使該數據傳輸給NDS主機。

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

上文已述,需要Arduino在PB6接口向NDS端發送一個電平波動。一般需要跟據NDS端對CARD LINE IRQ中斷響應的配置進行發送電平波動,但由于找不到文檔關于NDS端對CARD LINE IRQ中斷響應的配置信息,所以不知道是該發送一個低電平到高電平的上升沿過去,還是發送一個從高電平到低電平的下降沿過去。參考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  
}

分析該函數:

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

相關文章

主站蜘蛛池模板: 成人欧美一区二区三区在线观看 | 亚洲国产一区二区在线 | 国产精品一区二区福利视频 | 黄色一级特级片 | 午夜极品 | 午夜久久久久 | 国产精品日韩欧美 | 成av人电影在线 | 久久久久亚洲av毛片大全 | 成人免费观看男女羞羞视频 | 久久免费国产视频 | 欧美一区二区在线观看视频 | av黄色在线观看 | 黄色一级片在线播放 | 综合久久av | 国产精品一区二区av | 我要看黄色录像一级片 | 久久国产精品免费一区二区三区 | 久久精品一区二区三区四区 | 久久亚洲一区二区三 | chinese中国真实乱对白 | 亚洲一区二区中文字幕 | 国产精品久久一区二区三区 | 日韩久久精品 | 亚洲精品天堂 | 中文字幕国产精品 | 人人插人人| 伊人狠狠干 | 久久综合一区二区三区 | 精品欧美一区免费观看α√ | 欧美精品综合在线 | 99精品国产成人一区二区 | 视频一二三区 | 人人干97| 东京av男人的天堂 | 亚洲综合久久久 | 国产视频第一页 | 日韩欧美国产一区二区 | 欧美日韩在线播放 | 伊人一二三 | 亚洲综合色视频在线观看 |