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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 7939|回復: 2
打印 上一主題 下一主題
收起左側

AVR單片機SPI中斷方式的疑惑

[復制鏈接]
跳轉到指定樓層
樓主
ID:68618 發表于 2014-11-22 16:02 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
/******************************************************************************/
/***************************SPI通訊,MASTER程序********************************/
/***************************目標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();
         }     
    }     

偶的本意是想實現每次SPI中斷后蘭色LED點亮,延時2秒在啟動一次SPI中斷。
偶現在的問題是發現:
   1,按照這個程序,第一次中斷能進去,但以后不行了。現象是2秒后蘭色的LED與紅色的LED一起亮,再過2秒一起暗掉,然后就是紅色的開始每隔2秒閃了,而蘭色的不動作,說明SPI中斷進不了了;
   2,如果SPI初始化程序里就進行允許SPI中斷,則一上電蘭色的LED就亮,過了會就滅了,然后蘭色的一直不亮,說明SPI中斷也是進不了;
   3,后來又調試了幾次,發現必須要把MSTR再設置一下,也就是在發送的子程序里重新設置一下,但這樣的結果是蘭色的LED一直亮,紅色的LED到是交替閃爍,偶搞不明白,偶就在SPI中斷里設置了點亮蘭色的LED,主程序里隔2秒就關掉蘭色LED的,為什么會沒關掉???
   4,如果中斷里最后加上關掉SPI,發送子程序里加上重新設置MSTR,就得到了偶想要的那個紅色與蘭色LED同時亮滅的效果,這又是為什么啊,為什么MSTR要重新設置一下?
   偶實驗的時候,SPI的那幾個口什么都沒接,SS腳也已經設置成輸出高電平,不會有被拉低的可能啊。
   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,主的時候MSTR設置,如果SS被設置為輸入,且在MSTR為“1“時被外部拉低,則MSTR會被清除,但是偶SS一直設置成輸出高電平,不存在被拉低的可能啊,兩個困惑的小疑問,或許某一天的將來豁然開朗。
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 日本a网站| 免费一级片 | 奇米超碰| 99久久婷婷国产综合精品电影 | 欧美成人精品二区三区99精品 | 国产在线中文字幕 | 在线视频99 | 国产成人精品综合 | 成人黄色电影在线播放 | 午夜精品一区二区三区在线观看 | 日日爱夜夜操 | 亚洲精品观看 | 亚洲婷婷六月天 | 毛片韩国| 国产精品夜间视频香蕉 | 亚洲第一天堂无码专区 | 毛片国产| 区一区二区三在线观看 | 婷婷激情综合 | 国产视频一区二区 | www.色.com| 99久久视频 | 久久久久成人精品亚洲国产 | 久久九九99 | 中文字幕在线观看视频一区 | 国产成人精品一区二区三区网站观看 | 99久久中文字幕三级久久日本 | 欧美片网站免费 | 日韩欧美一区在线 | 国产成人免费观看 | 色综合99| 玖玖精品视频 | 欧美专区日韩专区 | 中文字幕第二十页 | 国产中文字幕在线观看 | 成人黄色电影在线播放 | 不卡的av一区 | 日韩久久精品 | 国产精品视频久久久 | 久久久久久国产精品久久 | 日日夜夜免费精品视频 |