欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

標(biāo)題: AVR單片機(jī)SPI中斷方式的疑惑 [打印本頁]

作者: aabbcc    時(shí)間: 2014-11-22 16:02
標(biāo)題: AVR單片機(jī)SPI中斷方式的疑惑
/******************************************************************************/
/***************************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è)困惑的小疑問,或許某一天的將來豁然開朗。

作者: aabbcc    時(shí)間: 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è)置,
作者: aabbcc    時(shí)間: 2014-11-22 16:04
唉,還是DATASHEET看的不夠仔細(xì),吸取教訓(xùn)。




歡迎光臨 (http://www.raoushi.com/bbs/) Powered by Discuz! X3.1