历史上的今天
返回首页

历史上的今天

今天是:2025年02月24日(星期一)

正在发生

2020年02月24日 | AVR复习笔记—SPI多机通信

2020-02-24 来源:eefocus

简介: 最近决定复习下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;

}

推荐阅读

史海拾趣

Electron Products Inc公司的发展小趣事

EPI一直非常重视产品的品质管理。公司建立了严格的质量管理体系,从原材料采购到产品生产、检测、包装等各个环节都进行严格把控。此外,EPI还注重持续改进,不断引入先进的生产技术和设备,提升产品的质量和性能。这些举措使得EPI的产品在市场上享有很高的声誉和口碑。

Arduino公司的发展小趣事

Arduino平台从一开始就秉持着开源和合作的理念。它的源代码、硬件设计和文档都是公开的,鼓励开发者们共同参与和贡献。这种开放的精神吸引了大量的开发者加入Arduino社区,共同推动Arduino平台的发展。同时,Arduino也与许多企业和机构建立了合作关系,共同推动电子行业的发展和创新。

Bel Power Solutions公司的发展小趣事

Bel Power Solutions的创立源于对电源转换和管理技术的深刻理解和创新追求。公司创始人们看到了电力电子技术在各个行业领域的广阔应用前景,并决心打造一个专业、高效的电源解决方案提供商。然而,在创立初期,公司面临着资金短缺、技术难题以及市场竞争的严峻挑战。但创始人们凭借坚定的信念和不懈的努力,逐步攻克了技术难关,推出了首款电源转换产品,初步在市场上站稳了脚跟。

Elec & Eltek公司的发展小趣事

Elec公司成立于20世纪初,最初只是一家小型电子元件生产商。创始人李明(化名)对电子技术有着深厚的兴趣和独到的见解。在他的带领下,Elec公司逐步研发出具有竞争力的电阻、电容等基础元件,并逐渐在市场中崭露头角。随着电子技术的不断发展,Elec公司敏锐地捕捉到半导体技术的潜力,开始投入巨资研发。经过数年的努力,Elec公司成功研发出具有自主知识产权的半导体芯片,这一突破让Elec公司在电子行业中声名鹊起。

兵字(BingZi)公司的发展小趣事

兵字公司的创始人李元兵,在经历了多年的研究所工作后,怀揣着对电子元器件领域的深厚情感与独到见解,决定投身创业。他深知,在电子行业这个日新月异的领域,唯有掌握核心技术,才能在激烈的市场竞争中立足。于是,兵字公司从成立之初,就致力于电源变压器和触发变压器的研发与生产,凭借过硬的技术实力和优质的产品质量,迅速在市场中站稳了脚跟。

Fanstel公司的发展小趣事

Fanstel公司深知人才是企业发展的关键因素。因此,公司一直注重人才的培养和引进。公司建立了完善的人才培养机制,为员工提供各种培训和学习机会,帮助他们提升自身素质和能力。同时,Fanstel还积极引进高端人才,打造了一支具有丰富经验和专业技能的研发团队。这些人才的加入为公司的技术创新和产品研发提供了有力支持。

问答坊 | AI 解惑

【新品推荐】低阻MOS管 8205A

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 ...…

查看全部问答>

使用dsPIC作具有感應器或無感應器BLDC馬達控制講義實驗資料 845Labs.zip

使用dsPIC作具有感應器或無感應器BLDC馬達控制講義實驗資料 845Labs.zip…

查看全部问答>

BENQ M32 AT$DESTINFO 命令出错

我已经能让模块登陆网络,并能获取到模块登陆的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 ...…

查看全部问答>

2440SD卡开发求助

不知道怎么回事,俺第一次做SD卡,但是碰到了很大麻烦。 用ADS裸机测试程序没有问题。 但是弄到PB下面却不行了(微软的驱动)-------看不见SD卡盘符,串口打印信息也有问题。 平台描述 2440+512M nand flash+1G MicroSD卡 wince5.0+由4.2升至5 ...…

查看全部问答>

请教RVDS 2.2破解方法

我于http://board.verycd.com/t250493.html下载了ARM REALVIEW开发软件套件,可以按那破解方法产生LICENSE文件时出错,是什么原因啊?…

查看全部问答>

MSP430学习笔记之三:IO口

MSP430不同型号的器件端口是不一样地:   端口名称:                P1 P2 P3 P4 P5 P6 S COM MSP430F11X         ...…

查看全部问答>

【MSP430共享】msp4304*4矩阵键盘中断式处理模块

由于MPS430F144的p1,P2口都带有中断功能,因此使用中断的方式处理显得非常简单。并且可以发挥MSP430的低功耗特点,等待中断的过程中使用低功耗模式,待有按键输入即中断到来时就退出低功耗模式处理中断。 电路的连接非常简单,即p1口的1234作为列 ...…

查看全部问答>

浅析视频会议终端系统市场动态与前景

浅析视频会议终端系统市场动态与前景2012年06月11日   投影时代       视频会议终端市场正面临着巨大的转变。几年以前,机顶盒和移动系统在视频会议市场中占据了主导地位,它们主要都是通过ISDN连接,然而当今的市 ...…

查看全部问答>

T I 的“A9”-- 你注意到了吗?

不知道大家感觉到没有,在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, ...…

查看全部问答>