AVR的SPI程序

发布者:BlissfulMoon最新更新时间:2016-01-07 来源: eefocus关键字:AVR  SPI程序 手机看文章 扫描二维码
随时随地手机看文章
一个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程序 引用地址:AVR的SPI程序

上一篇:AVR单片机的 太阳能控制器设计
下一篇:AVR搞错熔丝位,导致芯片死锁的解决办法

推荐阅读最新更新时间:2024-03-16 14:42

自制AVR单片机ISP下载线电路解析
自制AVR 单片机 ISP下载线 单片机编程器的作用是将调试好的程序烧写到单片机的 存储器 中。本文介绍的AVR单片机ISP下载线的成本只有10元左右,非常适合初学者自制。 AVR单片机的程序可以使用串行在线编程(ISP)方式下载写入,即可直接在 电路 板上进行程序的烧写和修改,所需的装置就是一根ISP下载线。 本文介绍的ISP下载线使用计算机的并口对单片机编程.不仅支持AVR单片机,也支持对51单片机中AT89S系列单片机的编程。 一、下载线电路 下载线的电路见图1。该下载线是STK200/300型的下载线。74HC244是8 缓冲器 电路,用来作计算机并口和单片机的缓冲隔离。图1中的LPT连接到计算机的并口,作计算
[单片机]
自制<font color='red'>AVR</font>单片机ISP下载线电路解析
AVR单片机红外遥控键值解码实验
AVR学习笔记十八、红外遥控键值解码实验 18.1 实例功能 红外线遥控是目前使用最广泛的一种通信和遥控手段。由于红外线遥控装置具有体积 小、功耗低、功能强、成本低等特点,因而,继彩电、录像机之后,在录音机、音响设备、空凋机以及玩具等其它小型电器装置上也纷纷采用红外线遥控。工业设备中,在高压、辐射、有毒气体、粉尘等环境下,采用红外线遥控不仅完全可靠而且能有效地隔离电气干扰。 在这个实验中,我们采用红外线遥控器和一体化红外接收头来进行红外遥控键值解码的 实验,本实例分为三个功能模块,分别描述如下: ● 单片机系统:利用 ATmega16单片机与一体化红外接收器组成红外接收电路。 ● 外围电路:红外接收电路、串口电平转换电路
[单片机]
<font color='red'>AVR</font>单片机红外遥控键值解码实验
icc avr LCD1602显示屏程序
入口参数说明: // control port //#define SET_RS sbi(PORTB,5) //#define CLR_RS cbi(PORTB,5) //#define OUT_RS sbi(DDRB,5) //#define SET_RW sbi(PORTB,6) //#define CLR_RW cbi(PORTB,6) //#define OUT_RW sbi(DDRB,6) //#define SET_E sbi(PORTB,7) //#define CLR_E cbi(PORTB,7) //#define OUT_E sbi(DDRB,7)
[单片机]
AVR单片机的通用USB接口模块设计
引言   USB接口以其数据传输快、连接简单、易于扩展、支持热插拔等特点已成为外设与PC通信的主要方式之一。随着嵌入式系统的发展,嵌入式微处理器需增加通用的USB接口,以便实现与PC等USB主机系统的通信。针对这样的需求,这里采用PHILIPS公司的USB接口器件PDIUSBD12和Atmel公司的AVR系列单片机ATmega8设计一种通用的USB接口模块。该模块可方便为各种嵌入式微处理器增加USB接口,从而实现与USB主机系统的高速通信。 2 系统硬件设计   该系统模块的控制核心是AVR高速单片机ATmega8。AVR单片机是新一代基于哈佛结构的高速RISC微控制器,具有速度快、价格低、可靠性高,I/O口线驱动能力
[嵌入式]
用单片机(AVR)比较准确地读出PS2鼠标位移(X,Y轴位移)
之前为了用鼠标对小车的移动坐标进行测量,所以找了很多资料用做```但后来发现网上的资料或者程序基本上都是让鼠标工作在默认模式(Stream模式)而去读鼠标的X,Y轴的位移.后来我经过试验,发现这样很难实现,因为鼠标轻轻一动(状态有任何变化)就立即发送数据,所以,这样的话,单片机的速度是跟不上的,移动速度过快的话误差会非常的大.接着仔细看了关于PS2鼠标的资料就决定让鼠标工作在Remote模式,果然测量的误差大大的减少了(呵呵呵)!!!!!] 工作模式如下 鼠标的工作模式: 1、Reset模式:鼠标上电或受到复位命令(0xFF)时进入次模式。(一般电脑才用吧) 设置缺省的Sample rate:100samples/s;
[单片机]
基于AVR单片机的便携式无线医疗点滴监控系统
  引言   智能化和便携式是现代电子产品的发展趋势,医疗电子的智能化使得医务人员的操作变得更方便。医务人员可随身携带手持式监控仪对各病房点滴实时监控,及时了解相关情况;如遇突发情况如点滴低于设定警戒值,终端监控装置可产生中断信号,主控制端则可优先进行相应的处理。本设计实现了一种以AT32UC3A0512[1]单片机为主控制器的便携式远程无线点滴监控系统,可及时了解点滴状态,提高医疗点滴设备安全性。   1 系统原理介绍   本系统主要包括两个部分:手持式控制端和终端监控装置。手持式控制端主要实现信息输入和查询界面的操作,通过输入待查询的病房号及点滴速度值,以数据包形式发送给相应的病房监控终端,实时显示终端传送来的点滴状态数据
[单片机]
基于<font color='red'>AVR</font>单片机的便携式无线医疗点滴监控系统
基于AVR的电源管理系统设计方案
前 言 当今, 空中机器人技术在民用及国防等诸多领域中的广泛应用,已经越来越被人们所重视, 并吸引了各国专家学者的注意。小型旋翼机器人是以模型直升机为载体, 装备上传感器单元, 控制单元和伺服机构等装置以实现自主飞行。而为了提高飞机的安全性, 需要设计一套设备监测系统, 实时监测飞机的姿态信息、机载设备的状况以及电源的情况等。 该平台所使用的电源是两节锂电池串联组成的电池组, 利用锂离子电池的充放电特性, 设计了一套以mega16l 为核心的充放电管理系统。锂电池具有体积小、能量密度高、无记忆效应、循环寿命高、高电压电池和自放电率低等优点, 与镍镉电池、镍氢电池不太一样的是必须考虑充电、放电时的安全性,以防止特性劣
[单片机]
基于<font color='red'>AVR</font>的电源管理系统设计方案
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved