spi通信c语言发送32字节数据,AVR单片机SPI通讯实例程序 (C - ARM - 电子发烧友网
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 - 电子发烧友网相关推荐
- c语言和远光灯标志,汽车仪表盘图标大全,汽车仪表盘指示灯图解 - 汽车电子 - 电子发烧友网...
对于开车新手来说,熟悉汽车仪表盘可以增加开车的安全感,本文将为大家介绍汽车仪表盘图标大全. 汽车仪表盘图标大全: 车内各类仪表指示灯 1.ABS指示灯 该指示灯用来显示ABS工作状况.当打开钥匙门,车 ...
- SPI存储器c语言51程序,AVR单片机SPI通讯实例程序 (C语言源代码)
AVR单片机SPI通讯实例程序 (C语言源代码) 来源:-- 作者:-- 浏览:213 时间:2016-08-10 14:18 标签: 摘要: AVR单片机SPI通讯实例程序 (C语言源代码) 一个S ...
- 全志V3S裸机串口驱动(中断方式接收,DMA接收有问题,小于32字节数据无法触发DMA传输)
调试DMA接收遇到了个很奇怪的问题,就是DMA发送没问题,DMA接收的时候,如果数据小于32字节,数据被DMA从串口接收FIFO中取走了,但是并不会传输到指定的buff中,这个就没法用于接收未知长度的 ...
- 手把手教你Android手机与BLE终端通信--连接,发送和接收数据
假设你还没有看上一篇 手把手教你Android手机与BLE终端通信--搜索,你就先看看吧,由于这一篇要接着讲搜索到蓝牙后的连接.和连接后的发送和接收数据. 评论里有非常多人问假设一条信息特别长,怎么不 ...
- python gui界面制作显示串口数据_python实现串口通讯小程序(GUI界面)
python实现串口通讯小程序(GUI界面) 使用python实现串口通讯需要使用python的pyserial库来实现,这个库在安装python的时候没有自动进行安装,需要自己进行安装. 1.安装p ...
- 单片机c语言字符,单片机C语言(一) - 控制/MCU - 电子发烧友网
第三课.C51数据类型 每写一个程序,总离不开数据的应用,在学习 c51 语言的过程中掌握理解数据类型也是 很关键的.先看表 3-1,表中列出了 KEIL uVision2 单片机c语言编译器所支持的 ...
- 义隆单片机c语言例程,简单的义隆单片机LED闪烁C程序
简单的义隆单片机LED闪烁C程序 fxhfxh 1726 10 朋友要求做一个由15个发光二极管并联组成的闪烁发光装置,要求价格尽量低,用3V纽扣电池供电,没有开关,只有一个按键.找来找去,目前只发现 ...
- STM32F0系列芯片SPI发送一字节数据却输出16个CLK时钟的解决办法
问题 上一个项目在用寄存器操作STM32F0芯片的SPI_DR寄存器的时候,发现一个问题: 我给DR寄存器赋值一个uint8_t一字节大小的数据,SPI引脚能正确输出数据和时钟,但前面八位正确的数据输 ...
- 语言转4字节数据整型_R语言与RGui平台_数据类型_向量_4
计算机语言RGui平台上的R语言__数据类型_向量_4 R语言进阶4_数据类型_向量1 咱们而可以从自然语言(汉语.英.法.俄.德.日.拉丁.伊斯兰.等等)的基本特征来看--词汇.句子.段落.结构.文 ...
最新文章
- lasTools laszip.exe 点云las/laz的无损压缩/解压缩工具
- glib 2.0 arm linux,glib源码安装使用方法
- QIIME 2教程. 08差异丰度分析gneiss(2020.11)
- Git:如何在项目提交历史中查找已删除的文件?
- jquery学习手记(4)元素的选择与操作
- c语言创建新指针,如何用c语言创建一个指针
- 排序算法入门之简单选择排序
- sum怎么用python_python sum()函数和.sum(axis=0)函数的使用
- 直设计map.html页面,map4.html
- django中使用第三方包实现定时任务
- Begin using git (Part1) - Git的安装与配置
- 【高等数学】基本求导法则与导数公式
- 网络安全简历如何写?
- 驾驶证到期换新证流程
- java系列 - entity,vo转换
- 白屏、首屏的定义、影响因素、优化方法
- 校园歌手大赛10分c语言,校园歌手大赛策划方案5
- 线性代数:裁剪变换(投影变换)(一)
- 基于实时计算(flink)打造舆情分析平台——新华智云...
- nodej.s 搭建一个socket服务(原生和sockjs)