0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

几种IO口模拟串口"硬核"操作

电子设计 来源:电子设计 作者:电子设计 2022-02-10 11:51 次阅读

1、聊一聊

好了,今天为大家带来几种IO口模拟串口"硬核"操作,相信大家对类似于串口这样的电平类通信会有新的认识。

2、IO模拟串口需求

"IO模拟UART"是作者大一加入学校创新团队老师出的第一道题目。毕竟当时专业知识不够,心里想:“实验室老师怎么这么变tai,有现成的串口不用,非得整个模拟串口”,接到这个题目一头雾水,于是上网各种找资料,最后基本实现了该功能,实现办法算是最初级的实现方式,不过确实给我开启了嵌入式的大门,所以今天也把这方面的东西分享给大家,希望对大家有帮助。

IO模拟串口需求

● 很多小伙伴应该都了解到现在很多的高性能的MCU都有大量的串口外设,比如下图的stm32F103系列USART高达5个,然而在我们一般的项目中可能仅仅就使用了2个左右的样子,并且串口外设引脚还可以remap重新映射,这对于那些对串口资源需求量比较大的项目,或许带来了一些缓解的福音。

上图来源于:ST芯片datasheet

● 但是对于一些系统集成类项目,串口作为一种常用的简易通信方式基本上是大部分设备都会预留的外置接口,然而不同的厂家通信接口协议都不太一样,串口的配置信息比如波特率、格式等等都不尽相同,所以这样大量的串口资源的需求就成为了MCU选型的一种评估条件。

往往这样的系统集成软件代码设计相对比较简单,基本上是进行数据收发或者转发等等功能,所以也没有必要选择非常高性能的控制器,这样串口的软件实现成为了一种需求。

对于一些USART硬件上连接错误,比如原理图引脚弄错,如果飞线非常影响外观,重新制版开发周期拉长,那么模拟串口也是值得考虑的。

3、IO模拟串口原理

大部分的通信方式都是通过电平传递信号,高电平表示1,低电平表示0,制定通信电平01的时间和空间规则,通信双方就可以根据对应的规则进行解析数据,从而进行信息的传递,下面作者简单把串口通信的物理通信格式跟大家板书一下,以便后面模拟串口进行参考。

通信物理格式

下面作者以8个数据位,1个停止位,无奇偶校验位为例:

分析一下:

上图就是一帧简单的串口数据帧,总线处于空闲的时候处于高电平,通过一个起始位,作为一帧数据的开始,然后以LSB->MSB的方式依次传输一个8位的数据,最后以1bit的停止位结束,这样就结束了一个byte数据的传输。

那么但我们发送N个数据,总线上就会有N个这样的数据帧传输,这样就形成了大家平常所谓的"字节流",在一个总线上所有的bit所维持的电平时间是固定的,这个时间的由波特率来决定,比如9600bit/s,也就是说其一个电平维持的为(1/9600)s。那个这个参数就也成了模拟串口信号的基础时间约束。

值得大家注意的是串口通信的数据帧格式并不是全是(8个数据位,1个停止位,无奇偶校验位)同样的格式,其中数据位个数也有7,8,9个,停止位也有2个的,这个具体根据双方协议格式来进行选择,同时通信还有同步、异步,全双工和半双工等等,大家不太理解可以找时间补补。

上面我们了解了串口的电平格式,下面开始进入真正模拟串口的阶段。

4、IO模拟串口必备妙招

作者这里会为大家介绍几种办法来模拟串口,每种方案都有自己的特点,大家可以根据实际项目和资源进行选择和开发。

1、纯延时模拟

这种方式就是当年老师出模拟串口题我所采用的办法,可以说该办法仅仅只是为了模拟一个串口出来(俗称 : 为了交作业),从一个电平到下一个电平的过程均采用硬延时,然而这里的延时就是对应着波特率所规定的电平持续时间,传输1位所需要的时间 T = 1/9600 约为104.167us,那么我们只需要按照对应的格式翻转IO口,然后delay延时对应的时间即可完成模拟。

参考伪代码:

1/************************************************ 2 * Fuction :IO_UartSend 3 * Descir : IO口模拟串口发送 4 * Author : (公众号:最后一个bug) 5 ***********************************************/ 6void IO_UartSend( sUart *pUart,unsigned char byte) 7{ 8 9 unsigned char bitCnt = 8; 10 pUart->SetTxPin(pUart,PIN_LOW); //发送 Start bit 11 pUart->BaudDelay(pUart); // 根据baudRate延时 12 while(bitCnt--) //循环发送data bit 13 { 14 pUart->SetTxPin(pUart,(pUart & 0x01)); //发送 Start bit 15 byte >>= 1; //移位所发数据 16 pUart->BaudDelay(pUart); //根据baudRate延时 17 } 18 pUart->SetTxPin(pUart,PIN_HIGH); //发送stop bit 19 pUart->BaudDelay(pUart); //根据baudRate延时 20} 21 22/************************************************ 23 * Fuction :IO_UartRecv 24 * Descir : IO口模拟串口接受 25 * Author : (公众号:最后一个bug) 26 ***********************************************/ 27unsigned char IO_UartRecv(sUart *pUart) 28{ 29 unsigned char Recv; 30 unsigned char bitCnt = 8; 31 32 while(!pUart->GetRxPin(pUart)) //如果接受到低电平起始位 33 { 34 pUart->BaudDelay(pUart); //根据baudRate延时 35 while(bitCnt--) 36 { 37 Recv >>= 1; 38 if(pUart->GetRxPin(pUart))Recv |= 0x80; //如果接受到电平为1,则置位 39 pUart->BaudDelay(pUart); //根据baudRate延时 40 } 41 } 42 return Recv; //最终返回接受到的数据 43}

分析一下:

上面主要是IO口模拟串口的发送和接受,发送相对比较简单,接受部分通过不断的查询对应的接收引脚是否已经拉低成为低电平,如果拉低成为了低电平就认为接受到了start_bit,后面便通过延时进行后面数据的接收。然而其中根据波特率进行的延时一般就直接用指令周期来进行测量延时了。

此方法对于简单的模拟串口收发功能基本实现了,不过其只能实现通信的半双工,同时通过不断的查询RX的电平状态比较浪费CPU资源,那么需要进一步改善。

2、外部中断法

查询比较耗费时间和资源,那么自然而然就想到采用中断的方法来进行处理,采用IO口的外部中断功能当RX引脚接受到一个start_bit的时候触发一个下降沿外部中断(记得关外部中断),然后在外部中断中进行延时获得对应的bit数据,其处理过程与上面的延时法并没有很大的区别,所以这就不过多解释。

以上均存在的不稳定因素 :

其不稳定因素主要来源于传输的电平翻转不是绝对的稳定,同时波特率传输的时间也不一定完全相同,如下图所示:

分析一下:

如上图所示首次获取电平的位置,都是在下降沿的位置开始进行数据的获取,然后通过波特率所对应的延时来进行下一bit位的获取,从而获得最终的传输数据。

大家应该都知道通信线路上是存在物理阻抗的,其对应的通信线路上的电平变化是不可能像上图中的方波那么标准的,其过程均存在一个上升时间和下降时间,同时再加上传输的bit时间间隔并不是严格的一致,所以在电平变化附近进行电平的判断是会存在误判的风险。

然而如果我们在首次获取以后延时半个周期,如上图蓝色虚线箭头所示位置进行判断便能够比较可靠的获得通信bit数据了。

虽然能够获得稳定的数据,不过采用硬延时在软件设计中终究是一个不太好的实现方案,同时以上通信还无法实现全双工,所以还是有必要再进行优化改善。

3、外部中断+定时器

其实要解决硬延时最直接的处理办法就是使用定时器来进行处理,大家把发送和接受都放到对应的时间间隔里处理,这里大家比较常用的一种方案就是使用外部中断获得start_bit的位置,然后在外部中断中开启1/2bit定时,比如9600波特率,其一个bit传输需要104.167us,那么一般我们会采用104.167us/2的来设置定时时间进行后续电平的获取,如下图所示:

分析一下:

然而这样的方案,在仅仅模拟一个串口还是比较方便,不过如果模拟多个串口就需要多个定时器,这样实在是太浪费资源了。

那么是否用一个定时器就能搞定呢?很多小伙伴可能会说:我直接开一个bit周期的定时器不断的定时周期到来进行判断不就可以了吗?下面我们简单的看下该办法的效果。

4、单定时器法

首先这里实验一下bit周期定时法,作者编写好相应的代码以后,以20ms的速度发送两个字符55,然后让其回显的实验结果如下:

我们发现其存在较高的误码问题,其主要的原因还是跟我们之前所说的影响因素有关,如果定时器中断到来的时间刚好位于串口电平跳变附近,那么极有可能会存在读取IO口电平错误问题。

那么所有的问题就归结到如何在电平稳定的时候读取IO口的状态,那么最直接的办法就是提高定时器的中断频率,比如1/3bit周期法等等更高的定时器中断频率,如下图所示1/3bit周期法:

100060098-117087-7.png

分析一下:

采用1/3bit周期法,其起始位的下降沿一定在1-2之间,如果我们判断起始位在1位置处,后续数据bit仍然是1位置,还是会出现之前的不稳定因素,所以这里需要调整读取IO的位置。

那么采用1/3bit周期法会在判断起始bit下降沿的下一个定时器周期开始读取对应的电平,如果在1位置读取到了第一个低电平,那么后续都会在2位置进行数据读取;如果在2位置才读取到了第一个低电平,后续都会在3位置进行数据读取,这样在2,3位置读取的数据均是处于比较稳定的数据。

下面是作者采用1/3bit周期法的结果,该办法也是大家经常选用的。

100060098-117088-8.png

4、其他方法

对于一些高端的MCU一般会有捕获口,其实捕获口有点类似于中断外部+定时器的方法,不过其原理是通过计算每个相邻边沿跳变中间所包含的bit个数,从而获得最终的数据,如下图所示:

分析一下:

采用捕获的办法不再是采集电平,通过定时器获得每个跳变之间的时间间隔,然后通过时间间隔/波特率对应的电平持续时间 = 电平个数,从而最终算出最后的数据。

该方案是比较稳定的,如果手头的芯片没有对应的Capture功能,大家也可以使用外部中断(注意上升沿和下降沿的处理)+定时器的方法代替捕获功能。

审核编辑:何安

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 串口
    +关注

    关注

    14

    文章

    1549

    浏览量

    76271
  • IO口
    +关注

    关注

    3

    文章

    169

    浏览量

    24004
收藏 人收藏

    评论

    相关推荐

    江西萨瑞微荣获"2024全国第三代半导体制造最佳新锐企业"称号

    快速发展与创新实力在2024全国第三代半导体产业发展大会上,江西萨瑞微电子科技有限公司荣获"2024全国第三代半导体制造最佳新锐企业"称号。这一荣誉不仅是对公司技术创新和产业化
    的头像 发表于 10-31 08:09 274次阅读
    江西萨瑞微荣获&<b class='flag-5'>amp</b>;<b class='flag-5'>amp</b>;<b class='flag-5'>quot</b>;2024全国第三代半导体制造最佳新锐企业&<b class='flag-5'>amp</b>;<b class='flag-5'>amp</b>;<b class='flag-5'>quot</b>;称号

    OCTC发布&amp;quot;算力工厂&amp;quot;!力促智算中心高效规划建设投运

    创新提出面向未来数据中心的&quot;算力工厂&quot;模式,核心是以规(划)、建(设)、运(营)一体化的交钥匙工程,实现智算中心快速投运、绿色低碳,在当前AIGC算力供需挑战下,开创了智算中心建设运营的新思路、新方法,让客户在智算中心建设运营上更省心、更省力。
    的头像 发表于 10-11 09:10 493次阅读
    OCTC发布&<b class='flag-5'>amp</b>;<b class='flag-5'>quot</b>;算力工厂&<b class='flag-5'>amp</b>;<b class='flag-5'>quot</b>;!力促智算中心高效规划建设投运

    软通动力携手华为启动&amp;quot;智链险界&amp;quot;计划,强化生态链接共启保险AI新时代

    软通动力携子品牌软通金科受邀参加此次大会,发表&quot;智驭未来 • 探索保险AI新业态&quot;主旨演讲,并携手华为正式启动&quot;智链险界——保险生态场景链接计划&quot
    的头像 发表于 09-23 19:22 337次阅读
    软通动力携手华为启动&<b class='flag-5'>amp</b>;<b class='flag-5'>quot</b>;智链险界&<b class='flag-5'>amp</b>;<b class='flag-5'>quot</b>;计划,强化生态链接共启保险AI新时代

    全方位精准测量技术助力:中国经济加力发展向前&amp;amp;quot;进&amp;amp;quot;

    全方位精准测量技术助力:中国经济加力发展向前&quot;进&quot;
    的头像 发表于 07-15 09:53 327次阅读
    全方位精准测量技术助力:中国经济加力发展向前&<b class='flag-5'>amp</b>;<b class='flag-5'>amp</b>;<b class='flag-5'>quot</b>;进&<b class='flag-5'>amp</b>;<b class='flag-5'>amp</b>;<b class='flag-5'>quot</b>;

    晶科能源荣获EUPD Research授予的六项&amp;quot;顶级光伏品牌&amp;quot;称号

    近日,由权威调研机构EUPD Research颁发,晶科能源在巴西、哥伦比亚、墨西哥、智利等拉美主要国家六个地区荣获 &quot;顶级光伏品牌 &quot;称号。凭借先进的技术、完善的流程和对卓越的不懈追求,晶科能源将继续提升行业标准,并在全球范围内推动积极变革。
    的头像 发表于 05-10 09:17 485次阅读
    晶科能源荣获EUPD Research授予的六项&<b class='flag-5'>amp</b>;<b class='flag-5'>quot</b>;顶级光伏品牌&<b class='flag-5'>amp</b>;<b class='flag-5'>quot</b>;称号

    九联科技推出一款&amp;quot;射手座&amp;quot;UMA502-T7物联网模组

    在物联网技术飞速发展的时代背景下,九联科技凭借深厚的研发底蕴与创新精神,精心打造出象征着自由探索与勇敢进取精神的&quot;射手座&quot;UMA502-T7模组,以昂扬之姿挺进海外市场,宣告了九联科技物联网模组国际化进程的盛大起航。
    的头像 发表于 04-14 09:38 858次阅读

    2024CCLTA | &amp;quot;智&amp;quot;领检验,&amp;quot;慧&amp;quot;聚山城

    上海2024年4月2日 /美通社/ -- 2024年3月28日-31日,以"融合发展,引领未来"为主题的第十届全国检验医学技术与应用学术会议暨协同创新、融合发展国际论坛,第十届全国临床检验装备展览会(CCLTA2024)在重庆拉开帷幕。展会上,贝克曼库尔特分享了"智慧检验"、"疾病管理"、"创升中国"下的重要力作,包括全自动化学发光免疫分析DxI800、全自动生化分析仪AU5800、微生物鉴定药敏分析仪DxM1096、智研平台、DxAI智控平台LabBox Innovation等。 展会现场照片 作为体外
    的头像 发表于 04-07 18:19 1056次阅读
    2024CCLTA | &<b class='flag-5'>amp</b>;<b class='flag-5'>quot</b>;智&<b class='flag-5'>amp</b>;<b class='flag-5'>quot</b>;领检验,&<b class='flag-5'>amp</b>;<b class='flag-5'>quot</b>;慧&<b class='flag-5'>amp</b>;<b class='flag-5'>quot</b>;聚山城

    科沃斯扫地机器人通过TÜV莱茵&amp;quot;防缠绕&amp;quot;和&amp;quot;高效边角清洁&amp;quot;认证

    3月15日,在2024中国家电及消费电子博览会(AWE)上,国际独立第三方检测、检验和认证机构德国莱茵TÜV大中华区(简称&quot;TÜV莱茵&quot;)为科沃斯两款扫地机器人(型号:DDX14、DDX11)
    的头像 发表于 03-17 10:49 836次阅读

    Quanterix宣布Tau217血液检测被美国FDA授予 &amp;quot;突破性器械 &amp;quot;认证

    3月4日,Quanterix宣布其Simoa磷酸化Tau217(p-Tau 217)血液检测已被美国FDA授予 &quot;突破性器械 &quot;认证,可用于阿尔茨海默病 (AD) 的辅助诊断评估。
    的头像 发表于 03-12 17:23 2275次阅读

    电池&amp;quot;无&amp;quot;隔膜?SEI新&amp;quot;膜&amp;quot;法!

    枝晶是阻碍锌基水系电池发展的一个亟待解决的问题。电沉积过程主要包含离子迁移、电还原和电结晶三个步骤。
    的头像 发表于 03-11 10:03 932次阅读
    电池&<b class='flag-5'>amp</b>;<b class='flag-5'>quot</b>;无&<b class='flag-5'>amp</b>;<b class='flag-5'>quot</b>;隔膜?SEI新&<b class='flag-5'>amp</b>;<b class='flag-5'>quot</b>;膜&<b class='flag-5'>amp</b>;<b class='flag-5'>quot</b>;法!

    中创新航荣获逸动科技2023年度&amp;quot;优秀战略合作伙伴奖&amp;quot;

    近日,中创新航凭借电动船舶领域领先的技术实力、卓越的产品质量、持续稳定的交付能力以及优质高效的服务,荣获逸动科技2023年度&quot;优秀战略合作伙伴奖&quot;。
    的头像 发表于 02-29 13:51 464次阅读

    用控制寄存器控制IO输出,写到Control_Reg_1_Write()的值无法控制IO变化是为什么?

    我想用控制寄存器控制IO输出,使用了Control_Reg_1_Write()函数,并通过Cy_GPIO_Read()读取IO电平变化,但结果通过UART串口助手查看控制寄存器中d0
    发表于 02-21 07:53

    第二代配网行波故障预警与定位装置YT/XJ-001:守护电力线路的超能&amp;amp;quot;哨兵&amp;amp;quot;

    第二代配网行波故障预警与定位装置YT/XJ-001:守护电力线路的超能&quot;哨兵&quot; 电力,如同现代社会的血脉,支撑着我们的生活和工作正常运行。然而,一旦这条血脉出现故障,生活和工作
    的头像 发表于 01-22 15:11 521次阅读
    第二代配网行波故障预警与定位装置YT/XJ-001:守护电力线路的超能&<b class='flag-5'>amp</b>;<b class='flag-5'>amp</b>;<b class='flag-5'>quot</b>;哨兵&<b class='flag-5'>amp</b>;<b class='flag-5'>amp</b>;<b class='flag-5'>quot</b>;

    电流互感器带&amp;quot;S&amp;quot;和不带S所表示的含义及区别

    电流互感器带&quot;S&quot;和不带S都是表示测量电流互感器精度等级。在规定使用条件下,互感器的误差在该等级规定的限值之内。电力工程中计量常用的等级有0.2、0.5、0.2S、0.5S等。
    的头像 发表于 01-14 10:32 1511次阅读
    电流互感器带&<b class='flag-5'>amp</b>;<b class='flag-5'>quot</b>;S&<b class='flag-5'>amp</b>;<b class='flag-5'>quot</b>;和不带S所表示的含义及区别

    智慧光迅荣获2023年&amp;quot;智能物联成长力企业&amp;quot;奖项

    深圳智慧光迅信息技术有限公司荣获2023年中国物联网产业大会的&quot;智能物联成长力企业&quot;奖项。
    的头像 发表于 12-09 10:21 902次阅读