简介: 最近决定复习下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; }
上一篇:AVR单片机用于太阳能电池控制器的设计
下一篇:AVR单片机通用I/O设计注意事项
推荐阅读最新更新时间:2024-11-02 11:55
设计资源 培训 开发板 精华推荐
- 数字无线麦克风
- 使用基于 ZICM357SP2-2-R Ember EM35x 收发器模块的 Mesh Connect EM35x 迷你模块的典型应用电路
- 使用 ROHM Semiconductor 的 BD5343 的参考设计
- 具有增强型 LED 驱动器和接近感应的 SX8636 低功耗电容式按钮触摸控制器(8 个传感器)的典型应用
- M031BT 双模电竞鼠标方案
- LT6654BHS6-3.3 升压型输出电流电压基准的典型应用
- LM1117T-3.3稳压模块
- 使用 Diodes Incorporated 的 PT8A 3516C 的参考设计
- LT1193 的典型应用 - 视频差分放大器
- 窝窝梁山派智能小车