一個SPI的實例,通過SPI實現兩機通訊, 采用中斷方式實現雙全工通訊。
本例用兩MEGA8515實現,連接為:
MISO----MISO
MOSI----MOSI
SCK ----SCK
/SS ----/SS
將要發送的數據加載到發送緩沖區的函數fill_tx_buffer和從接收緩沖區讀出數據的函數read_rx_buffer未給出,根據各自需求請自己完成。
#define SPI_RX_BUFFER_SIZE 10
#define SPI_RX_BUFFER_MASK ( SPI_RX_BUFFER_SIZE - 1 )
#define SPI_TX_BUFFER_SIZE 10
#define SPI_TX_BUFFER_MASK ( SPI_TX_BUFFER_SIZE - 1 )
#define SET_SPI_MODE PORTB.4
#define SPI_MODE PINB.4
static unsigned char SPI_RxBuf[SPI_RX_BUFFER_SIZE];
static volatile unsigned char SPI_RxHead;
static unsigned char SPI_TxBuf[SPI_TX_BUFFER_SIZE];
static volatile unsigned char SPI_TxHead;
//******************************************
// SPI 中斷服務程序
//******************************************
interrupt [SPI_STC] void spi_isr(void)
{
unsigned char data;
if(spi_m==0) //如果spi_m為0,表明是接收狀態
{
data = SPDR; //讀入接受到的數據
SPI_RxBuf[SPI_RxHead-1] = data; //將接收到的數據存入接收緩存區
if ( SPI_RxHead == SPI_RX_BUFFER_MASK ) //如果是接收幀的最后一個數據
{
SPI_RxHead = 0; //已接收數據還原
MSTR=1; //接收完成,將SPI設回主方式
spi_trans_com=1; //置接收完成標志
}
else
{
SPI_RxHead++; //已接收數據計數器加1
}
}
else //如果spi_m為1,表明是發送狀態
{
if ( SPI_TxHead <= SPI_TX_BUFFER_MASK) //如果要發送的數據還未全部發完
{
SPDR = SPI_TxBuf[SPI_TxHead]; //從發送緩存區取數發送
SPI_TxHead++; //已發送數據計數器加1
}
else //如果要發送的數據已全部發完
{
SPI_TxHead=0; //已發送數據計數器還原
DDRB.4=0;
SET_SPI_MODE=1; //釋放總線,以便接收方進入主發送。
spi_m=0;
spi_sending=0; //清空發送中標記
}
}
}
//******************************************
// SPI 初始化
//******************************************
void InitSPI(void)
{
SPCR=0x52;
SPI_RxHead = 0;
SPI_TxHead = 0;
}
//******************************************
//發送數據
//******************************************
void spi_send(void)
{
if(spi_sending==0) //發送中標記為0,表明spi發送空閑
{
fill_tx_buffer(); //調用fill_tx_buffer函數,將要發送的數據加載到發送緩沖區
while(PINB.4==0) //如果PINB.4為低,表明總線被接受方占用,等待直至接受方發送完成。
{;}
InitSPI(); //初始化spi為主方式
DDRB.4=1;
SET_SPI_MODE=0; //將PORTB.4拉低,強迫接收方進入從接收方式
spi_m=1; //置spi_m標志表明為發送狀態
delay_us(10);
spi_sending=1; //置spi_sending標志表明發送進行中
SPDR=0xFF; //開始發送,接收方接收到的第一個數據為0xFF應忽略
SPIE=1; //開SPI中斷,
SPI_TxHead = 0; //已發送數據計數器清0
}
}
void main(void)
{
...
while(1)
{
...
if(spi_trans_com==1) //如果接收完成標志為1,表明有所數據已接收
{
read_rx_buffer(); //調用read_rx_buffer函數,將接收到的數據從接收緩沖區讀出
spi_trans_com=0; //讀完清除接收完成標志
}
...
}
}
AVR單片機SPI通訊實例程序 (C語言源代碼)
- ARM(361233)
相關推薦
51單片機C語言程序設計
(原創【全】) 51單片機C語言程序設計--速學教程實例(入門篇+進階+高級綜合).doc/(原創【全】) 51單片機C語言程序設計--速學教程實例(入門篇+進階+高級綜合).doc/(原創00
2021-07-14 07:17:51
51單片機C語言程序設計教程_電子版樣章(王云編著)
案例來講述單片機的工作原理。本書提供有配套課件,方便進行PPT教學;書中提供完整實例代碼和課后作業參考例程,所有程序代碼都可以在Keil編程軟件上通過調試,并在YL51開發板上驗證,方便讀者參考并動手實踐
2018-10-11 13:47:44
51單片機競賽設計實例程序44例分享
51單片機競賽設計實例程序44例(Proteus仿真資料) 51單片機競賽設計實例程序44例(Proteus仿真資料).zip
2018-07-19 03:00:51
AVR單片機C語言例程(書籍 仿真)集合大全
本內容提供了AVR單片機C語言實例書籍集合,比較全面的介紹了AVR單片機的所有知識書籍適合新手及相關技術人員開發學習.基于AVR Studio+WinAVR(GCC)組合環境和Proteus硬件仿真
2018-10-15 15:03:34
AVR單片機C語言程序框架(單片機最簡操作系統)及詳解
本帖最后由 lvhoujun 于 2014-2-28 00:37 編輯
這是本人以ATMEGA128為例編寫的C語言程序框架,做簡單的修改即適合AVR所有單片機。可以說是一個單片機最簡操作系統
2014-02-12 20:27:23
AVR單片機C語言開發入門與典型實例,單片機學習必看
本帖最后由 一只耳朵怪 于 2018-5-24 17:37 編輯
AVR單片機C語言開發入門與典型實例,是比較全面的,我之前在華清遠見學習的時候的一些學習資料,分享給你們學學。
2018-05-24 15:17:10
AVR單片機C語言開發入門指導
AVR單片機C語言開發入門指導,PDF文檔,希望對大家有用 AVR單片機C語言開發入門指導.pdf 15.76 MB, 下載次數: 64
2018-07-03 09:32:38
AVR單片機C語言編程及應用實例
AVR單片機C語言編程及應用實例本書針對Amel公司的AVR系列單片機和ImageCraft公司的ICC AVR開發環境,詳細地介紹了AT9OLS8535的C語言程序設計。全書共有13章,其內容既
2010-03-19 21:28:42
AVR單片機C語言編程及應用實例
`<p>AVR單片機C語言編程及應用實例針對Atmel公司的AVR系列單片機和ImageCraft公司的ICC AVR開發環境,詳細地介紹了AT90LS8535的C語言
2009-04-27 20:51:49
AVR單片機GCC程序設計
開發人員,我不會建議你使用BASIC 編寫AVR 程序,因為我們在編寫與硬件密切相關的單片機程序時通常需要想象編譯器是如何將這些代碼翻譯成匯編程序的,而C 更適合我們去這樣做。二 GCC 編譯器UNIX 上
2009-04-27 21:11:44
AVR單片機實用C語言程序設計與典型實例..光盤
AVR單片機實用C語言程序設計與典型實例 吳健編著光盤使用說明#################################光盤內容:本光盤中主要放置有書中實例的C語言源程序。
2013-05-31 12:51:05
AVR系列單片機C語言編程與應用實例—金春林*清華大學教材
和指針等。 本書的特點是:深入淺出。從最基本的概念開始,循序漸進地講解單片機的應用開發;列舉了大量實例,使讀者能從實際應用中掌握單片機的開發與應用技術。 本書適合作為從事單片機開發人員的參考用書。AVR系列單片機C語言編程與應用實例[hide][/hide]`
2011-11-16 10:02:32
AVR系列單片機C語言編程及應用實例
AVR系列單片機C語言編程及應用實例對Amel公司的AVR系列單片機和ImageCraft公司的ICC AVR開發環境,詳細地介紹了AT9OLS8535的C語言程序設計。全書共有13章,其內容既
2008-07-11 09:32:23
avr單片機C語言開發入門指導
6.26C能支持的庫函數。本書重點放在如何利用C語言來操作AVR單片機的硬件資源,以及如何編寫一些實用的程序段,最后再通過一些簡單的應用實例來說明如何使用C語言一開發AVR芯片。本書適合開發AVR單片機
2010-03-19 21:24:53
單片機C語言程序實例
`單片機C語言程序,幾百道代碼,適合新手練習,帶注釋。感興趣的還不趕緊戳進去:http://www.nxhydt.com/soft/33/2015/20150721377286.html`
2015-07-22 11:08:53
單片機C語言編程實例
`本書結合目前應用非常廣泛的C語言以及Keil C51編譯器,詳細介紹單片機C語言編程的方法。本書通過大量應用實例對單片機資源及其外圍芯片進行詳細介紹。`
2019-06-22 10:29:50
單片機C語言編程寶典大全,初學必備
單片機應用從零開始(400頁PPT)6. 單片機程序設計實例 7. 單片機應用程序設計技術_周航慈.pdf 8. 8051單片機C語言徹底應用 9. C語言程序實例大全-220個詳細程序源代碼 10. 笨辦法學C語言 (完整翻譯版)
2022-04-18 10:04:16
單片機C語言實例有哪些
單片機C語言實例(400例)/單片機C語言實例(400例)/1-IO輸出-點亮1個LED燈方法1/單片機C語言實例(400例)/1-IO輸出-點亮1個LED燈方法1/IO輸出.Opt單片機C語言實例
2021-07-15 10:06:30
單片機原理及c語言程序設計
0417、C語言程序設計及應用實例單片機的C語言應用程序設計 0413、單片機原理與應用及C51程序設計課件電子教案0414、《單片機原理與應用》(金龍國)電子教案0427、單片機典型模塊設計實例0428、C語言趣味程序百例精解C語言程序設計及應用實例--2
2013-08-14 16:31:29
CVAVR基于CodeVisionAVR的AVR單片機資料
基于CodeVisionAVR平臺的AVR單片機資料陳忠平的《基于Proteus的AVR單片機C語言程序設計與仿真》的例程馬潮老師的《AVR單片機嵌入式系統原理與應用實踐》電子版CVAVR破解版,無長度限制還有一些實驗例程希望對使用CVAVR編程的朋友有用
2012-07-05 12:21:52
【下載】《AVR單片機實用C語言程序設計與典型實例》
`內容簡介《AVR單片機實用C語言程序設計與典型實例》以ATMEL公司新一代AVR系列單片機為主,全面系統地介紹了以AVR為核心構成的單片機嵌入式系統的各種應用,算法分析與仿真等知識。主要內容包括
2017-09-04 17:17:23
利用C語言編寫PIC單片機程序的方法是什么
PI C單片機程序的方法,本刊特推出《PI C 單片機C 語言程序設計》系列連載文章。文中給出的C 語言程序實例,均是可執行的,讀者可以放心引用。原來用各種匯編語言編寫的單片機程序,均可用C一、匯...
2021-07-15 08:40:22
AVR系統單片機C語言編程與應用實例
AVR系統單片機C語言編程與應用實例針對Atmel公司的AVR系列單片機和ImageCraft公司的ICC AVR開發環境,詳細地介紹了AT90LS8535的C語言程序設計。全書共有13章,其內容既涉及到了單片機
2008-10-27 22:51:1198
AVR單片機C語言編程及應用實例
AVR單片機C語言編程及應用實例:本書針對Atmel公司的AVR系列單片機和ImageCraft公司的ICC AVR開發環境,詳細地介紹了AT90LS8535的C語言程序設計。全書共有13章,其內容既涉及到了單片機
2009-04-27 20:45:530
單片機接口技術(C51版)例程源代碼
單片機接口技術(C51版)例程源代碼:文件名基本與教材中的例題序號一致,如"例3-2"的源程序為"Ch3-2"。有些程序在使用前請參閱程序開頭的注釋,這些注釋解釋了程序使用方法。
2009-06-12 23:30:590
AVR單片機與串行AD的SPI接口設計
為了解決信號采集系統的同步串行通訊問題,在理解AVR 單片機SPI接口的通訊原
理和方法的基礎上,分析了AVR 單片機SPI接口的工作過程,
2011-02-18 16:07:59211
秦龍MSP430單片機C語言應用程序設計實例精解的實例程序免費下載
本文檔的主要內容詳細介紹的是秦龍MSP430單片機C語言應用程序設計實例精解的實例程序免費下載。
2020-09-01 08:00:0031
使用單片機實現單片機內置EEPROM讀寫測試的C語言實例程序免費下載
本文檔的主要內容詳細介紹的是使用單片機實現單片機內置EEPROM讀寫測試的C語言實例程序免費下載。
2021-03-30 16:48:0017
評論
查看更多