一个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(389826)
相关推荐
热点推荐
AVR单片机C语言例程(书籍 仿真)集合大全
本内容提供了AVR单片机C语言实例书籍集合,比较全面的介绍了AVR单片机的所有知识书籍适合新手及相关技术人员开发学习.基于AVR Studio+WinAVR(GCC)组合环境和Proteus硬件仿真
2018-10-15 15:03:34
AVR单片机C语言编程及应用实例
AVR单片机C语言编程及应用实例本书针对Amel公司的AVR系列单片机和ImageCraft公司的ICC AVR开发环境,详细地介绍了AT9OLS8535的C语言程序设计。全书共有13章,其内容既
2010-03-19 21:28:42
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语言编程宝典大全,初学必备
单片机应用从零开始(400页PPT)6. 单片机程序设计实例 7. 单片机应用程序设计技术_周航慈.pdf 8. 8051单片机C语言彻底应用 9. C语言程序实例大全-220个详细程序源代码 10. 笨办法学C语言 (完整翻译版)
2022-04-18 10:04:16
【下载】《AVR单片机实用C语言程序设计与典型实例》
`内容简介《AVR单片机实用C语言程序设计与典型实例》以ATMEL公司新一代AVR系列单片机为主,全面系统地介绍了以AVR为核心构成的单片机嵌入式系统的各种应用,算法分析与仿真等知识。主要内容包括
2017-09-04 17:17:23
AVR系统单片机C语言编程与应用实例
AVR系统单片机C语言编程与应用实例针对Atmel公司的AVR系列单片机和ImageCraft公司的ICC AVR开发环境,详细地介绍了AT90LS8535的C语言程序设计。全书共有13章,其内容既涉及到了单片机
2008-10-27 22:51:11
102
102AVR单片机C语言编程及应用实例
AVR单片机C语言编程及应用实例:本书针对Atmel公司的AVR系列单片机和ImageCraft公司的ICC AVR开发环境,详细地介绍了AT90LS8535的C语言程序设计。全书共有13章,其内容既涉及到了单片机
2009-04-27 20:45:53
0
0单片机接口技术(C51版)例程源代码
单片机接口技术(C51版)例程源代码:文件名基本与教材中的例题序号一致,如"例3-2"的源程序为"Ch3-2"。有些程序在使用前请参阅程序开头的注释,这些注释解释了程序使用方法。
2009-06-12 23:30:59
0
0AVR单片机与串行AD的SPI接口设计
为了解决信号采集系统的同步串行通讯问题,在理解AVR 单片机SPI接口的通讯原
理和方法的基础上,分析了AVR 单片机SPI接口的工作过程,
2011-02-18 16:07:59
211
211DS18B20基于51单片机的C语言源代码
DS18B20基于51单片机的C语言源代码。实现温度数据的读取和显示,使用时请注意程序中所定义的每个单片机引脚,希望对单片机初学者有帮助。
2015-11-03 11:33:07
8
8基于AVR+PROTEUS仿真_单片机C语言程序设计实例100例
本书基于AVR Studio+WinAVR(GCC)组合环境和PROTEUS硬件仿真平台,提供了100个AVR单片机C程序设计案例。
2016-03-22 18:02:28
35
35单片机教程之51单片机C语言程序设计教程(王云)资料合集
本文档的主要内容详细介绍的是单片机教程之51单片机C语言程序设计教程(王云)资料合集主要内容包括了:电子教材,例程代码,课后作业答案,配套视频
2018-11-14 08:00:00
385
385学习AVR单片机C语言编程的方法和教程说明
AVR单片机是一种新型高效的单片机,主要的编程语言是C语言,但与一般的c语言又有所不同,与其它的单片机C语言也有所不同,AVR单片机C语言有自已的特点.学习AVR单片机首先要解决 AVR单片机c语言
2019-12-30 08:00:00
17
17秦龙MSP430单片机C语言应用程序设计实例精解的实例程序免费下载
本文档的主要内容详细介绍的是秦龙MSP430单片机C语言应用程序设计实例精解的实例程序免费下载。
2020-09-01 08:00:00
36
36使用单片机C语言实现步进电机转动原理的实例程序和工程文件免费下载
本文档的主要内容详细介绍的是使用单片机C语言实现步进电机转动原理的实例程序和工程文件免费下载。
2021-02-02 10:48:18
10
10使用单片机实现ADC0832模数转换与LCD显示的C语言实例程序免费下载
本文档的主要内容详细介绍的是使用单片机实现ADC0832模数转换与LCD显示的C语言实例程序免费下载。
2021-03-30 16:49:01
63
63使用单片机实现单片机内置EEPROM读写测试的C语言实例程序免费下载
本文档的主要内容详细介绍的是使用单片机实现单片机内置EEPROM读写测试的C语言实例程序免费下载。
2021-03-30 16:48:00
19
19
电子发烧友App




评论