最近决定复习下AVR单片机,其实也是为了借此复习下几种简单的通信协议,包括串口,SPI,I2C等。
本来以为一两个晚上就能搞定的事儿,没想到竟耗费了一周晚上空余的时间。
当然主要是这次的要求要提高点,实现SPI的多机通信,
不但要发数据还要回传数据。
实际中还是遇到了比我想象中要大的多的困难。
即使是现在的实现方式也不是很理想。
下面是spi部分的代码,由于spi接收发送用的同一终端,感觉使用起来形式不怎么样,还是采用了轮询标志位的方式
Code
#include "spi.h"
static char mode=1;
void spi_init(char flag)
{
char tmp=0;
mode=flag;
if(mode==1)
{
DDR_SPI = (1<
SPCR = (1<
}
else
{
DDR_SPI = (1<
SPCR = (1<
}
SPSR=0;
tmp=SPSR;
tmp=SPDR;
}
char spi_trans(char data)
{
char ret=0;
if(mode==1)
{
SPDR=data;
while(!(SPSR & (1<
ret=SPDR;
return ret;
}
else
{
while( !(SPSR & (1<
ret=SPDR;
SPDR=data;
return ret;
}
}
在我的例子中有一个主机,两个从机
进行如下通信
发送至1号从机 1 ,2
发送至2号从机 3 ,4
发送至1号从机 5 ,6
发送至2号从机 7 ,8
从机1收到数据后回传 1
从机2收到数据后回传 2
下面还是看代码
Code
#include "basic.h"//自己写的常用函式
#include "usart.h"//usart初始化函式
#include "spi.h"
int main( void )
{
char tmp;
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) ;
return 0;
}
从机程序如下,只列出用PB4的代码,对应1号从机,接收数据正确回传‘1’
关键字:AVR 单片机 SPI 多机通讯
引用地址:
AVR复习笔记--AVR单片机SPI多机通讯
推荐阅读最新更新时间:2024-03-16 14:55
单片机并行口扩展和存储器扩展
单片机并行口扩展和存储器扩展 1、单片机并行口扩展,扩展I/O口采用和数据存储器相同的寻址方式。其方法有三种: 1)总线扩展,通过锁存器对P0口扩展,这一扩展方法只分时占用P0口,而不会影响P0口与其他扩展电路的连接作用。 2)串口扩展,通过串口的工作方式完成I/O口的扩展,多通过移位寄存器164/165实现,缺点明显,占用了串口,采用移位方式,速度较慢。 3)通过片内I/O口扩展,也就是不通过P0口而通过其他片内I/O口扩展,例如8255等。 2、单片机存储器扩展,包括程序存储器的扩展和数据存储器的扩展。由于单片机中的程序存储器和数据存储器严格分开了,因此程序存储器扩展的操作时序有所不同,可分为执行MOVX命令和不执行
[单片机]
东芝为智能仪表扩展基于ARM® Cortex® -M3的微控制器产品阵容
东京 东芝公司(TOKYO:6502)今日宣布推出一款新型微控制器TMPM311CHDUG。这是公司基于ARM Cortex -M3的TX03系列的最新产品。这种微控制器专为智能仪表应用而设计。样品发货将于4月份开始,计划于2015年9月开始批量生产。 用于单相和三相智能仪表的功率测量模拟前端(AFE)需要同时兼顾高精度电流测量、电压测量和功率计算。该新产品集成了24位 型模数(AD)转换器,可同时进行高精度电流测量、电压测量和功率计算,从而确保了高端智能仪表的实现。 应用 智能仪表 测量设备 新产品的关键特性 内置4通道24位 型模数转换器:可同时进行高精度电流和电压测量。单
[单片机]
使用单片机设计的通用变频器
1 引 言 变频器是从上世纪中叶发展起来的一种交流调速设备。它是为了解决传统的交流电机调速困难、传统的交变速设备不但结构复杂且效率和可靠性均不尽人意的缺点而出现的。由于其使交流电机的调速范围和调速性能均大为提升,因此交流电机逐渐代替直流电机出现在各种应用领域,即便是以往只可能是直流电机出现的伺服控制领域。随着电力半导体长足发展,变频器也随之不断进步。如今变频器已深入我们的日常生活,随处可见其为我们服务的身影。 本文主要介绍利用SPMC75F2413A和IPM(PS21865A)实现通用变频器的开发。SPMC75F2413A是由台湾凌阳公司新推出针对工业和家电变频专用的MCU 。它是μ’nSP系列产品的一个新成员,它在4.5V~5
[单片机]
基于头部位置特征的疲劳驾驶检测仪
针对目前严重的疲劳驾驶行为,研制了一种疲劳驾驶检测装置。在座椅头枕上前方正对驾驶员头部的位置安装1个红外线发射二极管和2个红外线接收头,由单片机控制红外线发射的电流强度,同时检测接收头的信息就可以检测头部的相对位置。如果驾驶员处在疲劳驾驶状态中,头部必定偏离正常位置并且时间超过设定值,则输出报警和制动控制信号。在几种典型车辆上对该系统进行了实验,验证了方法的正确性和有效性,并能达到较高的测量精度。
1 检测仪结构特点
该检测仪由单片机控制反射式红外线传感器对驾驶员头部位置进行检测,通过检测驾驶员在常规坐姿下的头部与座椅头枕的相对位置,自动判断驾驶员是否处在疲劳驾驶状态中。
如果驾驶员处在疲劳驾驶状态中,
[嵌入式]
AVR单片机的定义以及优缺点汇总
简介:什么是AVR单片机?AVR单片机有什么优点?为什么要选择AVR单片机?下面一起来学习一下: 什么是AVR单片机?AVR单片机有什么优点?为什么要选择AVR单片机? AVR单片机是ATMEL公司研制开发的一种新型单片机,它与51单片机、PIC单片机相比具有一系列的优点: 1:在相同的系统时钟下AVR运行速度最快; 2: 芯片内部的Flsah、EEPROM、SRAM容量较大; 3:所有型号的Flash、EEPROM都可以反复烧写、全部支持在线编程烧写(ISP); 4:多种频率的内部RC振荡器、上电自动复位、看门狗、启动延时等功能,零外围电路也可以工作; 5:每个IO口都可以以推换驱动的方式输出高、低电平,
[单片机]
89C51单片机之外部中断0、1控制LED
1.proteus仿真图 2.keli代码 #include reg51.h sbit led1=P0^0; sbit led2=P1^0; //外部中断0控制程序 void INT0test() interrupt 0 { led1=~led1; } //外部中断1控制程序 void INT1test() interrupt 2 { led2=~led2; } int main() { EA=1; //全局中断使能 EX0=1; //外部中断0使能 EX1=1; //外部中断1使能 IT0=0; //外部中断0触发方式为低电平有效 IT1=1; //外部中断1触发方式为电平下降沿有
[单片机]
一种3线制半双工SPI接口设计
0 引言 串行外围设备接口SPI(serial peripheralinterface)总线技术是Motorola公司推出的一种微处理器、微控制器及其外设间的一种全/半双工同步串行数据接口标准,具有连接线少、传输效率高等特点,因其硬件功能很强,与SPI有关的软件就相当简单,使CPU有更多的时间处理其他事务。
SPI接口一般采用4条连接线:串行时钟线(SCK)、主机输出/从机输入数据线(MOSI)、主机输入/从机输出数据线(MISO)和低电平使能的从机选择线(SS),有的还带有中断信号线(INT),半双工或单向模式则不需要主机输出/从机输入数据线(MOSI)。为了在减少引脚的基础上完成主从机的双向通讯,本文
[嵌入式]
dsPIC30F6010单片机的原理及应用
1 前言 随着电子技术的发展以及集成电路规模的不断扩大,工业等各应用领域对于核心芯片的要求越来越苛刻。因而,计算机芯片也朝着高速化、专业化、模块化、功能化、低功耗、低电压工作等方向不断地发展、更新。 Microchip公司的PIC系列单片机以其内置Flash以及精简指令集等技术特点成为中低档8位单片机的主流产品,但是在一些复杂系统应用中,它仍存在一些缺陷和不足。为此,Microchip公司新推出了dsPIC30F系列16位单片机。它是一种具有单片机和DSP综合功能的16位CPU,不但保留了单片机的基本性能、丰富了外围模块,还兼具DSP的高速运算能力,是嵌入式系统设计的最佳解决方案之一。由于集多种功能于单一芯片,从而大大节省了电
[应用]