一个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语言程序,几百道代码,适合新手练习,带注释。感兴趣的还不赶紧戳进去:https://www.elecfans.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
评论
查看更多