历史上的今天
今天是:2025年02月24日(星期一)
2020年02月24日 | AVR复习笔记—SPI多机通信
2020-02-24 来源:eefocus
简介: 最近决定复习下AVR单片机,其实也是为了借此复习下几种简单的通信协议,包括串口,SPI,I2C等。本来以为一两个晚上就能搞定的事儿,没想到竟耗费了一周晚上空余的时间。当然主要是这次的要求要提高点,实现SPI的多机通信,不但要发数据还要回传数据。实际中还是遇到了比我想象中要大的多的困难。即使是现在的实现方式也不是很理想。
下面是spi部分的代码,由于spi接收发送用的同一终端,感觉使用起来形式不怎么样,还是采用了轮询标志位的方式
#include"spi.h"
staticcharmode=1;
voidspi_init(charflag)
{
chartmp=0;
mode=flag;
if(mode==1)
{
DDR_SPI=(1< else { DDR_SPI=(1< SPSR=0; tmp=SPSR; tmp=SPDR; } charspi_trans(chardata) { charret=0; if(mode==1) { SPDR=data; while(!(SPSR&(1< returnret; } else { while(!(SPSR&(1< 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; }
史海拾趣
|
Gem micro semiconductor Inc. GM8205A Pb free Pb Dual N-Channel High Density Trench MOSFET (20V, 6.0A) PRODUCT SUMMARY VDSS ID RDS(on) (m-ohm) Max 28 @ VGS =4.0V, ID=6.0A ...… 查看全部问答> |
|
我已经能让模块登陆网络,并能获取到模块登陆的IP地址,但是使用BENQ M32 AT$DESTINFO 链接服务器的时候出错 不知道怎么回事? AT+CGDCONT=1,\"IP\",\"CMNET\" OK AT%CGPCO=1,\"PAP,,\", 1 OK AT$DESTINFO=\"115.46.37.254\" ,1,1029 EXT: I ...… 查看全部问答> |
|
不知道怎么回事,俺第一次做SD卡,但是碰到了很大麻烦。 用ADS裸机测试程序没有问题。 但是弄到PB下面却不行了(微软的驱动)-------看不见SD卡盘符,串口打印信息也有问题。 平台描述 2440+512M nand flash+1G MicroSD卡 wince5.0+由4.2升至5 ...… 查看全部问答> |
|
我于http://board.verycd.com/t250493.html下载了ARM REALVIEW开发软件套件,可以按那破解方法产生LICENSE文件时出错,是什么原因啊?… 查看全部问答> |
|
【MSP430共享】msp4304*4矩阵键盘中断式处理模块 由于MPS430F144的p1,P2口都带有中断功能,因此使用中断的方式处理显得非常简单。并且可以发挥MSP430的低功耗特点,等待中断的过程中使用低功耗模式,待有按键输入即中断到来时就退出低功耗模式处理中断。 电路的连接非常简单,即p1口的1234作为列 ...… 查看全部问答> |
|
浅析视频会议终端系统市场动态与前景2012年06月11日 投影时代 视频会议终端市场正面临着巨大的转变。几年以前,机顶盒和移动系统在视频会议市场中占据了主导地位,它们主要都是通过ISDN连接,然而当今的市 ...… 查看全部问答> |
|
不知道大家感觉到没有,在TI的例程中,如果你修改了代码后再存盘,总是提示有问题,不能存盘。 这是因为文件中有一个字符: “ Copyright Texas Instruments �2010”即在2010前面的那个方框天作祟, 它不是个正常的 ...… 查看全部问答> |
|
昨天上午看的视频,特权的按键消抖,想了好久,到现在终于弄明白了,下面是我理解的方式: 先上他的程序: module key_led(clk,rst_n,sw1_n,sw2_n,sw3_n, led_d3,led_d4,led_d5, Q1,Q2,Q3,Q4,Q5, ...… 查看全部问答> |




