历史上的今天
今天是:2025年01月07日(星期二)
2020年01月07日 | AVR复习笔记--AVR单片机SPI多机通讯【包括数据回传与接收】
2020-01-07 来源:eefocus
VR复习笔记—SPI多机通信
最近决定复习下AVR单片机,其实也是为了借此复习下几种简单的通信协议,包括串口,SPI,I2C等。
本来以为一两个晚上就能搞定的事儿,没想到竟耗费了一周晚上空余的时间。
当然主要是这次的要求要提高点,实现SPI的多机通信,
不但要发数据还要回传数据。
实际中还是遇到了比我想象中要大的多的困难。
即使是现在的实现方式也不是很理想。
下面是spi部分的代码,由于spi接收发送用的同一终端,感觉使用起来形式不怎么样,还是采用了轮询标志位的方式
#include "spi.h"
static char mode=1;
void spi_init(char flag)
{
char tmp=0;
mode=flag;
if(mode==1)
{
DDR_SPI = (1< else { DDR_SPI = (1< SPSR=0; tmp=SPSR; tmp=SPDR; } char spi_trans(char data) { char ret=0; if(mode==1) { SPDR=data; while(!(SPSR & (1< return ret; } else { while( !(SPSR & (1< SPDR=data; return ret; } } 在我的例子中有一个主机,两个从机 进行如下通信【数据中的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" 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’ #include "basic.h" #include "usart.h" #include "spi.h" int main( void ) { usart_init(9600); spi_init(0); char tmp=0; DDRB&=~((1<<4)); PORTB|=((1<<4)); while(1) { if(PINB_PINB4==0) //检测当前总线是否被占用 { tmp=spi_trans('1'); usart_send(tmp); } } return 0; } 下面为proteus下的截图
史海拾趣
|
直角走线一般是PCB布线中要求尽量避免的情况,也几乎成为衡量布线好坏的标准之一,那么直角走线究 竟会对信号传输产生多大的影响呢?从原理上说,直角走线会使传输线的线宽发生变化,造成阻抗的不 连续。其实不光是直角走线,顿角,锐角走线都可 ...… 查看全部问答> |
|
更多资料请访问bbs.getsoon.com.cn NEC 78K0/KE2 脉冲宽度测量 (16位定时器/计数器00) 程序功能: 采用TM00计数器,通过按键模拟脉冲输入,测量脉冲宽度,并从LED显示出来。 程序运行现象: 上电后按K4按钮模拟脉冲,按下时间长度显示在LED ...… 查看全部问答> |
|
11月23日最新:82个IC电子通讯岗位,含简单介绍及薪资范围(平均20万以上) IC设计类 1. Manager /Sr. Manager 硕士以上,7年以上,MLC/SLC,英语熟练,上海,薪水open 2. Sr/Staff/Sr. Staff Design Engineer,硕士以上,5年左右,MLC/SLC,英语熟练,上海,薪水open 3. Analog 硕士以 ...… 查看全部问答> |
|
序:也许有人看到过这篇帖子,是的,这是转自《工业控制》的帖子,我希望在此起一点抛砖引玉的作用,希望大家能把更多的行业信息和最新发展转帖过来,也许我们从中能找到技术和市场的发展脉络,而新技术无疑也是我们不断创新的起始点。 愿大家能 ...… 查看全部问答> |
|
请问wince状态栏的网络图标怎么出来? 用PB编译内核时,已经将网络、驱动等相关项都加进去了,并且EBOOT网络下载NK正 常。现在WINCE界面上没有网络图标,请教下是哪里设置不正确? … 查看全部问答> |
|
GPRS模块MC35I与PC的COM1相连,利用超级终端输入AT命令,但是超级终端不能输入AT,也就是根本不接收输入。以前用的时候都是好的,中间有两个月没用,结果再用就不能输入了。利用COM1可以与ARM进行通信,超级终端可以正常显示,但是COM1与MC35I相连, ...… 查看全部问答> |
|
在调试串口通信的时候,发现,有定时器模拟的可通信,。但是换作使用内置UART通信的时候发现不能通信,用的是TI的官方历程,在调试时,发现无法进入,接收中断,同样用的TI的官方历程,,在检查问题的时候,看过l其他类型的芯片的UART MODE,发现 ...… 查看全部问答> |




