技术文档

单片机查忙位 不同类型单片机之间如何“搭讪”(通信方式)?从这几个实例来看

小编 2024-10-08 技术文档 23 0

不同类型单片机之间如何“搭讪”(通信方式)?从这几个实例来看

几种常用单片机之间的通信方式

①采用硬件UART进行异步串行通信。这是一种占用口线少,有效、可靠的通信方式;但遗憾的是许多小型单片机没有硬件UART,有些也只有1个UART,如果系统还要与上位机通信的话,硬件资源是不够的。这种方法一般用于单片机有硬件UART且不需与外界进行串行通信或采用双UART单片机的场合。

②采用片内SPI接口或I2C总线模块串行通信形式。SPI/I2C接口具有硬件简单、软件编程容易等特点,但目前大多数单片机不具备硬件SPI/I2C模块。

③利用软件模拟SPI/I2C模式通信,这种方式很难模拟从机模式,通信双方对每一位要做出响应,通信速率与软件资源的开销会形成一个很大的矛盾,处理不好会导致系统整体性能急剧下降。这种方法只能用于通信量极少的场合。

④口对口并行通信,利用单片机的口线直接相连,加上1~2条握手信号线。这种方式的特点是通信速度快,1次可以传输4位或8位,甚至更多,但需要占用大量的口线,而且数据传递是准同步的。在一个单片机向另一个单片机传送1个字节以后,必须等到另一个单片机的接收响应信号后才能传送下一个数据。一般用于一些硬件口线比较富裕的场合。

⑤利用双口RAM作为缓冲器通信。这种方式的最大特点就是通信速度快,两边都可以直接用读写存储器的指令直接操作;但这种方式需要大量的口线,而且双口RAM的价格很高,一般只用于一些对速度有特殊要求的场合。

从上面几种方案来看,各种方法对硬件都有很大的要求与限制,特别是难以在功能简单的单片机上实现,因此寻求一种简单、有效的,能在各种单片机之间通信的方法具有重要的意义。③、④方案中,双方单片机要传递的每一位或每一个字节做出响应,通信数据量较大时会耗费大量的软件资源,这在一些实时性要求高的地方是不允许的。

针对这一问题,假设在单片机之间增加1个数据缓冲器,大批数据先写入缓冲区,然后再让对方去取,各个单片机对数据缓冲器都是主控模式,这样必然会大大提高通信效率。谈到数据缓冲,我们马上会想到并行RAM,但是并行RAM需要占用大量的口线(数据线+地址线+读写线+片选线+握手线),一般在16条以上。这是一个让人望而生畏的数字,而且会大大增加PCB面积并给布线带来一定的困难,极少有人采用这种方式。串行接口的RAM在市场上很少见,不但难以买到而且价格很高。移位寄存器也可以做数据缓冲器,但目前容量最大的也只128位,因为是“先进先出”结构,所以不管传递数据多少,接收方必须移完整个寄存器,灵活性差而且大容量的移位寄存器也是少见难买的。一种被称为“铁电存储器”芯片的出现,给我们带来了解决方法。

利用铁电存储器作为数据缓冲器的通信方式

铁电存储器是美国Ramtran公司推出的一种非易失性存储器件,简称FRAM。与普通EEPROM、Flash-ROM相比,它具有不需写入时间、读写次数无限,没有分布结构可以连续写放的优点,因此具有RAM与EEPROM的双得特性,而且价格相对较低。

现在大多数的单片机系统配备串行EEPROM(如24CXX、93CXX等)用来存储参数。如果用1片FRAM代替原有EEPROM,使它既能存储参数,又能作串行数据通信的缓冲器。2个(或多个)单片机与1片FRAM接成多主-从的I2C总线方式,增加几条握手线,即可得到简单高效的通信硬件电路。在软件方面,只要解决好I2C多主-从的控制冲突与通信协议问题,即可实现简单、高效、可靠的通信了。

实例(双单片机结构,多功能低功耗系统)

(1)硬件

W78LE52与EMC78P458组成一个电池供电、可远程通信的工业流量计。78P458采用32.768kHz晶振,工作电流低,不间断工作,实时采集传感器的脉冲及温度、压力等一些模拟量;W78LE52采11.0592MHz晶振,由于它的工作电流较大,采用间断工作,负责流量的非线性校正、参数输入、液晶显示、与上位机通信等功能,它的UART用于远程通信。2个单片机共用1片I2C接口的FRAM(FM24CL16)组成二主一从的I2C总线控制方式,W78LE52的P3.5、P3.2分别与78P458的P51、P50连接作握手信号线A与B。我们把握手线A(简称A线)定义为总线控制、指示线,主要用于获取总线控制权与判别总线是否“忙”;握手线B(简称B线)定义为通知线,主要用于通知对方取走数据。

(2)I2C总线仲裁

由于我们采用的是二主一从的I2C总线方式,因此防止2个主机同时去操作从机(防冲突)是一个非常重要的问题。带有硬件I2C模块的器件一般是这样的,器件内部有1个总线仲裁器与总线超时定时器:当总线超时定时器超时后指示总线空闲,这时单片机可以发出获取总线命令,总线仲裁器通过一系列操作后确认获取总线成功或失败;超时定时器清零,以后的每一个SCL状态变化对总线所有主机的超时定时器进行清零,以防止它溢出,指示总线正处于“忙”状态,直到一个主机对总线控制结束不再产生SCL脉冲;超时定时器溢出,总线重新回到“空闲”状态。但是目前大多数单片机没有配备硬件I2C模块,而且当2个主机的工作频率相差较大时,超时定时器定时值只能设为较大的值,这样也会影响总线的使用效率。

下面介绍一种用软件模拟I2C总线仲裁的方式(I2C读写操作程序的软件模拟十分多见,这里不再多述):用1条握手线A,当A线高电平时,指示总线空闲;当其中一个主机要获取总线控制权时,先查询总线是否空闲,“忙”则退出,空闲则向A线发送一个测试序列(如:1000101011001011),在每次发送位“1”后读取的A线状态。如果读取状态为“0”,马上退出,说明有其它器件已经抢先获取总线;如果一个序列读取的A线状态都正确,则说明已成功获得总线控制权,这时要拉低A线以指示总线“忙”,直到读写高A线,使总线回到“空闲”状态。不同的主机采用不同的测试序列,或产生随机测试序列,测试序列长度可以选得长一些,这样可以增加仲裁的可靠性。

(3)通信协议

一个可靠通信体系,除了好的硬件电路外,通信协议也至关重要。在单片机系统RAM资源与执行速度都非常有限的情况下,一个简捷有效的协议是非常重要的。下面具体介绍一种比较适用于单片机通信的协议,数据以包的形式传送。数据包结构:

①包头——指示数据包的开始,有利于包完整性检测,有时可省略;

②地址——数据包要传送的目标地址,若只有双机通信或硬件区分地址可以省略;

③包长度——指示整个数据包的长度;

④命令——指示本数据包的作用;

⑤参数——需要传送的数据与参数;

⑥校验——验证数据包的正确性,可以是和校验、异或校验、CRC校验等或者是它们的组合;

⑦包尾——指示数据包的结尾,有利于包完整性检测,有时可省略。

(4)通信流程

首先,要在FRAM里划分好各个区域,各个单片机的参数区、数据接收区等。然后,单片机可以向另一个单片机发送数据包,发送完毕之后通过向握手线B发送1个脉冲通知对方取走数据;接收方读取数据并进行处理后,向FRAM内发送方的数据接收区写入回传数据或通信失败标志,再向握手线B发送1个脉冲回应发送方。

如果需要单片机2发送的话,只需交换一下操作过程即可。

4 总结

通过实践可知,以上方法是可行的。与其它方法相比具有发下优点:

①简单。占用单片机口线少(SCL、SDA、握手线A、握手线B)。

②通用。软件模拟I2C主机方式,可以在任何种类的单片机之间通信。

③高效。由于采用数据缓冲,可以在不同时钟频率、不同速度的单片机之间通信;读写数据时,可以I2C总线的最高速度进行,可以实现1次传送大量数据;在一个单片机向FRAM传送数据时,另一个单片机无须一一作出响应或等待,可以进行其它程序操作,提高软件工作效率。

④灵活。通信硬件接口对于各个单片机是对等的,通过软件配置,每个单片机既可以根据需要主动发送通信,也可以只响应其它单片机的呼叫。

⑤容易扩展。通过增加地址识别线,修改通信协议,即可做到多机通信。

以下是需要注意的地方:

①为了提高通信效率,握手线B最好使用中断端口,负脉冲宽度一定要满足速度较低单片机中断信号要求。如果没有中断的话应增加1条口线,用改变端口状态的方法通知对方,等待对方查询,而不是负脉冲。

②向对方发送负脉冲时,应屏蔽自己的中断。

③由于参数与通信缓冲区同时设在同一片FRAM内,要避免对参数部分的误操作。一个较好的解决办法是把参数存放在地址的后半部分(A2=1),在进行通信操作时,把FRAM的WP引脚拉高(地址在后半部分的单元写保护),这样可以有效地防止测验时对参数区误操作。

④由于I2C总线在一个时间段内只有1个主机和1个从机,所以当1个单片机正在写通信数据时,另一个单片机是不能对FRAM进行操作的。如果需要实时、频繁地读取FRAM中参数的话,请预先将参数读入RAM单元使用或另外增加专门存放参数的芯片。

单片机初学者如何正确问问题?

不知道你有没有好奇过,你问别人问题,为什么别人不鸟你?

如果有,请继续看去,如果没有,就更应该看看。

经常会收到一些小白的咨询…除了无际单片机的学员,大多数我都是已读不回。

为什么?

一方面是我时间非常有限。

另一方面是懒得理,能不能领悟就看他自己了。

领悟什么?

我来讲讲我的故事,相信大家多多少少有这种经历。

我刚开始学单片机的时候,经常混迹在一些技术群,论坛里。

主要是碰到问题的时候,能快速解决掉。

有时候问问题,偶尔会有人回应下,大多数问题都是石沉大海的。

技术的学习过程既枯燥又迷茫,没人指导,更是难上加难。

后面也加了一些大神,心想这种一对一应该反馈更快一点。

刚开始,对方也会回,只是回得比较冷漠,后面直接就不理我了。

那时有点不解对方为什么这么高傲,但是没去关心为什么,这个不理我就去找另外一个呗。

然后陆陆续续我也加了几个,发现结果都差不多。

当时经历尚浅,想法也单纯,并没意识是自己的问题。

等经历多了,慢慢就开窍了。

有的人,总是有贵人扶持他。

有的人,狗看到都掉头走。

为什么差别这么大?难道他比我长得好看吗?

我承认好看有天生的优势,但起到决定性作用的肯定是高情商,用东北的方言叫会来事

就拿我们学习单片机来当例子好了。

不懂就问是好事,就怕你这样问。

案例1: 一上来就贴一堆代码问哪里有问题。

案例2: 你好,我有个单片机问题,能不能帮我解决下?然后发一堆图片。

案例3: 你有xx软件吗?给我发一个

案例4: 单片机怎么学?要学什么?

案例5: 我看了你的教程,那个地方为什么要这样写?

……

案例实在太多了,我都懒得翻了,翻得越多好友列表的人越少。

大多数案例,都犯了以下几个错误:

1.没礼貌,不尊重别人时间

2.缺失核心诉求,问的问题涉及面太广,回答时间成本高

3.一味地向对方索取价值,不懂感恩

如果你按照这种方式问问题,别人回你一次,绝对不会回你第二次。

能回你第三次以上的,肯定是在铺垫阶段,后面宰你一顿狠的。

想彻底解决这个问题,你记住这句话就够了:

人和人交往,本质都是一场价值互换,你获取别人价值的同时也要给别人提供价值。

就好比你和朋友出去吃饭,每次买单他都上厕所,你下次肯定也不会叫他对吧?

下面,分享下,我问问题的方法:

1.如果我认为这个问题对我来说很重要,那我会先给对方提供价值,直接发个H包,然后再问问题。

这招是百试百灵,这招都不灵的,后面的方法就不用试了。

我发钱的时候也会心疼,但问题解决后或许能给我带来N倍的回报,还是很值得。

很多大佬,哪怕你发H包,他也不会要的,大佬一般不缺你这几十几百的,他的时间更值钱。

但只要他不是特别忙,都会适当回复你的问题,是出于你对他时间的尊重,觉得你会做人,或许以后还能成为他的客户,买他的产品。

如果他回复的比较简短,只是大概给你提供点思路,无非就是三点:一是你发的H包不够大,二是他太忙,三是他确实也不懂。

2.问问题之前马屁先拍起来,比如说大佬打扰了,看了你的xx文章,xx教程,受益匪浅,简直跟我现在经历的一模一样,我天生愚钝,没前辈悟性高,有个问题困扰了几天都没解决,今天鼓起勇气请教下前辈,不着急,等前辈有空了再回答就行。

价值并不一定是用钱衡量的,能给别人提供好的情绪,也是一种价值。

大家都心照不宣,明知道是假话,但听着爽就行。

只要你问的方式对,问题好回答,我相信大多数人都会回复你,毕竟只是举手之劳。

还有一点非常重要,就是问题一定要描述详细清楚,降低对方回答成本和门槛。

描述问题可以参照这个模板:目前在做什么东西,出现什么问题?问题现象是什么?为解决这个问题做了哪些尝试?

正面教材例子:

现在我在学单片机准备做xx项目,现在单片机外设都能用起来,但是实现xx项目的按键检测功能没有思路,有思路又不知道代码该怎么写,我以为自己基础差,又回去学了一遍C语言和单片机,发现结果还是一样。

反面教材例子:

大佬,xx项目的功能要怎么实现?

如果是你,你更愿意回答谁的问题?

最后彩蛋时间 ,最近很多小伙伴找我要一些单片机学习资料,然后我根据自己从业十年经验,业余熬夜肝了几个通宵,精心整理一份「单片机入门到高级教程+工具包」全部无偿共享给大家!!!

据说有小伙伴靠这份资料顺利进入BAT大厂,所以保存了一定要好好学习。

几乎覆盖了C语言、单片机、模电数电、原理图和PCB设计、单片机模块化编程等等,非常适合初学者入门和进阶。

最后奉上个人总结的最佳学习线路图 ,以及每个阶段会碰到的瓶颈,让你迅速度过新手阶段。

后期人数多了我也会组建一些交流群,让大家能认识更多的大佬。

这里不方便放链接,想要上面「单片机入门到高级教程+工具包」 和想进入技术社群 的,可以找「无际单片机」全网同名 的。

相关问答

ST 单片机 芯片为什么有两个芯片?

ST单片机芯片有两个芯片的原因是因为ST单片机的内核和外设是分开的,而内核又分为多个模块,每个模块都有自己的控制单元。这样设计的好处是可以方便地更换不同...

有会 单片机 的吗?

有会单片机的吗?

帮个忙, 单片机 远程云端考试报价是多少?

[回答]单片机远程云端考试的价格都是不一样的,我知道有个网站,网站里边都是一些有保障的大公司,你可以去看一下。做单片机远程云端考试的公司很多,公司不...

帮个忙,氨氮在线监测系统运维托管服务是怎么收费的?

[回答](3)该传感器由采样头、检测装置、单片机系统及抽气系统组成,测量快速准确、检测灵敏度高、性能稳定、维护简单等特点在线式粉尘浓度监测系统由LBT-G...

帮个忙童鞋们!求推荐一下,51 单片机 程序开发都有什么开发工...

[回答]发工具+程序+资料2018-11-03该压缩包包括许多资料内容,其中有51全套开发工具、程序、资料等。适合入门和准备竞赛的同学使用。是51开发的...适合入...

单片机 中f=(bit)(y>> 7);这句话是什么意思f在什么情况下等于...

[最佳回答]这个程序应该是取出y最高位的值,1602液晶的程序

帮个忙大佬们 求推荐!景观雨水收集控制系统厂家现货供应,雨...

[回答]目前流行的方案是采用由数字电路组成的大规模集成电路,加上大功率可关断器件组成直流脉宽调速系统(PWM),进而发展成用单片机控制的功能更强的全数字...

帮个忙在座的朋友,在线等!急急急! 单片机 开发板哪个好? 单片 ...

[回答]一、单片机与嵌入式系统概述:包括嵌入式系统概念、吴鉴鹰单片机开发板的使用、应用领域和发展趋势、市场主流单片机性能比较与选型、常用51核单片机...

lcd1602间接连法?

虽然LCD1602的显示屏幕与显示字符都较小,实用性并不强,但是在一般的教学实验中,它仍不失为一个常用的输出显示设备。LCD1602与单片机连接的线路共有11条,其...

单片机 用锂电池供电,肿么判断锂电池插入了充电器。Q2是低电...

你可以在C+端出来串一个电阻接三极管1脚,三极管二脚接单片机I/O口然后接入充电器时三极管导通不接时不导通,将单片机脚设为输出并上拉电阻使能就可以了,然后检...

猜你喜欢