亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

串行接口SPI接口應用設計

系統 1548 0

作者:馬潮老師
  使用的同步串行三線SPI接口,可以方便的連接采用SPI通信協議的外圍或另一片AVR單片機,實現在短距離內的高速同步通信。ATmega128的SPI采用硬件方式實現面向字節的全雙工3線同步通信,支持主機、從機和2種不同極性的SPI時序,通信速率有7種選擇,主機方式的最高速率為1/2系統時鐘,從機方式最高速率為1/4系統時鐘。

  ATmega128單片機內部的SPI接口也被用于程序存儲器和數據E2PROM的編程下載和上傳。但特別需要注意的是,此時SPI的MOSI和MISO接口不再對應PB2、PB3引腳,而是轉換到PE0、PE1引腳上(PDI、PDO),其詳見第二章中關于程序存儲器的串行編程和校驗部分的內容。

  ATmega128的SPI為硬件接口和傳輸完成中斷申請,所以使用SPI傳輸數據的有效方法是采用中斷方式+數據緩存器的設計方法。在對SPI初始化時,應注意以下幾點:

.正確選擇和設置主機或從機,以及工作模式(極性),數據傳輸率;

.注意傳送字節的順序,是低位優先(LSB First)還是高位優先(MSB Frist);

.正確設置MOSI和MISO接口的輸入輸出方向,輸入引腳使用上拉電阻,可以節省總線上的吊高電阻。

   下面一段是SPI主機方式連續發送(接收)字節的例程:

#define SIZE100
unsigned
char SPI_rx_buff[SIZE];
unsigned
char SPI_tx_buff[SIZE];
unsigned
char rx_wr_index,rx_rd_index,rx_counter,rx_buffer_overflow;
unsigned
char tx_wr_index,tx_rd_index,tx_counter;

#pragma interrupt_handlerspi_stc_isr:18
void spi_stc_isr( void )
...
... {
SPI_rx_buff[rx_wr_index]
= SPDR; // 從ISP口讀出收到的字節
if ( ++ rx_wr_index == SIZE)rx_wr_index = 0 ; // 放入接收緩沖區,并調整隊列指針
if ( ++ rx_counter == SIZE)
...
... {
rx_counter
= 0 ;
rx_buffer_overflow
= 1 ;
}

if (tx_counter) // 如果發送緩沖區中有待發的數據
... ... {
-- tx_counter;
SPDR
= SPI_tx_buff[tx_rd_index]; // 發送一個字節數據,并調整指針
if ( ++ tx_rd_index == SIZE)tx_rd_index = 0 ;
}

}


unsigned
char getSPIchar( void )
...
... {
unsigned
char data;
while (rx_counter == 0 ); // 無接收數據,等待
data = SPI_rx_buff[rx_rd_index]; // 從接收緩沖區取出一個SPI收到的數據
if ( ++ rx_rd_index == SIZE)rx_rd_index = 0 ; // 調整指針
CLI();
-- rx_counter;
SEI();
return data;
}


void putSPIchar( char c)
...
... {
while (tx_counter == SIZE); // 發送緩沖區滿,等待
CLI();
if (tx_counter || ((SPSR & 0x80 ) == 0 )) // 發送緩沖區已中有待發數據
... ... { // 或SPI正在發送數據時
SPI_tx_buffer[tx_wr_index] = c; // 將數據放入發送緩沖區排隊
if ( ++ tx_wr_index == SIZE)tx_wr_index = 0 ; // 調整指針
++ tx_counter;
}

else
SPDR
= c; // 發送緩沖區中空且SPI口空閑,直接放入SPDR由SIP口發送
SEI();
}


void spi_init( void )
...
... {
unsignedchattemp;
DDRB
|= 0x080 ; // MISO=inputandMOSI,SCK,SS=output
PORTB |= 0x80 ; // MISO上拉電阻有效
SPCR = 0xD5 ; // SPI允許,主機模式,MSB,允許SPI中斷,極性方式01,1/16系統時鐘速率
SPSR = 0x00 ;
temp
= SPSR;
temp
= SPDR; // 清空SPI,和中斷標志,使SPI空閑
}


void main( void )
...
... {
unsigned
char I;
CLI();
// 關中斷
spi_init(); // 初始化SPI接口
SEI(); // 開中斷
while ()
...
... {
putSPIchat(i);
// 發送一個字節
i ++ ;
getSPIchar();
// 接收一個字節(第一個字節為空字節)
………
}

}





  這個典型的SPI例程比較簡單,主程序中首先對ATmega128的硬件SPI進行初始化。在初始化過程中,將PORTB的MOSI、SCLK和SS引腳作為輸出,同時將MISO作為輸入引腳,并打開上拉電阻。接著對SPI的寄存器進行初始化設置,并空讀一次SPSR、SPDR寄存器(讀SPSR后再對SPDR操作將自動清零SPI中斷標志自動清零),使ISP空閑等待發送數據。

  AVR的SPI由一個16位的循環移位寄存器構成,當數據從主機方移出時,從機的數據同時也被移入,因此SPI的發送和接收在一個中斷服務中完成。在SPI中斷服務程序中,先從SPDR中讀一個接收的字節存入接收數據緩沖器中,再從發送數據緩沖器取出一個字節寫入SPDR中,由ISP發送到從機。數據一旦寫入SPDR,ISP硬件開始發送數據。下一次ISP中斷時,表示發送完成,并同時收到一個數據。類似本章介紹的USART接口的使用,程序中putSPIchar()和getSPIchar()為應用程序的底層接口函數(SPI驅動程序是SPI中斷服務程序),同時也使用了兩個數據緩沖器,分別構成循環隊列。這種程序設計的思路,不但程序的結構性完整,同時也適當的解決了高速MCU和低速串口之間的矛盾,實現程序中任務的并行運行,提高了MCU的運行效率。

  本例程是通過SPI批量輸出、輸入數據的示例,用戶可以使用一片ATmega128,將其MOSI和MISO兩個引腳連接起來,構成一個ISP接口自發自收的系統,對程序進行演示驗證。需要注意,實際接收到的字節為上一次中斷時發出的數據,即第一個收到的字節是空字節。

  讀懂和了解程序的處理思想,讀者可以根據需要對程序進行改動,適合實際系統的使用。如在實際應用中外接的從機是一片SPI接口的溫度芯片,協議規程為:主機先要連續發送3個字節的命令,然后從機才返回一個字節的數據。那么用戶程序可以先循環調用putSPIchar()函數4次,將3個字節的命令和一個字節的空數據發送到從機,然后等待一段時間,或處理一些其它的操作后,再循環調用getSPIchar()函數4次,從接收數據緩沖器中連續讀取4個字節,放棄前3個空字節,第4個字節即為從機的返回數據了。

==================================================

改天寫一個關于dsp 的spi程序設計出來。。。。

串行接口SPI接口應用設計


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 26uuu另类欧美亚洲曰本 | 四虎国产精品免费久久久 | 精品成人在线观看 | 精品一区二区三区在线播放 | 国产精品五月天 | 国产欧美另类性视频 | 99精品国产高清一区二区麻豆 | 一本一本久久a久久综合精品蜜桃 | 精品国产自在久久 | 四虎成人免费观看在线网址 | 真人午夜a一级毛片 | 亚洲久草视频 | 日本一级大黄毛片一级 | 激情影院免费 | 狠狠色噜噜狠狠狠狠97不卡 | 久亚洲精品不子伦一区 | 欧美日韩一二三区免费视频观看 | 日韩精品免费一区二区 | 国产高清不卡一区二区 | 国产亚洲精品一区二区在线播放 | 91一区| 久久国产免费观看精品3 | 亚洲精品久久玖玖玖玖 | 国产一国产一级毛片视频在线 | 国产91在线免费 | 四虎4hu永久免费国产精品 | 亚洲精品欧美精品中文字幕 | 国产香蕉在线精彩视频 | 久久久亚洲精品视频 | 日本高清中文字幕一区二区三区a | 国产―笫一页―浮力影院xyz | 亚洲精品国产综合一线久久 | 视频一区在线免费观看 | 国产精品四虎在线观看免费 | 国产香蕉视频在线 | 青青青免费视频精品99 | 免费爱爱片 | 国产精品成人免费 | 5566中文字幕亚洲精品 | 久久一本 | 欧美日韩顶级毛片www免费看 |