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

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 8010|回復(fù): 2
打印 上一主題 下一主題
收起左側(cè)

AVR單片機(jī)SPI中斷方式的疑惑

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:68618 發(fā)表于 2014-11-22 16:02 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
/******************************************************************************/
/***************************SPI通訊,MASTER程序********************************/
/***************************目標(biāo)MCU:MEGA8L************************************/
/**************************外部晶振3.6864MHz***********************************/
/******************************************************************************/
/**********************************引腳連接************************************/
/********************** MASTER MISO ---- SLAVE MISO ***************************/
/********************** MASTER MOSI ---- SLAVE MOSI ***************************/
/********************** MASTER SCK  ---- SLAVE SCK  ***************************/
/********************** MASTER /SS  ---- SLAVE /SS  ***************************/
/******************************************************************************/
#include <iom8v.h>
#include <macros.h>

#define uchar unsigned char   
#define uint unsigned int   

#define DDR_SPI DDRB
#define MOSI 3
#define MISO 4
#define SCK 5
#define SS 2
#define PORT_SPI PORTB
#define LED_RED_ON PORTB|=BIT(0)
#define LED_RED_OFF PORTB&=~BIT(0)
#define LED_RED_OUTPUT DDRB|=BIT(0)

#define LED_BLUE_ON PORTD|=BIT(7)
#define LED_BLUE_OFF PORTD&=~BIT(7)
#define LED_BLUE_OUTPUT DDRD|=BIT(7)

/********************************SPI初始化*************************************/     
void SPI_Init(void)
   {
         DDR_SPI|=(1<<MOSI)|(1<<SCK);     
         SPCR=(1<<SPE)|(1<<DORD)|(1<<MSTR)|(1<<SPR0);//主,LSB在先
         SPSR=0;
         //SPCR|=(1<<SPIE);
   }
     
#pragma interrupt_handler spi_stc_isr:11   
void spi_stc_isr(void)
   {
        LED_BLUE_OUTPUT;
        LED_BLUE_ON;
        SPDR=0xaa;
        //SPCR&=~(1<<SPIE);      
   }   
     
/********************************SPI SEND**************************************/
void SPI_Send(uchar command)
   {
        DDR_SPI|=(1<<SS);
        PORT_SPI|=(1<<SS);     
        //SPCR|=(1<<MSTR);
        SPCR|=(1<<SPIE);//開SPI中斷     
   }     
      
/***********************************MAIN***************************************/
void main(void)
   {
        Delay_ms(100);
        LED_RED_OUTPUT;
        LED_RED_OFF;
        LED_BLUE_OUTPUT;
        LED_BLUE_OFF;
        SPI_Init();
        SEI();
        while(1)
         {
              Delay_ms(2000);
              LED_RED_ON;
              SPI_Send(0xaa);
              Delay_ms(2000);
              LED_BLUE_OUTPUT;
              LED_BLUE_OFF;
              LED_RED_OFF;
              SEI();
         }     
    }     

偶的本意是想實(shí)現(xiàn)每次SPI中斷后蘭色LED點(diǎn)亮,延時(shí)2秒在啟動(dòng)一次SPI中斷。
偶現(xiàn)在的問題是發(fā)現(xiàn):
   1,按照這個(gè)程序,第一次中斷能進(jìn)去,但以后不行了。現(xiàn)象是2秒后蘭色的LED與紅色的LED一起亮,再過2秒一起暗掉,然后就是紅色的開始每隔2秒閃了,而蘭色的不動(dòng)作,說明SPI中斷進(jìn)不了了;
   2,如果SPI初始化程序里就進(jìn)行允許SPI中斷,則一上電蘭色的LED就亮,過了會(huì)就滅了,然后蘭色的一直不亮,說明SPI中斷也是進(jìn)不了;
   3,后來又調(diào)試了幾次,發(fā)現(xiàn)必須要把MSTR再設(shè)置一下,也就是在發(fā)送的子程序里重新設(shè)置一下,但這樣的結(jié)果是蘭色的LED一直亮,紅色的LED到是交替閃爍,偶搞不明白,偶就在SPI中斷里設(shè)置了點(diǎn)亮蘭色的LED,主程序里隔2秒就關(guān)掉蘭色LED的,為什么會(huì)沒關(guān)掉???
   4,如果中斷里最后加上關(guān)掉SPI,發(fā)送子程序里加上重新設(shè)置MSTR,就得到了偶想要的那個(gè)紅色與蘭色LED同時(shí)亮滅的效果,這又是為什么啊,為什么MSTR要重新設(shè)置一下?
   偶實(shí)驗(yàn)的時(shí)候,SPI的那幾個(gè)口什么都沒接,SS腳也已經(jīng)設(shè)置成輸出高電平,不會(huì)有被拉低的可能啊。
   DATASHEET上寫:
    When the SPI is configured as a master (MSTR in SPCR is set), the user can determine
the direction of the SS pin.
    If SS is configured as an output, the pin is a general output pin which does not affect the
    SPI system. Typically, the pin will be driving the SS pin of the SPI slave.
   If SS is configured as an input, it must be held high to ensure Master SPI operation. If
   the SS pin is driven low by peripheral circuitry when the SPI is configured as a master
   with the SS pin defined as an input, the SPI system interprets this as another master
   selecting the SPI as a slave and starting to send data to it. To avoid bus contention, the
   SPI system takes the following actions:
   1. The MSTR bit in SPCR is cleared and the SPI system becomes a slave. As a
    result of the SPI becoming a slave, the MOSI and SCK pins become inputs.
   2. The SPIF flag in SPSR is set, and if the SPI interrupt is enabled, and the I-bit in
   SREG is set, the interrupt routine will be executed.
   按照DATASHEET,主的時(shí)候MSTR設(shè)置,如果SS被設(shè)置為輸入,且在MSTR為“1“時(shí)被外部拉低,則MSTR會(huì)被清除,但是偶SS一直設(shè)置成輸出高電平,不存在被拉低的可能啊,兩個(gè)困惑的小疑問,或許某一天的將來豁然開朗。
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:68618 發(fā)表于 2014-11-22 16:02 | 只看該作者
真是TMD邪乎,中斷里不關(guān)SPIE,發(fā)生的現(xiàn)象有時(shí)候還不一定是蘭色的LED一直亮,還有好幾次,偶上電斷一斷再連上,蘭色的LED亮了以后也熄滅了,但就是一直不亮了,紅色的LED是一直在那閃的,說明程序也沒死啊,暈死了,如果中斷里的前面再加一句讀取SPSR清SPIF這個(gè)位,則很多時(shí)候是蘭色的LED亮一下熄滅后再也進(jìn)不了中斷,但是偶爾有幾次上電會(huì)出現(xiàn)蘭色LED一直亮的情況,真是匪夷所思,偶現(xiàn)在SPI的口可是什么都沒接啊。偶就對(duì)中斷的工作方式產(chǎn)生了懷疑。
再仔細(xì)研究了一下DATASHEET,應(yīng)該是搞清楚了,SPI中斷是串行傳輸完成響應(yīng)中斷,以前做M8做USART時(shí)用的是USART寄存器空這個(gè)中斷號(hào)(13)來做發(fā)送中斷的,都是在中斷里面進(jìn)行賦值和關(guān)中斷操作,受這個(gè)思路影響,發(fā)送子程序里也沒有先對(duì)SPDR賦值,現(xiàn)在先在發(fā)送子程序里給SPDR賦值就好了。MSTR也不一定要重新設(shè)置,
回復(fù)

使用道具 舉報(bào)

板凳
ID:68618 發(fā)表于 2014-11-22 16:04 | 只看該作者
唉,還是DATASHEET看的不夠仔細(xì),吸取教訓(xùn)。
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 亚洲第一av | 中文字幕在线观看第一页 | 中文字幕一区在线观看视频 | av一区二区三区 | 久久精品男人的天堂 | 黄色网址av | 99精品国产一区二区三区 | 亚洲久久 | 久久国产香蕉 | 亚洲精品中文字幕 | 你懂的国产 | 久免费视频 | 久久最新网址 | 成年免费视频 | 国产精品国产a级 | 日韩精品在线免费观看视频 | 亚洲国产免费 | 久久久久久91 | 日本免费在线 | 欧美国产在线一区 | 亚洲久久久 | 久久久综合网 | 精品欧美一区二区三区 | 久久精品国产一区二区电影 | 欧美精品欧美精品系列 | 日韩精品免费一区二区在线观看 | 农村真人裸体丰满少妇毛片 | 国产视频第一页 | 亚洲国产成人久久综合一区,久久久国产99 | 国产美女在线免费观看 | 国产黄色在线观看 | 亚洲一区国产 | 亚洲欧美综合 | 午夜电影网站 | 看羞羞视频 | 一区二区三区四区免费视频 | av黄色在线观看 | 国产成人精品在线播放 | 自拍在线| 亚洲精品一区二区在线观看 | 国产精品日韩欧美一区二区三区 |