AVR复习笔记—SPI多机通信

发布者:大伊山人最新更新时间:2020-02-24 来源: eefocus关键字:AVR  SPI  多机通信 手机看文章 扫描二维码
随时随地手机看文章

简介: 最近决定复习下AVR单片机,其实也是为了借此复习下几种简单的通信协议,包括串口,SPI,I2­C等。本来以为一两个晚上就能搞定的事儿,没想到竟耗费了一周晚上空余的时间。当然主要是这次的要求要提高点,实现SPI的多机通信,不但要发数据还要回传数据。实际中还是遇到了比我想象中要大的多的困难。即使是现在的实现方式也不是很理想。


下面是spi部分的代码,由于spi接收发送用的同一终端,感觉使用起来形式不怎么样,还是采用了轮询标志位的方式


#include"spi.h"

staticcharmode=1;

voidspi_init(charflag)

{

chartmp=0;

mode=flag;

if(mode==1)

{

DDR_SPI=(1<SPCR=(1<}

else

{

DDR_SPI=(1<SPCR=(1<}

SPSR=0;

tmp=SPSR;

tmp=SPDR;

}


charspi_trans(chardata)

{

charret=0;

if(mode==1)

{

SPDR=data;

while(!(SPSR&(1<ret=SPDR;

returnret;

}

else

{




while(!(SPSR&(1<ret=SPDR;

SPDR=data;

returnret;

}

}






在我的例子中有一个主机,两个从机


进行如下通信【数据中的0(ascii码)和空格不计】


发送至1号从机1,2


发送至2号从机3,4


发送至1号从机5,6


发送至2号从机7,8


从机1收到数据后回传1


从机2收到数据后回传2


下面还是看代码





#include"basic.h"//自己写的常用函式

#include"usart.h"//usart初始化函式

#include"spi.h"

intmain(void)

{

chartmp;

usart_init(9600);

spi_init(1);

PORTB|=(1<<4)|(1<<1);

DDRB|=(1<<4)|(1<<1);



PORTB&=~(1<<4);

tmp=spi_trans(0);

usart_send('');

tmp=spi_trans('1');

usart_send(tmp);

tmp=spi_trans('2');

usart_send(tmp);

PORTB|=(1<<4)|(1<<1);


delay_ms(5);//切换从机时,可能产生总线上的竞争,等待下

//同时因为竞争等原因,下面的第一个数据可能不正确

//至少我在调试时时有问题的所以发个0,算是同步下

PORTB&=~(1<<1);

tmp=spi_trans(0);

usart_send('');

tmp=spi_trans('3');

usart_send(tmp);

tmp=spi_trans('4');

usart_send(tmp);

PORTB|=(1<<4)|(1<<1);


delay_ms(5);


PORTB&=~(1<<4);

tmp=spi_trans(0);

usart_send('');

tmp=spi_trans('5');

usart_send(tmp);

tmp=spi_trans('6');

usart_send(tmp);

PORTB|=(1<<4)|(1<<1);


delay_ms(5);


PORTB&=~(1<<1);

tmp=spi_trans(0);

usart_send('');

tmp=spi_trans('7');

usart_send(tmp);

tmp=spi_trans('8');

usart_send(tmp);

PORTB|=(1<<4)|(1<<1);


return0;

}






从机程序如下,只列出用PB4的代码,对应1号从机,接收数据正确回传‘1’





#include"basic.h"

#include"usart.h"

#include"spi.h"

intmain(void)

{


usart_init(9600);

spi_init(0);


chartmp=0;

DDRB&=~((1<<4));

PORTB|=((1<<4));


while(1)

{

if(PINB_PINB4==0)//检测当前总线是否被占用

{

tmp=spi_trans('1');

usart_send(tmp);

}

}


return0;

}

关键字:AVR  SPI  多机通信 引用地址:AVR复习笔记—SPI多机通信

上一篇:AVR单片机用于太阳能电池控制器的设计
下一篇:AVR单片机通用I/O设计注意事项

推荐阅读最新更新时间:2024-11-02 11:55

AVR单片按键检测
程序代码如下: #include avr/io.h #include util/delay.h int main(void) { DDRA=0XFF; PORTA=0XFF; DDRD=0X00; PORTD=0XFF; while(1) { if(PIND==0XFE) { _delay_ms(100); if(PIND==0XFE)PORTA=~PORTA; } } }
[单片机]
SPI IIC USART 区别
第一个区别当然是名字: SPI(Serial Peripheral Interface:串行外设接口); I2C(INTER IC BUS) UART(Universal Asynchronous Receiver Transmitter:通用异步收发器) 第二,区别在电气信号线上: SPI总线由三条信号线组成:串行时钟(SCLK)、串行数据输出(SDO)、串行数据输入(SDI)。SPI总线可以实现 多个SPI设备互相连接。提供SPI串行时钟的SPI设备为SPI主机或主设备(Master),其他设备为SPI从机或从设备(Slave)。主从设备间可以实现全双工通信,当有多个从设备时,还可以增加一条从设备选择线。
[单片机]
STM8S105K4 SPI相关代码
/* 初始化函数 */ void SPI_FLASH_Init(void) { SPI_Init(SPI_FIRSTBIT_MSB, SPI_BAUDRATEPRESCALER_2, SPI_MODE_MASTER, SPI_CLOCKPOLARITY_HIGH, SPI_CLOCKPHASE_2EDGE, SPI_DATADIRECTION_2LINES_FULLDUPLEX, SPI_NSS_SOFT, 0x07); SPI_Cmd(ENABLE); GPIO_Init(SPI_CS , SPI_Pin_CS, GPIO_MODE_OUT_PP_HIGH_FAST); GPIO_Writ
[单片机]
基于AVR单片的高精度频率调节器
摘要: 精确的频率控制是现代化工业生产与高精度测试的必备手段。基于AD9850可以发生优于1Hz频率精确度的信号,这对于频率测试来说至关重要。本文介绍的这种频率调节器由Atmel公司的AVR单片机Atmega16L作为控制核心,采用4%26;#215;4键盘作为频率值输入设备。AVR单片机扫描键盘并且读入用户设定的频率值。随后,AVR单片机计算出AD9850的控制字,并且对AD9850发出指令。本文介绍的频率控制器可以通过“+1Hz”键和“–1Hz”键微调频率值。本文对频率控制器扩展了液晶显示模块,因此当前频率值可以被实时显示。它可以生成方波和正弦波。设计中使用了看门狗定时器防止程序进入死循环而不能正常工作。 关键词: AVR
[单片机]
基于AVR单片的电力投切装置开发
一、前言 在工矿企业用电设备中存在大量的感性负载,如电弧炉、直流电机调速系统、整流逆变设备等,它们在消耗有功功率的同时,也占用了大量感性无功功率,致使电力功率因数下降。由于无功功率虚占了设备容量、增大了线路的电流值,而线路损耗与电流的平方成正比,因此造成电力资源的巨大浪费。另外,这些感性负载工作时还会产生大量的电力谐波,对电网造成谐波污染,使电能质量恶化,电器仪表工作异常。为了提高功率因数、治理谐波,可以采用动态滤波补偿,由电容器和电感器串联形成消谐回路,起到无功补偿和滤除谐波的作用。各种滤波补偿系统,基本都由电力电容器、铁芯电抗器、无功补偿控制器和电力投切装置等构成,其中电力投切装置负责与电网接通、切断任务,是整个补偿系统中关
[单片机]
基于<font color='red'>AVR</font>单片<font color='red'>机</font>的电力投切装置开发
爱特梅尔为32位AVR UC3微控制器开发浮点单元技术
爱特梅尔公司(Atmel® Corporation)宣布推出全新浮点单元(Floating Point Unit)技术,用于爱特梅尔32位AVR® UC3产品系列。此新技术可使设计师在汽车和工业控制等应用中,采用一个爱特梅尔微控制器(MCU)可以取代传统微控制器和数字信号处理器(DSP) 两芯片方案。 爱特梅尔的32位AVR UC3微控制器特色之一,是其架构具有非常高的数字信号处理性能。UC3 MCU提供通常只在高端DSP才有的定点和整数算法,因而性能超出大部份的微控制器。通过增加一个准确的浮点单元,可让客户只用一个爱特梅尔芯片,即可取代他们目前的双芯片方案。 关于浮点单元 浮点单元可
[单片机]
爱特梅尔为32位<font color='red'>AVR</font> UC3微控制器开发浮点单元技术
AVR汇编语言如何实现如 LJMP @A+DPTR这样的散转结构
include 8515def.inc .dseg keyone:.byte1 .cseg rjmpreset .org0x10 RESET: ldir16,low(RAMEND);ram的顶端 ldir17,high(RAMEND) outspl,r16;设置堆栈指针指向ram顶部 outsph,r17 ldir16,1 stskeyone,r16;变量初始化 L2: ldsR20,keyone ldiR24,low(L8);取散转表首地址 ldiR25,high(L8) clrr21 subir20,1;计算表内偏移量 sbcir21,0 lslr20;注意对FLASH的地址是字寻址 rolr21 addr24,r2
[单片机]
STM32的SPI管脚介绍
SPI1- CS ------ PA4 SPI1- CLK ------ PA5 SPI1- MISO ------ PA6 SPI1- MOSI ------ PA7 SPI2- CS ------ PB12 SPI2- CLK ------ PB13 SPI2- MISO ------ PB14 SPI2- MOSI ------ PB15 SPI3- CS ------ PA15 SPI3- CLK ------ PB3 SPI3- MISO ------ PB4 SPI3- MOSI ------ PB5 对于SPI ,需要打开相关RCC 时钟 主模式下 CLK 配置成复用推挽输出 M
[单片机]
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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