久久久久久久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 | 99久久国产| 国产欧美日韩综合精品一区二区 | 亚洲视频一区 | 国产天天操 | 久久精品国产亚洲一区二区三区 | 久久乐国产精品 | 日韩成人免费视频 | 欧美视频一区二区三区 | 久久精品二区 | 精品国产乱码久久久久久丨区2区 | 国产成人99久久亚洲综合精品 | 男女羞羞的网站 | 欧美中文字幕一区二区 | 欧美久久国产精品 | 国产精品中文字幕一区二区三区 | a久久久久久| 男人的天堂中文字幕 | 久久国产精99精产国高潮 | 日日干日日操 | 亚洲成人国产综合 | 久久久久久中文字幕 | 一区二区三区四区五区在线视频 | 亚洲 欧美 日韩在线 | 日韩成人免费视频 | 91麻豆精品国产91久久久久久 | 国产在线观看av | 亚洲精品久久久久中文字幕二区 | av日韩高清| 欧美一区二区三区在线 | 五月天天丁香婷婷在线中 | 国产成人精品福利 | 中国一级特黄视频 | 91久久久久久久久久久久久 | 人人看人人搞 | 久久一区二区三区四区 | 精品视频在线一区 |