单片机通信

打印 上一主题 下一主题

主题 987|帖子 987|积分 2961

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
一.通信是什么

           至少有收发双方,进行信号 数据的交互  二.电平信号和差分信号

   1.电平信号:电平信号有一根是参考电平线,信号线的信号值有信号线和参考电平线之间的电压差决定;    2.差分信号:差分信号没有参考电平线,传输一路数据必要两根信号线,信号线的信号值由两根信号线的电压差决定。
  区别:
(1)信号值的表示差别:电平信号的信号值是信号线和参考电平线的电压差决定;差分信号的信息值是由两条信号线的电压差决定;
(2)传输雷同路数的信号,电平信号用的数据线根数比差分信号少。比如传输3路信号,电平信号必要1根参考电平+3根数据线;而差分信号必要2x3=6根数据线;
(3)现在通信大部分是差分信号,因为差分信号的抗干扰性更强,可以在更短的周期传输数据。
  三.通信的分类

  1.根据时钟信号分别

  1.1同步通信

         通信双方根据同步信号通信,比如双方有一个共同的时钟信号(SPI全双工 I2C半双工)
  1.2异步通信

          通信双方有本身独立的系统时钟,大家约定好通信的速率。异步通信不必要同步信号,但是并不是说通信的过程差别步(UART)
  2.根据通信方式分别

  2.1串行通信

         

          串行通信:指的是同一时刻只能收或发一个bit位信息。因此只用1根信号线即可。           串行传输:数据一位一位串起来,逐个传输,数据按位次序传输。
         长处:占用引脚资源少                   缺点:速率相对较慢
                2.2并行通信

     并行通信:指的是同一时刻可以收或发多个bit位的信息,因此必要多根信号线才行       并行传输:使用多根线同时传输一个字的多个位,如 8 根线一次传输 8 个位。
   长处:速率快
缺点:占用引脚资源多​​​​​​​
      

    3.根据通信方向分别

         单工:要么收,要么发,只能做吸收装备或者发送装备。比如收音机,一根信号线只能单向发送或单向吸收
           

             半双工:可以收,可以发,但是不能同时收发, 比如对讲机,一根信号线可以吸收数据也可以发送数据,但是两者不能同时进行​​​​​​​                              

 
                   全双工:可以在同一时刻既吸收,又发送。 手机 ,两根信号线,一根发送数据,另一根吸收数据,真正实现同时收发数据,速率快                                             

                 

         四.UART和USART

                   USART: 支持同步\异步通信、全双工、串行                           
UART :没有时钟线,只支持异步通信、全双工、串行
实际上他们是一种被包罗的关系,当USART选择放弃实在中线的时间就是UART​​​​​​​

                     

           4.1 串口通信协议

                                    

                                                                         波特率: 码元/s 9600 115200 4800 bit/s
                                                                        

                                  4.2 电平逻辑尺度

           4.2.1 TTL

                       TTL电平:逻辑1: 2.4V--5V 逻辑0: 0V--0.5V                                                
假设发送的数据为:01010101​​​​​​​

                                                      

                                                             4.2.2 RS232

           
电平尺度:+3V~+15V对应0, -3V~-15V对应1
假设发送的数据为:01010101

                                    

                                              必要注意的是:rs232 的逻辑电平和TTL 不一样但是协议一样。
                      4.3 RS485

                       RS-485仅是一个电气尺度,形貌了接口的物理层,像协议、时序、串行或并行数据以及链路全部由计划者或更高层协议定义。 RS-485定义的是使用平衡多点传输线的驱动器和吸收器的电气特性。                                               RS-485可以或许进行远间隔传输主要得益于使用差分信号进行传输,当有噪声干扰时仍可以使用线路上两者差值进行判定,使传输数据不受噪声干扰。
             RS4485,半双工、是电气协议(逻辑1:+2V–+6V 逻辑0: -6V— -2V)是二线制差分信号,也就是实际传输的数据是通过判定这两条信号线上的电压差来实现的,RS-485总线增补了RS-232通信间隔短,速率低的缺点,RS-485的速率可高达10Mbit/s,理论通讯间隔可达1200米;RS-485和RS-232的单端传输不一样,是差分传输,使用一对双绞线
                                                           

                                                                      ​​​​​​​4.3 三种电平协议下串口通信硬件连接

                                  4.3.1​​​​​​​ TTL电平尺度下的硬件物理层--uart

                       

                         现在的Soc都内置了串口控制器,串口数据线一般都是两根线,一根发送(TX)一根吸收(RX),用的TTL电平,当然也会有一根地线
             必要注意的是:有的串口还有CTS、RTS接口,这是和主动流控相关,不是必要功能,用于包管数据传输的精确性,现在基本不用了,因为串口常用作打印输出或者用于连接低速的装备,对数据精确性没有太高要求;​​​​​​​
                           因为uart外设本来输出的就是TTL电平,所以也称这种连线方式叫UART
                                     ​​​​​​​思考:为什么还要有RS232、RS485?
                         (1)串口协议只是规定了数据传输时的协议,也就是规定了先传输1照旧先传输0的问题,但是什么电压表示数据1,什么电压表示0,这并没有做规定;
(2)UART是相对于Soc这端来说的,Soc端集成了串口控制器,控制器支持串口协议(比如开始位、制止位、数据位、校验位等),用的是TTL电平;
(3)实际中两个装备的串口控制器要通信,中间是有一段间隔的,Soc的引脚一般电平都比力低,数据能传输的有效间隔很短;并且差别的装备所使用的电压也不一样,不能直接相连;
(4)必要中间电路负责来办理电压不匹配、传输间隔等问题,于是有了RS232、RS485;
(5)RS232、RS485都是从电气层面(也就是物理器件)来区分的,具体的通信协议都是串口协议,但是使用的电压范围、是电平信号照旧差分信号等差别;
                        ​​​​​​​4.3.2 RS232电平尺度下的硬件物理层

                         (1)RS232是串口协议在电气层面的实现,RS-232尺度接口定义了电压范围,规定逻辑“1”的电平为-5V~-15 V,逻辑“0”的电平为+5 V~+15V;                                     (2)Soc的串口引脚一般是3.3V或者5V的电压,所以Soc的串口引脚要使用RS232必须添加TTL电平转RS232电平的转换芯片;
(3)RS232的接口有多种(DB9接口、四线接口、三线接口),但是起主要作用的都是TX和RX引脚,可以简朴理解成,RS232和UART的区别就是使用的电压范围不一样;
                                                   

                                     特点:(1)长处:RS232尺度接口的传输间隔更长,在15米左右;
          (2)接口的信号电平值较高,易损坏接口电路的芯片,又因为与TTL电平不兼容故需使用电平转换芯片才华与Soc的串口引脚连接;
            4.3.3 RS485电平尺度下的硬件物理层

                                       

                                                                RS-485收发器:RS-485是差分传输,假如用单片机控制RS-485接口的装备,必要用到收发器,这一点和CAN总线是类似的,如下是一个MCU控制一个RS-485的图示。
                                                               

                                     RS485数据链路
                                       

                                     特点:RS485传输间隔长,1500米左右,抗干扰本领强、通信速率高​​​​​​​
                                    

             4.4 USART

                           

              发送过程:
                                             

                                                          由CPU或者DMA往TDR中写入数据然后由硬件主动检测发送移位寄存器中是否有数据正在移位,假如此时有数据正在移位,则数据期待当前移位寄存器移位完成后再往移位寄存器中放,此过程也是硬件执行。当TDR中的数据放到移位寄存器中的那一刻,TDR空,这时间标志位TXE置1,它来表示发送数据寄存器空。假如此时没有数据正在移位,则直接由硬件将TDR中的数据放到发送移位寄存器中。必要注意的是当TDR中的数据在期待往移位寄存器中放的时间,假如此时CPU或者DMA继续向TDR中写入数据,会将TDR中的数据覆盖掉。
                            吸收过程:
                                             

                                                                        首先数据线通过RX口连到吸收移位寄存器吸收移位寄存器对紫色线的电平进行读取,将读取到的数据放到最高位,读下一位数据时,先把已有的位团体往右移一位,然后再将读到的数据放到最高位,以此往复,直到读满8位。读满八位以后团体往RDR中放,此时RDR非空,标志位RXNE置1,它来表示RDR非空。
                            五.串口发送实验

              发送A-Z到串口
              5.1寄存器实现

            
  1. void sentDate(char ch)
  2. {
  3.         USART1->TDR=ch;
  4. }
复制代码
            
  1.                 sentDate(ch);
  2.                 ch++;
  3.                 if(ch >'Z')
  4.                 {
  5.                   ch = 'A';
  6.                 }
复制代码
                                                         

                                 出现乱码的原因:                                                                   数据往TDR中写入的速率过快,导致数据还没来得及往移位寄存器中放,就被覆盖了。
办理方法:
        在CPU往TDR中写入数据之前,先判定TDR是否为空,
因为TXE标志位置1时标志着TDR空。所以在往TDR中写入数据之前用while卡死,退出的条件为,检测到TXE置1
                 
  1. void sentDate(char ch)
  2. {
  3.         while(!(USART1->ISR & (1<<7)));
  4.         USART1->TDR=ch;
  5. }
复制代码
                                                        5.2 HAL库函数实现发送和吸收

                                                                                   

                                                                                          

                        吸收和发送:
                        

                        5.3 printf重定向

                        int printf(const char * format,...)
printf函数底层调用的是fputc函数,fputs是将要发送的数据写入到尺度输出流stdout
__weak int fputc(int /*c*/, FILE * /*stream*/) ,因此假如想让printf将数据输出到串口,必要重写fputc。
WEAK弱符号weak 顾名思义是“弱”的意思,所以假如函数名称前面加上__weak 修饰符,我们一般称这个函数为“弱函数”。加上了__weak 修饰符的函数,用户可以在用户文件中重新定义一个同名函数,终极编译器编译的时间,会选择用户定义的函数,假如用户没有重新定义这个函数,那么编译器就会执行__weak 修饰的函数,并且编译器不会报错。
                        勾选C库,加入头文件<stdio.h>
                                                                           

                        
  1. int fputc(int ch, FILE * p)
  2. {
  3.                 while(!(USART1->ISR & 1<<7));//等待TDR为空,即TXE置1,跳出while,然后往TDR中放数据
  4.                 USART1->TDR=ch;
  5. }
复制代码
                        


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

涛声依旧在

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表