AVR单片机SPI通讯实例程序 (C语言源代码)

一个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; //读完清除接收完成标志

}

...

}

}

spi通信c语言发送32字节数据,AVR单片机SPI通讯实例程序 (C - ARM - 电子发烧友网相关推荐

  1. c语言和远光灯标志,汽车仪表盘图标大全,汽车仪表盘指示灯图解 - 汽车电子 - 电子发烧友网...

    对于开车新手来说,熟悉汽车仪表盘可以增加开车的安全感,本文将为大家介绍汽车仪表盘图标大全. 汽车仪表盘图标大全: 车内各类仪表指示灯 1.ABS指示灯 该指示灯用来显示ABS工作状况.当打开钥匙门,车 ...

  2. SPI存储器c语言51程序,AVR单片机SPI通讯实例程序 (C语言源代码)

    AVR单片机SPI通讯实例程序 (C语言源代码) 来源:-- 作者:-- 浏览:213 时间:2016-08-10 14:18 标签: 摘要: AVR单片机SPI通讯实例程序 (C语言源代码) 一个S ...

  3. 全志V3S裸机串口驱动(中断方式接收,DMA接收有问题,小于32字节数据无法触发DMA传输)

    调试DMA接收遇到了个很奇怪的问题,就是DMA发送没问题,DMA接收的时候,如果数据小于32字节,数据被DMA从串口接收FIFO中取走了,但是并不会传输到指定的buff中,这个就没法用于接收未知长度的 ...

  4. 手把手教你Android手机与BLE终端通信--连接,发送和接收数据

    假设你还没有看上一篇 手把手教你Android手机与BLE终端通信--搜索,你就先看看吧,由于这一篇要接着讲搜索到蓝牙后的连接.和连接后的发送和接收数据. 评论里有非常多人问假设一条信息特别长,怎么不 ...

  5. python gui界面制作显示串口数据_python实现串口通讯小程序(GUI界面)

    python实现串口通讯小程序(GUI界面) 使用python实现串口通讯需要使用python的pyserial库来实现,这个库在安装python的时候没有自动进行安装,需要自己进行安装. 1.安装p ...

  6. 单片机c语言字符,单片机C语言(一) - 控制/MCU - 电子发烧友网

    第三课.C51数据类型 每写一个程序,总离不开数据的应用,在学习 c51 语言的过程中掌握理解数据类型也是 很关键的.先看表 3-1,表中列出了 KEIL uVision2 单片机c语言编译器所支持的 ...

  7. 义隆单片机c语言例程,简单的义隆单片机LED闪烁C程序

    简单的义隆单片机LED闪烁C程序 fxhfxh 1726 10 朋友要求做一个由15个发光二极管并联组成的闪烁发光装置,要求价格尽量低,用3V纽扣电池供电,没有开关,只有一个按键.找来找去,目前只发现 ...

  8. STM32F0系列芯片SPI发送一字节数据却输出16个CLK时钟的解决办法

    问题 上一个项目在用寄存器操作STM32F0芯片的SPI_DR寄存器的时候,发现一个问题: 我给DR寄存器赋值一个uint8_t一字节大小的数据,SPI引脚能正确输出数据和时钟,但前面八位正确的数据输 ...

  9. 语言转4字节数据整型_R语言与RGui平台_数据类型_向量_4

    计算机语言RGui平台上的R语言__数据类型_向量_4 R语言进阶4_数据类型_向量1 咱们而可以从自然语言(汉语.英.法.俄.德.日.拉丁.伊斯兰.等等)的基本特征来看--词汇.句子.段落.结构.文 ...

最新文章

  1. lasTools laszip.exe 点云las/laz的无损压缩/解压缩工具
  2. glib 2.0 arm linux,glib源码安装使用方法
  3. QIIME 2教程. 08差异丰度分析gneiss(2020.11)
  4. Git:如何在项目提交历史中查找已删除的文件?
  5. jquery学习手记(4)元素的选择与操作
  6. c语言创建新指针,如何用c语言创建一个指针
  7. 排序算法入门之简单选择排序
  8. sum怎么用python_python sum()函数和.sum(axis=0)函数的使用
  9. 直设计map.html页面,map4.html
  10. django中使用第三方包实现定时任务
  11. Begin using git (Part1) - Git的安装与配置
  12. 【高等数学】基本求导法则与导数公式
  13. 网络安全简历如何写?
  14. 驾驶证到期换新证流程
  15. java系列 - entity,vo转换
  16. 白屏、首屏的定义、影响因素、优化方法
  17. 校园歌手大赛10分c语言,校园歌手大赛策划方案5
  18. 线性代数:裁剪变换(投影变换)(一)
  19. 基于实时计算(flink)打造舆情分析平台——新华智云...
  20. nodej.s 搭建一个socket服务(原生和sockjs)

热门文章

  1. vivado 和 modelsim联合仿真
  2. yum工具卸载和重新安装
  3. 【达内课程】音乐播放器4.0(播放详情页下)
  4. 华为机试:整数最小和
  5. 宝塔 装不上php,宝塔安装php不成功怎么办?
  6. 新手用H5实现基础的echarts表格
  7. GitHub下载速度太慢的解决方法 保姆级教学
  8. java addall 顺序_Java LinkedList addAll()方法
  9. PDF超过6000页,阿里技术专家
  10. 日本殡仪馆帮忙入侵逝者电脑,违反人权吗?