历史上的今天
返回首页

历史上的今天

今天是:2025年01月07日(星期二)

正在发生

2020年01月07日 | AVR复习笔记--AVR单片机SPI多机通讯【包括数据回传与接收】

2020-01-07 来源:eefocus

VR复习笔记—SPI多机通信

最近决定复习下AVR单片机,其实也是为了借此复习下几种简单的通信协议,包括串口,SPI,I2­C等。


本来以为一两个晚上就能搞定的事儿,没想到竟耗费了一周晚上空余的时间。

当然主要是这次的要求要提高点,实现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<        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;

    }

}


在我的例子中有一个主机,两个从机

进行如下通信【数据中的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下的截图


推荐阅读

史海拾趣

HANBIT Electronics公司的发展小趣事

Hamamatsu(滨松光子学株式会社)在电子行业中的发展故事丰富多样,以下是根据公开信息整理的五个相关故事,每个故事均力求准确描述事实:

1. 光电倍增管的创新与突破

Hamamatsu在光电倍增管(PMT)领域取得了显著成就。光电倍增管作为宇宙线观测、中微子实验等高精度探测中的关键器件,其性能和技术要求极高。Hamamatsu抓住市场需求,与东京大学高能物理实验室等科研机构合作,成功研制出大面积探测用光电倍增管,并在多个国际中微子探测实验中得到应用。这一创新不仅推动了Hamamatsu自身的发展,也巩固了其在光电倍增管市场的领先地位。

2. 光电二极管的多样化应用

Hamamatsu的光电二极管产品线广泛,包括硅PIN光电二极管、InGaAs PIN光电二极管等多种类型,广泛应用于医疗生物、高能物理、宇宙探测、精密分析等多个领域。这些产品的多样化应用不仅展示了Hamamatsu在光电技术领域的深厚积累,也为其在全球市场的拓展提供了有力支撑。

3. 光电技术的国际合作与交流

Hamamatsu积极参与国际光电技术的交流与合作,通过举办大型展会、参与国际学术会议等方式,展示其最新的光电技术和产品。例如,Hamamatsu举办的PHOTON FAIR展会,吸引了来自全球的客户和合作伙伴,促进了光电技术的国际交流与合作。这种开放合作的态度,有助于Hamamatsu不断吸收国际先进技术,推动自身技术的持续进步。

4. 应对市场变化的灵活策略

面对电子行业的快速变化,Hamamatsu展现出了高度的市场敏感性和灵活性。当市场需求发生变化时,Hamamatsu能够迅速调整产品结构和研发方向,以满足新的市场需求。例如,在消费电子市场兴起时,Hamamatsu也积极涉足相关领域,推出了一系列适用于消费电子产品的光电传感器件。这种灵活的市场策略,使得Hamamatsu能够在激烈的市场竞争中保持领先地位。

5. 人才培养与团队建设

Hamamatsu深知人才是企业发展的根本动力,因此高度重视人才培养和团队建设。公司建立了完善的人才培养体系,通过内部培训、外部交流等多种方式,不断提升员工的专业技能和综合素质。同时,Hamamatsu还注重团队建设和企业文化建设,营造了一个积极向上、团结协作的工作氛围。这种良好的人才环境和企业文化,为Hamamatsu的持续发展提供了有力保障。

以上五个故事展示了Hamamatsu在电子行业中的发展历程和成就,体现了其在技术创新、市场拓展、国际合作、灵活应变以及人才培养等方面的综合实力。

长园维安(CYGWAYON)公司的发展小趣事

面对电子行业快速发展的挑战,长园维安积极应对,进行转型升级。公司加大研发投入,开发更加智能化、集成化的产品,满足市场需求。同时,长园维安还注重人才培养和引进,建立了一支高素质的技术和管理团队。这些努力使长园维安在激烈的市场竞争中保持领先地位。

CITIZEN公司的发展小趣事

在20世纪中叶,西铁城公司迎来了一次重要的技术突破。1956年,公司成功研制出防震手表,并通过了空中坠表实验,这一创新轰动了整个行业。防震手表的推出不仅提升了西铁城产品的品质,也进一步巩固了其在全球腕表市场中的地位。这一技术的成功应用,也显示了西铁城在精密加工和测量技术方面的实力。

Equinox公司的发展小趣事

在稳步发展健身业务的同时,Equinox还在不断探索新的领域。例如,公司推出了精品酒店品牌Equinox Hotels,将健身与旅游相结合;同时,Equinox还积极进军健康食品、健康科技等领域,以实现多元化的发展战略。未来,Equinox将继续秉承“健康、活力、高品质”的品牌理念,为全球消费者提供更优质的服务和体验。

Dean Technology公司的发展小趣事

为了进一步扩大市场份额,Dean Technology公司开始积极拓展国际市场。他们通过设立海外办事处、与当地企业建立合作关系等方式,将产品推向全球。在这个过程中,公司不断优化产品设计,提高生产效率,以满足不同国家和地区客户的需求。随着国际市场的不断拓展,Dean Technology的高压二极管产品逐渐在全球范围内获得了良好的口碑。

CCS[Custom Computer Services]公司的发展小趣事

随着业务的不断发展,CCS公司意识到市场拓展的重要性。公司积极寻求与国内外知名企业的合作,通过战略合作的方式共同开拓市场。通过与这些企业的合作,CCS公司不仅获得了更多的业务机会,还提高了自身的品牌知名度和市场影响力。同时,CCS公司还积极参加各类行业展会和交流活动,与同行建立广泛的联系和合作关系,为公司的长远发展奠定了坚实的基础。

问答坊 | AI 解惑

PCB Layout中直角走线会产生什么影响?

直角走线一般是PCB布线中要求尽量避免的情况,也几乎成为衡量布线好坏的标准之一,那么直角走线究 竟会对信号传输产生多大的影响呢?从原理上说,直角走线会使传输线的线宽发生变化,造成阻抗的不 连续。其实不光是直角走线,顿角,锐角走线都可 ...…

查看全部问答>

NEC 78K0/KE2 脉冲宽度测量

更多资料请访问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  硕士以 ...…

查看全部问答>

医疗影像系统和家用医疗设备的设计趋势

序:也许有人看到过这篇帖子,是的,这是转自《工业控制》的帖子,我希望在此起一点抛砖引玉的作用,希望大家能把更多的行业信息和最新发展转帖过来,也许我们从中能找到技术和市场的发展脉络,而新技术无疑也是我们不断创新的起始点。 愿大家能 ...…

查看全部问答>

内核启动问题

用vivi出现booting the kernel然后没反映了: 具体如下 vivi> boot Copy linux kernel from 0x00030000 to 0x30008000, size = 0x001d0000 ... done zImage magic = 0x016f2818 Setup linux parameters at 0x30000100 linux command line i ...…

查看全部问答>

wince状态栏的网络图标怎么出来?

请问wince状态栏的网络图标怎么出来? 用PB编译内核时,已经将网络、驱动等相关项都加进去了,并且EBOOT网络下载NK正 常。现在WINCE界面上没有网络图标,请教下是哪里设置不正确? …

查看全部问答>

超级终端不能输入AT命令

GPRS模块MC35I与PC的COM1相连,利用超级终端输入AT命令,但是超级终端不能输入AT,也就是根本不接收输入。以前用的时候都是好的,中间有两个月没用,结果再用就不能输入了。利用COM1可以与ARM进行通信,超级终端可以正常显示,但是COM1与MC35I相连, ...…

查看全部问答>

关于epi功能

关于9b96这款芯片的epi功能,我看手册上说只能接一种类型的外设。我目前遇到的问题是:需要一个连接一个并行输出的A/D转换芯片和一个存储器。但是我不知道能不能实现,希望有用过的人给介绍介绍如何使用!…

查看全部问答>

msp40G2553串口通信问题

在调试串口通信的时候,发现,有定时器模拟的可通信,。但是换作使用内置UART通信的时候发现不能通信,用的是TI的官方历程,在调试时,发现无法进入,接收中断,同样用的TI的官方历程,,在检查问题的时候,看过l其他类型的芯片的UART MODE,发现 ...…

查看全部问答>