精华内容
下载资源
问答
  • 摘要:UART以其简单可靠,抗干扰强,传输距离远,组网方便,被认为是嵌入式系统中进行串行数据传输的最佳方式。本文介绍了专为嵌入式系统设计的VK32系列新型多总线接口UART器件的原理及应用技术。  1.嵌入式系统...
  • 串行总线:SPI、IIC、UART

    千次阅读 2020-06-06 19:43:24
    三种常用的串行数据传输总线 一、SPI 1.1 概念 SPI(Serial Peripheral Interface - 串行外设接口)是一种用于短距离通信(主要是嵌入式系统中)的同步串行通信接口规范,这种接口由Motorola发明,已经成了一种事实...

    三种常用的串行数据传输总线

    一、SPI

    1.1 概念

    SPI(Serial Peripheral Interface - 串行外设接口)是一种用于短距离通信(主要是嵌入式系统中)的同步串行通信接口规范,这种接口由Motorola发明,已经成了一种事实标准。广泛用于各种MCU处理器中,同传感器,串行ADC、DAC、存储器、SD卡以及LCD等进行数据连接

    有主(Master - 控制器)和从(Slave - 外设)之分,在总线中也就只有一个“主人”,其它都是处于服从的位置,也就是Slave,它是一种有时钟信号的同步串行总线,从器件的寻址是靠专用的片选信号线SS来实现的。

    1.2 主要的信号线

    SPI总线由4根主要的信号线组成以实现数据在主设备(Master)和从设备(Slave)之间的全双工(收、发同时执行)同步(由时钟同步)通信。

    SCLK:串行时钟(由主设备输出),每个时钟周期将会移出一个新的数据位;

    MOSI:主设备输出⇒从设备输入,数据由主设备进入从设备,器件A上的MOSI线连接到器件B上的MOSI线。

    MISO:主设备输入⇐ 从设备输出,数据由从设备送到主设备(或其它从设备,采用菊花链配置),器件A上的MISO线连接到器件B上的MISO线。

    SS(或SSN): 从设备选中(低电平有效),用于主设备控制从设备用,当该从选择信号线有效的时候表示主设备正在向相应的从设备发送数据或从相应的从设备请求数据。

    1.3 四种工作模式

    由时钟的极性(CPOL)和相位(CPHA)构成了4种不同的数据传输模式(0,1,2,3),分别对应四种可能的时钟配置。

    CPOL: 时钟的极性,它控制着时钟信号的初始逻辑状态(0:低电平空闲状态;1:高电平空闲状态)。

    CPHA: 时钟相位,它控制了数据转换和时钟转换之间的关系(0:第一个跳变沿;1:第二个跳变沿)。

    模式0 CPOL = 0,CPHA = 0:

    空闲时钟电平为低电平,在第一个跳变沿工作

    模式0 CPOL = 0,CPHA = 1:

    空闲时钟电平为低电平,在第二个跳变沿工作

    模式2 CPOL = 1,CPHA = 0:

    空闲时钟电平为高电平,在第一个跳变沿工作

    模式3 CPOL = 1,CPHA = 1:

    空闲时钟电平为高电平,在第二个跳变沿工作

    在这里插入图片描述

    1.4 主从连接方式

    在这里插入图片描述

    1.5 优点

    1.支持全双工通信

    2.推挽驱动(跟漏极开路正相反)提供了比较好的信号完整性和较高的速度

    3.比I²C或SMBus吞吐率更高

    4.协议非常灵活支持“位”传输,不仅限于8-bit一个字节的传输

    5.可任意选择的信息大小、内容、以及用途

    6.信号都是单方向的,非常容易进行电流隔离

    7.对于时钟的速度没有上限,有进一步提高速度的潜力,很多MCU的SPI传输速率可以高达50Msps,可用于数据采集以及图像的传输。

    1.6 缺点

    1.相比于I²C总线需要更多的管脚

    2.没有寻址机制,在共享的总线连接时需要通过片选信号支持多个设备的访问

    3.一般只支持一个主设备(取决于设备的硬件构成)

    4.没有查错机制

    5.相对于RS-232, RS-485, 或CAN-总线,只能近距离传输

    6.SPI不支持热交换(动态地增加一个节点)

    1.7 使用场景

    SPI比较适合系统中有一个主设备和少量的从设备,而且每一个从设备都有一个单独的“从设备选择”信号。

    二、IIC

    2.1概念

    IIC(Inter-Integrated Circuit)总线是一种由 PHILIPS 公司开发的两线式串行总线,用于连接微控制器及其外围设备。它是由数据线 SDA 和时钟 SCL 构成的串行总线,可发送和接收数据。在 CPU 与被控 IC 之间、 IC 与 IC 之间进行双向传送, 高速 IIC 总线一般可达 400kbps 以上。

    跟SPI对比,I2C没有天生的主、从之分,也就是说挂在两根线(数据线SDA和时钟线SCL)上的所有器件都是生而平等的。数据线SDA和时钟线SCL需要上拉电阻。

    在这里插入图片描述

    2.2 三种信号

    I2C 总线在传送数据过程中共有三种类型信号, 它们分别是:开始信号、结束信号和应答
    信号。

    开始信号: SCL 为高电平时, SDA 由高电平向低电平跳变,开始传送数据。
    在这里插入图片描述

    结束信号: SCL 为高电平时, SDA 由低电平向高电平跳变,结束传送数据。
    在这里插入图片描述

    **应答信号:**接收数据的 IC 在接收到 8bit 数据后,向发送数据的 IC 发出特定的低电平脉冲,表示已收到数据。
    在这里插入图片描述

    在这里插入图片描述

    2.3 数据读写

    IIC总线上的每一个设备都可以作为主设备或者从设备,而且每一个设备都会对应一个唯一的地址(地址通过物理接地或者拉高),主从设备之间就通过这个地址来确定与哪个器件进行通信。

    主设备在传输有效数据之前要先指定从设备的地址,地址指定的过程和上面数据传输的过程一样,只不过大多数从设备的地址是7位的,然后协议规定再给地址添加一个最低位用来表示接下来数据传输的方向,0表示主设备向从设备写数据,1表示主设备向从设备读数据

    **注:**在通常的应用中,我们把CPU带I2C总线接口的模块作为主设备,把挂接在总线上的其他设备都作为从设备。并不是真的主从关系。

    IIC协议在读写数据时,总是要发送器件地址,这里需要注意的是,不是主机给从机发送地址,而是主机给地址总线上发送地址,挂IIC总线上的所有从机都能收到地址,如果发过来的地址和自己的地址匹配上了,从机就会给主机一个应答,这样就建立起来了一个通讯。

    主设备往从设备写数据:

    在这里插入图片描述

    1) 产生start位

    2) 传送器件地址ID_Address,器件地址的最后一位为数据的传输方向位,R/W,低电平0表示主机往从机写数据(W)。ACK应答,应答是从机发送给主机的应答。

    3)传送写入器件寄存器地址,即数据要写入的位置。

    4)传送要写入的数据。

    5)产生stop信号。

    主设备往从设备读数据:

    在这里插入图片描述

    1)产生start信号

    2)传送器件地址(写ID_Address),ACK。

    3)传送字地址(写REG_Address),ACK。

    **4)**再次产生start信号

    5)再传送一次器件地址,ACK。

    6)读取一个字节的数据,读数据最后结束前无应答ACK信号。

    7) 产生stop信号。

    注意:

    IIC读时序要写两次器件地址,首先传送器件地址到总线上找到器件,然后写入寄存器地址,也就是word address找到需要读取数据的地址。然后再传输一次器件地址后开始读数据。

    2.4 IIC驱动

    与驱动相关的函数定义

    //IO方向设置
    #define SDA_IN()  {GPIOB->CRL&=0X0FFFFFFF;GPIOB->CRL|=(u32)8<<28;}
    #define SDA_OUT() {GPIOB->CRL&=0X0FFFFFFF;GPIOB->CRL|=(u32)3<<28;}
    //IO操作函数	 
    #define IIC_SCL    PBout(6) //SCL
    #define IIC_SDA    PBout(7) //SDA	 
    #define READ_SDA   PBin(7)  //输入SDA 
    //IIC所有操作函数
    void IIC_Init(void);                //初始化IIC的IO口				 
    void IIC_Start(void);				//发送IIC开始信号
    void IIC_Stop(void);	  			//发送IIC停止信号
    void IIC_Send_Byte(u8 txd);			//IIC发送一个字节
    u8 IIC_Read_Byte(unsigned char ack);//IIC读取一个字节
    u8 IIC_Wait_Ack(void); 				//IIC等待ACK信号
    void IIC_Ack(void);					//IIC发送ACK信号
    void IIC_NAck(void);				//IIC不发送ACK信号
    

    具体函数的实现

    //初始化IIC
    void IIC_Init(void)
    {					     
    	GPIO_InitTypeDef GPIO_InitStructure;
    	RCC_APB2PeriphClockCmd(	RCC_APB2Periph_GPIOB, ENABLE );	//使能GPIOB时钟
    	   
    	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7;
    	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP ;   //推挽输出
    	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    	GPIO_Init(GPIOB, &GPIO_InitStructure);
    	GPIO_SetBits(GPIOB,GPIO_Pin_6|GPIO_Pin_7); 	//PB6,PB7 输出高,空闲状态
    }
    //产生IIC起始信号
    void IIC_Start(void)
    {
    	SDA_OUT();     //sda线输出
    	IIC_SDA=1;	  	  
    	IIC_SCL=1;
    	delay_us(4);
     	IIC_SDA=0;    //START:when CLK is high,DATA change form high to low 
    	delay_us(4);
    	IIC_SCL=0;    //钳住I2C总线,准备发送或接收数据 
    }	  
    //产生IIC停止信号
    void IIC_Stop(void)
    {
    	SDA_OUT();    //sda线输出
    	IIC_SCL=0;
    	IIC_SDA=0;    //STOP:when CLK is high DATA change form low to high
     	delay_us(4);
    	IIC_SCL=1; 
    	IIC_SDA=1;    //发送I2C总线结束信号
    	delay_us(4);							   	
    }
    //发送数据后,等待应答信号到来
    //返回值:1,接收应答失败,IIC直接退出
    //        0,接收应答成功,什么都不做
    u8 IIC_Wait_Ack(void)
    {
    	u8 ucErrTime=0;
    	SDA_IN();      //SDA设置为输入  
    	IIC_SDA=1;
    	delay_us(1);	   
    	IIC_SCL=1;
    	delay_us(1);	 
    	while(READ_SDA)
    	{
    		ucErrTime++;
    		if(ucErrTime>250)
    		{
    			IIC_Stop();
    			return 1;
    		}
    	}
    	IIC_SCL=0;    //时钟输出0 	   
    	return 0;  
    } 
    //产生ACK应答
    void IIC_Ack(void)
    {
    	IIC_SCL=0;
    	SDA_OUT();
    	IIC_SDA=0;
    	delay_us(2);
    	IIC_SCL=1;
    	delay_us(2);
    	IIC_SCL=0;
    }
    //不产生ACK应答		    
    void IIC_NAck(void)
    {
    	IIC_SCL=0;
    	SDA_OUT();
    	IIC_SDA=1;
    	delay_us(2);
    	IIC_SCL=1;
    	delay_us(2);
    	IIC_SCL=0;
    }					 				     
    //IIC发送一个字节
    //返回从机有无应答
    //1,有应答
    //0,无应答			  
    void IIC_Send_Byte(u8 txd)
    {                        
        u8 t;   
    	SDA_OUT(); 	    
        IIC_SCL=0;            //拉低时钟开始数据传输
        for(t=0;t<8;t++)
        {              
            //IIC_SDA=(txd&0x80)>>7;
    		if((txd&0x80)>>7)
    			IIC_SDA=1;
    		else
    			IIC_SDA=0;
    		txd<<=1; 	  
    		delay_us(2);       //对TEA5767这三个延时都是必须的
    		IIC_SCL=1;
    		delay_us(2); 
    		IIC_SCL=0;	
    		delay_us(2);
        }	 
    } 	    
    //读1个字节,ack=1时,发送ACK,ack=0,发送nACK   
    u8 IIC_Read_Byte(unsigned char ack)
    {
    	unsigned char i,receive=0;
    	SDA_IN();        //SDA设置为输入
        for(i=0;i<8;i++ )
    	{
            IIC_SCL=0; 
            delay_us(2);
    		IIC_SCL=1;
            receive<<=1;
            if(READ_SDA)receive++;   
    		delay_us(1); 
        }					 
        if (!ack)
            IIC_NAck();        //发送nACK
        else
            IIC_Ack();         //发送ACK   
        return receive;
    }
    

    2.5优点

    1.管脚/信号数量少,即便挂了很多的设备,也只用两根线;

    2.可以适应不同的从设备的要求;

    3.可以支持多个主设备;

    4.引入了ACK/NACK功能以提升应对错误的能力

    2.6缺点

    1.增加了固件和底层硬件的复杂度

    2.增加了协议的负荷,降低了数据传输的吞吐率

    3.需要上拉电阻,限制了时钟的速度,增加了功耗

    4.半双工

    2.7 使用场景

    I2C比较适合复杂、多样化、需要通信设备灵活扩展的场景。

    三、UART

    3.1概念

    UART 通用异步收发传输器(Universal Asynchronous Receiver/Transmitter),通常称作UART,是一种通用的串行异步全双工数据收发传输器(总线)。

    把“要传输的数据”在串行通信与并行通信之间转换。在嵌入式领域,作为把并行信号转成串行信号的硬件设备,UART通常被集成于MCU内部。

    UART包括RS232、RS449、RS423、TTL电平等接口标准规范和总线标准规范。

    在这里插入图片描述

    3.2 串口配置基本属性

    1)波特率

    波特率是一个衡量通信速度的参数。它表示每秒钟传送的bit的个数。例如9600波特表示每秒钟发送9600个bit。串口通常用的波特率为1200、2400、4800、9600、14400、19200、28800、38400、57600、115200、128000、256000。其中如果串口速率越高,其传输的距离和稳定性就有所下降。一般常用为9600和115200。

    2)数据位

    数据位表征通信中实际数据位的参数。当计算机发送一个信息包,其中需指定有效数据位,一般有5、7和8位。常规使用一般定义为8位。

    3)停止位

    停止位表征单包数据的最后一位。典型的值为1,1.5和2位。由于数据是在传输线上定时的,并且每一个设备有其自己的时钟,在传输中可能存在不同步的情况,因此停止位不仅仅是表示传输的结束,同时也是校正时钟同步的机会。适用于停止位的位数越多,不同时钟同步的容忍程度越大,但是数据传输率同时也越慢。

    4)奇偶校验位

    在串口通信中一种简单的检错方式。偶奇校验,串口会设置校验位(数据位后面的一位),用一个值确保传输的数据有偶个或者奇个1。

    例如,如果数据是011,那么对于偶校验,校验位为0,保证逻辑高的位数是偶数个。如果是奇校验,校验位为1,这样就有3个逻辑高位,保证逻辑高为奇数个。

    3.3程序示例

    void uart_init(u32 bound){
      //GPIO端口设置
      GPIO_InitTypeDef GPIO_InitStructure;
      USART_InitTypeDef USART_InitStructure;
      NVIC_InitTypeDef NVIC_InitStructure;
    	 
      RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA, ENABLE);	//使能时钟
      
    	//USART1_TX   GPIOA.9初始化
      GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //PA.9
      GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
      GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;	//推挽输出
      GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.9
       
      //USART1_RX	  GPIOA.10初始化
      GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;//PA10
      GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入
      GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.10  
    
      //Usart1 NVIC配置
       NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
       NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ;//抢占优先级
       NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;		//子优先级
    	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;			//IRQ通道使能
    	NVIC_Init(&NVIC_InitStructure);	//初始化NVIC
      
       //USART初始化配置
    
    	USART_InitStructure.USART_BaudRate = bound;//波特率
    	USART_InitStructure.USART_WordLength = USART_WordLength_8b;//数据位
    	USART_InitStructure.USART_StopBits = USART_StopBits_1;//停止位
    	USART_InitStructure.USART_Parity = USART_Parity_No;//无奇偶校验
    	USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//无硬件数据流控制
    	USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;	//收发模式
    
      USART_Init(USART1, &USART_InitStructure); //初始化串口1
      USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//开启串口接受中断
      USART_Cmd(USART1, ENABLE);                    //使能串口 
    
    }
    
    u8 USART_RX_BUF[USART_REC_LEN];   //缓冲区
    u16 USART_RX_STA=0;               //接收状态标志
    
    void USART1_IRQHandler(void) {   //串口1中断服务程序
    	u8 Res;
    	if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)  {   //接受中断(收到的数据必须以0x0d,0x0a结尾)
    		Res =USART_ReceiveData(USART1);	//读取接受到的数据
    		
    		if((USART_RX_STA&0x8000)==0){  //接受未完成
    			if(USART_RX_STA&0x4000){   //接收到了0x0d
    				if(Res!=0x0a)USART_RX_STA=0;//接收错误重新开始
    				else USART_RX_STA|=0x8000;	//接收完成
    				}
    			else {	   //没有接收到0x0d
    				if(Res==0x0d)USART_RX_STA|=0x4000;
    				else{
    						USART_RX_BUF[USART_RX_STA&0X3FFF]=Res ;
    						USART_RX_STA++;
    						if(USART_RX_STA>(USART_REC_LEN-1))USART_RX_STA=0;//接收错误重新开始 
    				}		 
    			}
    		}   		 
         } 
    }
    

    3.4 优点

    1.只需要使用两根信号线就可以实现全双工的数据传输(不算电源线)

    2.无需时钟信号

    3.有一个奇偶校验位提供硬件级别的错误检查

    4.数据包的结构可以通过两端之间的协调来改变,比较灵活

    5.相对比较容易配置和运行

    3.5 缺点

    1.与并行通信以及USART相比,数据传输的速度较慢

    2.帧的大小被限定为最多9位

    3.不支持多个从设备或多个主设备的功能

    4.收发两个器件UART的波特率差别不能超过10%

    3.6 使用场景

    UART比较适合单点对单点的连接,因为UART没有标准的方式来寻址不同的设备或共享管脚

    参考

    https://blog.csdn.net/qq_38410730/article/details/80312357

    https://www.bilibili.com/read/cv4149989

    https://www.cnblogs.com/ninghechuan/p/8595423.html

    https://blog.csdn.net/zuo_an/article/details/89151110

    展开全文
  • UART总线

    千次阅读 2018-03-05 17:52:04
    定义: UART是一种通用串行数据总线,用于异步通信。该总线双向通信,可以实现全双工传输和接收。在嵌入式设计中,UART用于主机与辅助设备通信,如汽车音响与外接AP之间的通信,与PC机通信包括与监控调试器和其它...

    https://baike.so.com/doc/2255582-2386423.html

    https://www.cnblogs.com/noticeable/p/7233666.html

    http://www.cnblogs.com/huanzxj/p/4522274.html

    定义:

           UART是一种通用串行数据总线,用于异步通信。该总线双向通信,可以实现全双工传输和接收。在嵌入式设计中,UART用于主机与辅助设备通信,如汽车音响与外接AP之间的通信,与PC机通信包括与监控调试器和其它器件,如EEPROM通信。

    功能:

            计算机内部采用并行数据,不能直接把数据发到Modem,必须经过UART整理才能进行异步传输,其过程为:CPU先把准备写入串行设备的数据放到UART的寄存器(临时内存块)中,再通过FIFO(First Input First Output,先入先出队列)传送到串行设备,若是没有FIFO,信息将变得杂乱无章,不可能传送到Modem。

            它是用于控制计算机与串行设备的芯片。有一点要注意的是,它提供了RS-232C数据终端设备接口,这样计算机就可以和调制解调器或其它使用RS-232C接口的串行设备通信了。作为接口的一部分,UART还提供以下功能:将由计算机内部传送过来的并行数据转换为输出的串行数据流。将计算机外部来的串行数据转换为字节,供计算机内部并行数据的器件使用。在输出的串行数据流中加入奇偶校验位,并对从外部接收的数据流进行奇偶校验。在输出数据流中加入启停标记,并从接收数据流中删除启停标记。处理由键盘或鼠标发出的中断信号(键盘和鼠标也是串行设备)。可以处理计算机与外部串行设备的同步管理问题。有一些比较高档的UART还提供输入输出数据的缓冲区,比较新的UART是16550,它可以在计算机需要处理数据前在其缓冲区内存储16字节数据,而通常的UART是8250。如果您购买一个内置的调制解调器,此调制解调器内部通常就会有16550 UART。

    通信协议

    UART作为异步串口通信协议的一种,工作原理是将传输数据的每个字符一位接一位地传输。

    其中各位的意义如下:

    起始位:先发出一个逻辑"0"的信号,表示传输字符的开始。

    资料位:紧接着起始位之后。资料位的个数可以是4、5、6、7、8等,构成一个字符。通常采用ASCII码。从最低位开始传送,靠时钟定位。

    奇偶校验位:资料位加上这一位后,使得"1"的位数应为偶数(偶校验)或奇数(奇校验),以此来校验资料传送的正确性。

    停止位:它是一个字符数据的结束标志。可以是1位、1.5位、2位的高电平。 由于数据是在传输线上定时的,并且每一个设备有其自己的时钟,很可能在通信中两台设备间出现了小小的不同步。因此停止位不仅仅是表示传输的结束,并且提供计算机校正时钟同步的机会。适用于停止位的位数越多,不同时钟同步的容忍程度越大,但是数据传输率同时也越慢。[1]

    空闲位:处于逻辑"1"状态,表示当前线路上没有资料传送。

    波特率:是衡量资料传送速率的指标。表示每秒钟传送的符号数(symbol)。一个符号代表的信息量(比特数)与符号的阶数有关。例如资料传送速率为120字符/秒,传输使用256阶符号,每个符号代表8bit,则波特率就是120baud,比特率是120*8=960bit/s。这两者的概念很容易搞错。

    基本结构


    ⑴输出缓冲寄存器,它接收CPU从数据总线上送来的并行数据,并加以保存。uart基本结构uart基本结构

    ⑵ 输出移位寄存器,它接收从输出缓冲器送来的并行数据,以发送时钟的速率把数据逐位移出,即将并行数据转换为串行数据输出

    ⑶ 输入移位寄存器,它以接收时钟的速率把出现在串行数据输入线上的数据逐位移入,当数据装满后,并行送往输入缓冲寄存器,即将串行数据转换成并行数据。

    ⑷ 输入缓冲寄存器,它从输入移位寄存器中接收并行数据,然后由CPU取走。

    控制寄存器,它接收CPU送来的控制字,由控制字的内容,决定通信时的传输方式以及数据格式等。例如采用异步方式还是同步方式,数据字符的位数,有无奇偶校验,是奇校验还是偶校验,停止位的位数等参数。

    状态寄存器。状态寄存器中存放着接口的各种状态信息,例如输出缓冲区是否空,输入字符是否准备好等。在通信过程中,当符合某种状态时,接口中的状态检测逻辑将状态寄存器的相应位置"1",以便让CPU查询。

    设计思想


    数据发送的思想是,当启动字节发送时,通过TxD先发起始位,然后发数据位和奇偶数校验位,最后再发停止位,发送过程由发送状态机控制,每次中断只发送1个位,经过若干个定时中断完成1个字节帧的发送。

    数据接收的思想是,当不在字节帧接收过程时,每次定时中断以3倍的波特率监视RxD的状态,当其连续3次采样电平依次为1、0、0时,就认为检测到了起始位,则开始启动一次字节帧接收,字节帧接收过程由接收状态机控制,每次中断只接收1个位,经过若干个定时中断完成1个字节帧的接收。

    为了提高串口的性能,在发送和接收上都实现了FIFO功能,提高通信的实时性。FIFO的长度可以进行自由定义,适应用户的不同需要。

    波特率的计算按照计算公式进行,在设置最高波特率时一定要考虑模拟串口程序代码的执行时间,该定时时间必须大于模拟串口的程序的规定时间。单片机的执行速度越快,则可以实现更高的串口通讯速度。

    工作原理:

    接收发送:

    发送逻辑对从发送FIFO 读取的数据执行"并→串"转换。控制逻辑输出起始位在先的串行位流,并且根据控制寄存器中已编程的配置,后面紧跟着数据位(注意:最低位 LSB 先输出)、奇偶校验位和停止位。

    在检测到一个有效的起始脉冲后,接收逻辑对接收到的位流执行"串→并"转换。此外还会对溢出错误、奇偶校验错误、帧错误和线中止(line-break)错误进行检测,并将检测到的状态附加到被写入接收FIFO 的数据中。

    波特率产生:

              波特率除数(baud-rate divisor)是一个22 位数,它由16 位整数和6 位小数组成。波特率发生器使用这两个值组成的数字来决定位周期。通过带有小数波特率的除法器,在足够高的系统时钟速率下,UART 可以产生所有标准的波特率,而误差很小。

    波特率是串口的通讯速率,常见的比特率为1200bps、4800bps、9600bps、38400bps、115200bps、256000bps、500000bps,这里bps的意思是bit/s,因此可以知道,波特率实际上是每秒可以传输的bit的个数,由此可知波特率与时钟是直接挂钩的,比如波特率位9600bps,那么时钟就是9600hz,即每秒内产生9600个时钟,每个时钟周期发送1bit的数据。(这里注意:波特率越高,传输距离越短)

              波特率分频计数器的方法:


    数据收发:

    UART使用的是 异步,串行通信。
        串行通信是指利用一条传输线将资料一位位地顺序传送。特点是通信线路简单,利用简单的线缆就可实现通信,降低成本,适用于远距离通信,但传输速度慢的应用场合。
        异步通信以一个字符为传输单位,通信中两个字符间的时间间隔多少是不固定的,然而在同一个字符中的两个相邻位间的时间间隔是固定的。 
        数据传送速率用波特率来表示,即每秒钟传送的二进制位数。例如数据传送速率为120字符/秒,而每一个字符为10位(1个起始位,7个数据位,1个校验位,1个结束位),则其传送的波特率为10×120=1200字符/秒=1200波特。
        数据通信格式如下图:


    其中各位的意义如下:
        起始位:先发出一个逻辑”0”信号,表示传输字符的开始。
        数据位:可以是5~8位逻辑”0”或”1”。如ASCII码(7位),扩展BCD码(8位)。小端传输
        校验位:数据位加上这一位后,使得“1”的位数应为偶数(偶校验)或奇数(奇校验)
        停止位:它是一个字符数据的结束标志。可以是1位、1.5位、2位的高电平。
        空闲位:处于逻辑“1”状态,表示当前线路上没有资料传送。

        注:异步通信是按字符传输的,接收设备在收到起始信号之后只要在一个字符的传输时间内能和发送设备保持同步就能正确接收。下一个字符起始位的到来又使同步重新校准(依靠检测起始位来实现发送与接收方的时钟自同步的)

    发送时,数据被写入发送FIFO。如果UART 被使能,则会按照预先设置好的参数(波特率、数据位、停止位、校验位等)开始发送数据,一直到发送FIFO 中没有数据。一旦向发送FIFO 写数据(如果FIFO 未空),UART 的忙标志位BUSY 就有效,并且在发送数据期间一直保持有效。BUSY 位仅在发送FIFO 为空,且已从移位寄存器发送最后一个字符,包括停止位时才变无效。即 UART 不再使能,它也可以指示忙状态。BUSY 位的相关库函数是UARTBusy( )

    在UART 接收器空闲时,如果数据输入变成"低电平",即接收到了起始位,则接收计数器开始运行,并且数据在Baud16 的第8 个周期被采样。如果Rx 在Baud16 的第8 周期仍然为低电平,则起始位有效,否则会被认为是错误的起始位并将其忽略。

    如果起始位有效,则根据数据字符被编程的长度,在 Baud16 的每第 16 个周期(即一个位周期之后)对连续的数据位进行采样。如果奇偶校验模式使能,则还会检测奇偶校验位

    最后,如果Rx 为高电平,则有效的停止位被确认,否则发生帧错误。当接收到一个完整的字符时,将数据存放在接收FIFO 中。

    中断控制:

    出现以下情况时,可使UART 产生中断:

    FIFO 溢出错误

    线中止错误(line-break,即Rx 信号一直为0 的状态,包括校验位和停止位在内)

    奇偶校验错误

    帧错误(停止位不为1)

    接收超时(接收FIFO 已有数据但未满,而后续数据长时间不来)

    发送

    接收

    由于所有中断事件在发送到中断控制器之前会一起进行"或运算"操作,所以任意时刻 UART 只能向中断产生一个中断请求。通过查询中断状态函数UARTIntStatus( ),软件可以在同一个中断服务函数里处理多个中断事件(多个并列的if 语句)。

    FIFO操作:

    FIFO 是"First-In First-Out"的缩写,意为"先进先出",是一种常见的队列操作。 Stellaris 系列ARM 的UART 模块包含有2 个16 字节的FIFO:一个用于发送,另一个用于接收。可以将两个FIFO 分别配置为以不同深度触发中断。可供选择的配置包括:1/8、 1/4、1/2、3/4 和7/8 深度。例如,如果接收FIFO 选择1/4,则在UART 接收到4 个数据时产生接收中断。[3]

    发送FIFO的基本工作过程: 只要有数据填充到发送FIFO 里,就会立即启动发送过程。由于发送本身是个相对缓慢的过程,因此在发送的同时其它需要发送的数据还可以继续填充到发送 FIFO 里。当发送 FIFO 被填满时就不能再继续填充了,否则会造成数据丢失,此时只能等待。这个等待并不会很久,以9600 的波特率为例,等待出现一个空位的时间在1ms 上下。发送 FIFO 会按照填入数据的先后顺序把数据一个个发送出去,直到发送 FIFO 全空时为止。已发送完毕的数据会被自动清除,在发送FIFO 里同时会多出一个空位。

    接收FIFO的基本工作过程: 当硬件逻辑接收到数据时,就会往接收FIFO 里填充接收到的数据。程序应当及时取走这些数据,数据被取走也是在接收FIFO 里被自动删除的过程,因此在接收 FIFO 里同时会多出一个空位。如果在接收 FIFO 里的数据未被及时取走而造成接收FIFO 已满,则以后再接收到数据时因无空位可以填充而造成数据丢失。

    收发FIFO 主要是为了解决UART 收发中断过于频繁而导致CPU 效率不高的问题而引入的。在进行 UART 通信时,中断方式轮询方式要简便且效率高。但是,如果没有收发 FIFO,则每收发一个数据都要中断处理一次,效率仍然不够高。如果有了收发FIFO,则可以在连续收发若干个数据(可多至14 个)后才产生一次中断然后一并处理,这就大大提高了收发效率。

    完全不必要担心FIFO 机制可能带来的数据丢失或得不到及时处理的问题,因为它已经帮你想到了收发过程中存在的任何问题,只要在初始化配置UART 后,就可以放心收发了, FIFO 和中断例程会自动搞定一切。




    展开全文
  • 树莓派 SPI,I2C,UART串行总线介绍

    千次阅读 2019-06-09 03:08:50
    很多人对总线,串行等概念不熟悉特别是SPI,I2C,UART,GPIO等概念。 因此我收集了一些资料,... UART总线 x 1 SPI总线 x 1 I2C总线 x 1 5V x 2 3.3V x 2 GND x 8 那么什么是GPIO? ...

    很多人对总线,串行等概念不熟悉特别是SPI,I2C,UART,GPIO等概念。

    因此我收集了一些资料,用于总结。希望对大家有所帮助。

    首先看一下树莓派上的接口:

    • GPIO引脚 x 26

    • UART总线 x 1

    • SPI总线 x 1

    • I2C总线 x 1

    • 5V x 2

    • 3.3V x 2

    • GND x 8

    那么什么是GPIO?  

        首先应该理解什么是GPIO。GPIO,英文全称为General-Purpose IO ports,也就是通用IO口。在嵌入式系统中经常有数量众多,可是结构却比較简单的外部设备/电路,对这些设备/电路有的须要CPU为之提供控制手段有的则须要被CPU用作输入信号并且,很多这种设备/电路仅仅要求一位,即仅仅要有开/关两种状态就够了,比方灯亮与灭。对这些设备/电路的控制,使用传统的串行口或并行口都不合适。所以在微控制器芯片上一般都会提供一个“通用可编程IO接口”,即GPIO。接口至少有两个寄存器,即“通用IO控制寄存器”与“通用IO数据寄存器”数据寄存器的各位都直接引到芯片外部,而对数据寄存器中每一位的作用,即每一位的信号流通方向时输入还是输出,则能够通过控制寄存器中相应位独立的加以设置。这样,有无GPIO接口也就成为微控制器差别于微处理器的一个特征。

        在实际的MCU中,GPIO是有多种形式的。比方,有的数据寄存器能够依照位寻址,有些却不能依照位寻址,这在编程时就要区分了。比方传统的8051系列,就区分成可位寻址和不可位寻址两种寄存器。另外,为了使用的方便,非常多mcu把glue logic等集成到芯片内部,增强了系统的稳定性能,比方GPIO接口除去两个标准寄存器必须具备外,还提供上拉寄存器,能够设置IO的输出模式是高阻,还是带上拉的电平输出,或者不带上拉的电平输出。这在电路设计中,外围电路就能够简化不少。

        明确了这个道理,不同的MCU,提供的GPIO口的数目不同,可选择的glue logic也不同。所以,在了解共性的基础上去了解个性。

        另外须要注意的是,对于不同的计算机体系结构,设备可能是port映射,也可能是内存映射的。假设系统结构支持独立的IO地址空间,而且是port映射,就必须使用汇编语言完毕实际对设备的控制,由于C语言并没有提供真正的“port”的概念。假设是内存映射,那就方便的多了。举个样例,比方像寄存器A(地址假定为0x48000000)写入数据0x01,那么就能够这样设置了。

    通俗一点来说:GPIO(GeneralPurposeI/OPorts)意思为通用输入/输出端口,通俗地说,就是一些引脚,可以通过它们输出高低电平或者通过它们读入引脚的状态-是高电平或是低电平。GPIO是个比较重要的概念,用户可以通过GPIO口和硬件进行数据交互(如UART),控制硬件工作(如LED、蜂鸣器等),读取硬件的工作状态信号(如中断信号)等。GPIO口的使用非常广泛。掌握了GPIO,差不多相当于掌握了操作硬件的能力。

     


    当定义为模块管脚时,PIN起模块中定义的功能。比如定义成SPI模块的管脚,那就按照具体芯片的规定,或者定义成MOSI,或者定义成MISO,或者定义成SCLK,这些不是任意的。SPI是模块,MISO等是功能管脚。

    当定义成GPIO时,可以定义成高阻,输入,或者输出。这时候,就可以用作操作控制位,点LED灯等功能了。

     

    总线:

    单片机总线是一种内部结构,它是cpu、内存、输入、输出公用通道,主机的各个部件通过总线相连接,外部设备通过相应的接口电路再与总线相连接。

    总线就是一个公共的计算机的连接线 所有外围设备 都可以通过它与计算机相连接 是信息传递的通道 在它上面可以挂很多个外设元件。

     

    单片机的总线是和微机原理的总线一样的。平时我们直接用它的4个口,但是如果设备数目比较多,尤其是连接外部ram和rom时候,就需要做译码电路。

    这时候,你就需要数据总线,地址总线,控制总线。

    一个电路总是由元器件通过电线连接而成的,在模拟电路中,连线并不成为一个问题,因为各器件间一般是串行关系。各器件之间的连线并不很多,但计算机电路却不一样,它是以微处理器为核心,各器件都要与微处理器相连,各器件之间的工作必须相互协调,所以就需要的连线就很多了。

    如果仍如同模拟电路一样,在各微处理器和各器件间单独连线,则线的数量将多得惊人,所以在微处理机中引入了总线的概念,各个器件共同享用连线,所有器件的8根数据线全部接到8根公用的线上,即相当于各个器件并联起来。

    但仅这样还不行,如果有两个器件同时送出数据,一个为0,一个为1,那么,接收方接收到的究竟是什么呢?这种情况是不允许的,所以要通过控制线进行控制,使器件分时工作,任何时候只能有一个器件发送数据(可以有多个器件同时接收)。

    器件的数据线也就被称为数据总线,器件所有的控制线被称为控制总线。在单片机内部或者外部存储器及其它器件中有存储单元,这些存储单元要被分配地址,才能使用,分配地址当然也是以电信号的形式给出的,由于存储单元比较多,所以,用于地址分配的线也较多,这些线被称为地址总线。

     

    总线的种类很多:

    如芯片级的总线 如 SPI,I2C,单总线 近距离进行CPU与其它外围芯片的连接,他们多是采用串行方式传送 数据的 即一位一位传送数据 可以节省传送线的条数

     

    • SPI 需要3条线: 一条时钟线 一条数据接收线 一条数据发送线

    • I2C 需要2跳线 一条时钟线 一条 数据线

    • 单总线 即是用一条数据线来通讯 如DS18B20数字温度传感器

    • 还有RS-232 用于计算机和计算机或单片机进行数据通讯的

    • 还有RS-485 、CAN等工业现场总线 用于远距离通讯 距离可达1000米。


    SPI

      SPI,是英语Serial Peripheral interface的缩写,顾名思义就是串行外围设备接口。是Motorola首先在其MC68HCXX系列处理器上定义的。SPI接口主要应用在 EEPROM,FLASH,实时时钟,AD转换器,还有数字信号处理器和数字信号解码器之间。SPI,是一种高速的,全双工,同步的通信总线,并且在芯片的管脚上只占用四根线,节约了芯片的管脚,同时为PCB的布局上节省空间,提供方便,正是出于这种简单易用的特性,现在越来越多的芯片集成了这种通信协议,比如AT91RM9200. SPI总线系统是一种同步串行外设接口,它可以使MCU与各种外围设备以串行方式进行通信以交换信息。外围设置FLASHRAM、网络控制器、LCD显示驱动器、A/D转换器和MCU等。SPI总线系统可直接与各个厂家生产的多种标准外围器件直接接口,该接口一般使用4条线:串行时钟线(SCK)主机输入/从机输出数据线MISO主机输出/从机输入数据线MOST和低电平有效的从机选择线SS(有的 SPI接口芯片带有中断信号线INT或INT、有的SPI接口芯片没有主机输出/从机输入数据线MOSI)。

     


    I2C (Inter-Integrated Circuit):由PHILIPS公司开发的两线式串行总线,用于连接微控制器及其外围设备。

    I2C总线用两条线(SDA和SCL)在总线和装置之间传递信息,在微控制器和外部设备之间进行串行通讯或在主设备和从设备之间的双向数据传送。I2C是OD输出的,大部分I2C都是2线的(时钟数据),一般用来传输控制信号。

     

    I2C是多主控总线,所以任何一个设备都能像主控器一样工作,并控制总线。总线上每一个设备都有一个独一无二的地址,根据设备它们自己的能力,它们可以作为发射器或接收器工作。多路微控制器能在同一个I2C总线上共存。

     

    SPI、I2C和UART做个比较

        SPII2C这两种通信方式都是短距离的,芯片和芯片之间或者其他元器件如传感器和芯片之间的通信。SPI和IIC是板上通信,IIC有时也会做板间通信,不过距离甚短,不过超过一米,例如一些触摸屏,手机液晶屏那些薄膜排线很多用IIC,I2C能用于替代标准的并行总线,能连接的各种集成电路和功能模块。I2C是多主控总线,所以任何一个设备都能像主控器一样工作,并控制总线。总线上每一个设备都有一个独一无二的地址,根据设备它们自己的能力,它们可以作为发射器或接收器工作。多路微控制器能在同一个I2C总线上共存这两种线属于低速传输。

    UART是应用于两个设备之间的通信,如用单片机做好的设备和计算机的通信。这样的通信可以做长距离的。UART速度比上面两者者快,最高达100K左右,用与计算机与设备或者计算机和计算之间通信,但有效范围不会很长,约10米左右,UART优点是支持面广,程序设计结构很简单,随着USB的发展,UART也逐渐走向下坡。

    GPIO (General Purpose Input Output 通用输入/输出)或总线扩展器,利用工业标准I2C、SMBus或SPI接口简化了I/O口的扩展。

    当微控制器或芯片组没有足够的I/O端口,或当系统 需要采用远端串行通信或控制时,GPIO产品能够提供额外的控制和监视功能。每个GPIO端口可通过软件分别配置成输入或输出。Maxim的GPIO产品线包括8端口至28端口的GPIO,提供推挽式输出或漏极开路输出。提供微型3mm x 3mm QFN封装。

     

    GPIO的优点(端口扩展器):

    低功耗:GPIO具有更低的功率损耗(大约1μA,μC的工作电流则为100μA)。

    集成IIC从机接口:GPIO内置IIC从机接口,即使在待机模式下也能够全速工作。

    小封装:GPIO器件提供最小的封装尺寸 ― 3mm x 3mm QFN!

    低成本:您不用为没有使用的功能买单!

    快速上市:不需要编写额外的代码、文档,不需要任何维护工作!

    灵活的灯光控制:内置多路高分辨率的PWM输出。

    可预先确定响应时间:缩短或确定外部事件与中断之间的响应时间。

    更好的灯光效果:匹配的电流输出确保均匀的显示亮度。

    布线简单:仅需使用2条IIC总线或3条SPI总线


    IO端口和IO内存的区别及分别使用的函数接口 

             每个外设都是通过读写其寄存器来控制的。外设寄存器也称为I/O端口,通常包括:控制寄存器、状态寄存器和数据寄存器三大类。根据访问外设寄存器的不同方式,可以把CPU分成两大类。一类CPU(如M68K,Power PC等)把这些寄存器看作内存的一部分,寄存器参与内存统一编址访问寄存器就通过访问一般的内存指令进行,所以,这种CPU没有专门用于设备I/O的指令。这就是所谓的“I/O内存”方式。另一类CPU(典型的如X86),将外设的寄存器看成一个独立的地址空间,所以访问内存的指令不能用来访问这些寄存器,而要为对外设寄存器的读/写设置专用指令,如IN和OUT指令。这就是所谓的“ I/O端口”方式。但是,用于I/O指令的“地址空间”相对来说是很小的,如x86 CPU的I/O空间就只有64KB(0-0xffff)。

            结合下图,我们彻底讲述IO端口和IO内存以及内存之间的关系。主存16M字节的SDRAM,外设是个视频采集卡,上面有16M字节的SDRAM作为缓冲区。

                                                                   

     

    展开全文
  • I2C,SPI,UART,USART,USB 的区别及串行总线的选择 1、首先看看它名字真正的含义: SPI(Serial Peripheral Interface:串行外设接口); I2C(INTER IC BUS:意为IC之间总线) UART(Universal Asynchronous Receiver ...

    I2C,SPI,UART,USART,USB 的区别及串行总线的选择

    1、首先看看它名字真正的含义:

     SPI(Serial Peripheral Interface:串行外设接口);

     I2C(INTER IC BUS:意为IC之间总线)

     UART(Universal Asynchronous Receiver Transmitter:通用异步收发器)

     USART:通用同步异步收发器

     USB:Universal Serial BUS(通用串行总线)

     CAN:现场总线

    2、看看他们传输数据线的组成:

         SPI总线由三条信号线组成:串行时钟(SCLK)、串行数据输出(SDO)、串行数据输入(SDI)。SPI总线可以实现多个SPI设备互相连接。提供SPI串行时钟的SPI设备为SPI主机或主设备(Master),其他设备为SPI从机或从设备(Slave)。主从设备间可以实现全双工通信,当有多个从设备时,还可以增加一条从设备选择线。

         如果用通用IO口模拟SPI总线,必须要有一个输出口(SDO),一个输入口(SDI),另一个口则视实现的设备类型而定,如果要实现主从设备,则需输入输出口,若只实现主设备,则需输出口即可,若只实现从设备,则只需输入口即可。

     

         I2C总线是双向、两线(SCL、SDA)、串行、多主控(multi-master)接口标准,具有总线仲裁机制,非常适合在器件之间进行近距离、非经常性的数据通信(我的平衡小车读取MPU6050模块的数据就是用I2C总线)。在它的协议体系中,传输数据时都会带上目的设备的设备地址,因此可以实现设备组网。

         如果用通用IO口模拟I2C总线,并实现双向传输,则需一个输入输出口(SDA),另外还需一个输出口(SCL)。(注:I2C资料了解得比较少,这里的描述可能很不完备)

     

         UART总线是异步串口,因此一般比前两种同步串口的结构要复杂很多(单片机的书上有介绍的,其实也算不上复杂),一般由波特率产生器(产生的波特率等于传输波特率的16倍)、UART接收器、UART发送器组成,硬件上由两根线,一根用于发送,一根用于接收。

         显然,如果用通用IO口模拟UART总线,则需一个输入口,一个输出口。

         从第二点明显可以看出,SPI和UART可以实现全双工,但I2C不行。

     

    3、看看牛人们的意见吧!

         wudanyu:I2C线更少,我觉得比UART、SPI更为强大,但是技术上也更加麻烦些,因为I2C需要有双向IO的支持,而且使用上拉电阻,我觉得抗干扰能力较弱,一般用于同一板卡上芯片之间的通信,较少用于远距离通信。SPI实现要简单一些,UART需要固定的波特率,就是说两位数据的间隔要相等,而SPI则无所谓,因为它是有时钟的协议。

         quickmouse:I2C的速度比SPI慢一点,协议比SPI复杂一点,但是连线也比标准的SPI要少。

     

    4、最核心的,通信协议的不同:

    SPI

        SPI 是一种允许一个主设备启动一个与从设备的同步通讯的协议,从而完成数据的交换。也就是SPI是一种规定好的通讯方式。这种通信方式的优点是占用端口较少,一般4根就够基本通讯了。同时传输速度也很高。一般来说要求主设备要有SPI控制器(但可用模拟方式),就可以与基于SPI的芯片通讯了。

        SPI 的通信原理很简单,它需要至少4根线,事实上3根也可以。也是所有基于SPI的设备共有的,它们是SDI(数据输入),SDO(数据输出),SCK(时 钟),CS(片选)。其中CS是控制芯片是否被选中的,也就是说只有片选信号为预先规定的使能信号时(高电位或低电位),对此芯片的操作才有效。这就允许 在同一总线上连接多个SPI设备成为可能。

         接下来就负责通讯的3根线了。通讯是通过数据交换完成的,这里先要知道SPI是串行通讯协议,也就是说数据是一位一位的传输的。这就是SCK时钟线存在的原 因,由SCK提供时钟脉冲,SDI,SDO则基于此脉冲完成数据传输。数据输出通过SDO线,数据在时钟上沿或下沿时改变,在紧接着的下沿或上沿被读取。 完成一位数据传输,输入也使用同样原理。这样,在至少8次时钟信号的改变(上沿和下沿为一次),就可以完成8位数据的传输。

         要注意的是,SCK信号线只由主设备控制,从设备不能控制信号线。同样,在一个基于SPI的设备中,至少有一个主控设备。

         这样传输的特点:这样的传输方式有一个优点,与普通的串行通讯不同,普通的串行通讯一次连续传送至少8位数据,而SPI允许数据一位一位的传送,甚至允许暂停,因为SCK时钟线由主控设备控制,当没有时钟跳变时,从设备不采集或传送数据。也就是说,主设备通过对SCK时钟线的控制可以完成对通讯的控制。

         SPI还是一个数据交换协议:因为SPI的数据输入和输出线独立,所以允许同时完成数据的输入和输出。

         不同的SPI设备的实现方式不尽相同,主要是数据改变和采集的时间不同,在时钟信号上沿或下沿采集有不同定义,具体请参考相关器件的文档。

    I2C

        只要求两条总线线路:一条串行数据线SDA 一条串行时钟线SCL

        每个连接到总线的器件都可以通过唯一的地址和一直存在的简单的主机从机关系软件设定地址主机可以作为主机发送器或主机接收器

        它是一个真正的多主机总线如果两个或更多主机同时初始化数据传输可以通过冲突检测和仲裁,防止数据被破坏

        串行的8 位双向数据传输位速率在标准模式下可达100kbit/s 快速模式下可达400kbit/s 高速模式下可达3.4Mbit/s

        片上的滤波器可以滤去总线数据线上的毛刺波保证数据完整

        连接到相同总线的IC 数量只受到总线的最大电容400pF 限制

    UART

    UART总线是异步串口,因此一般比前两种同步串口的结构要复杂很多,一般由波特率产生器(产生的波特率等于传输波特率的16倍)、UART接收器、UART发送器组成,硬件上由两根线,一根用于发送,一根用于接收。

         显然,如果用通用IO口模拟UART总线,则需一个输入口,一个输出口。

    UART常用于控制计算机与串行设备的芯片。有一点要注意的是,它提供了RS-232C数据终端设备接口,这样计算机就可以和调制解调器或其它使用RS-232C接口的串行设备通信了。

    UART是通用异步收发器(异步串行通信口)的英文缩写,它包括了RS232、RS499、RS423、RS422和RS485等接口标准规范和总线标准规范,即UART是异步串行通信口的总称。而RS232、RS499、RS423、RS422和RS485等,是对应各种异步串行通信口的接口标准和总线标准,它规定了通信口的电气特性、传输速率、连接特性和接口的机械特性等内容。实际上是属于通信网络中的物理层(最底层)的概念,与通信协议没有直接关系。而通信协议,是属于通信网络中的数据链路层(上一层)的概念。 COM口是PC(个人计算机)上,异步串行通信口的简写。由于历史原因,IBM的PC外部接口配置为RS232,成为实际上的PC界默认标准。所以,现在PC机的COM口均为RS232。若配有多个异步串行通信口,则分别称为COM1、COM2...

     

    明显可以看出,SPIUART可以实现全双工,但I2C不行

     

    USART:通用同步异步收发器。(与UART的区别很明显)

    UART:universal asynchronous receiver and transmitter通用异步收发器;

    USART:universal synchronous asynchronous receiver and transmitter通用同步异步收发器。一般而言,单片机中,名称为UART的接口一般只能用于异步串行通讯,而名称为USART的接口既可以用于同步串行通讯,也能用于异步串行通讯。

    USB

    是英文Universal Serial BUS(通用串行总线)的缩写,是一个外部总线标准,用于规范电脑与外部设备的连接和通讯,是应用在PC 领域的接口技术。USB 接口支持设备的即 即用和热插拔功能。USB 是在1994 年底由尔、康柏.IBM、Microsoft 等多家公司联合提出的.

    USB的电气特性还有传输特性

     

    CAN

    当总线空闲时,任何CAN节点都可以开始数据发送。如果两个或更多的节点同时开始发送,就使用标识符来进行按位仲裁以解决访问冲突。CAN是一个广播类型的总线,所有节点都接收总线上的数据,硬件上的过滤机制决定消息是否提供给该接点用。

    四种消息帧的类型

    数据帧:该帧从一个发送器承载数据到一个接收器。根据CAN规范有两种数据帧格式,它们的唯一本质区别在于标识符的长度:CAN标准帧,也称为CAN2.0A,支持11位长度的标识符;另一个是CAN扩展帧,也称为CAN2.0B,支持29位长度的标识符。图2显示了两种规范的CAN数据帧。

    远程帧:此帧由一个接收CAN节点发送,用来请求带有远程帧中规定的标识符的数据帧。

    错误帧:此帧将任何总线错误通知其它单元,在接收到这个帧时发送器会自动进行消息重发。

    超载帧:超载帧由一个忙的CAN节点送出,以请求在前后数据帧之间增加一个额外的延迟。

     

    CAN硬件术语

    基本CAN(Basic CAN)控制器:这是一种廉价的CAN控制器,具有有限的发送/接收消息缓冲器,以及有限的CAN消息过滤机制。

    完全CAN(Full CAN)控制器:完全CAN是一个高成本、高性能的CAN控制器,具有能缓冲8个或更多消息的缓冲器用于接收和发送。例如,富士通的集成CAN微控制器能提供16个消息缓冲器用于接收和发送。此外,富士通的MB90443微控制器能灵活地将两个CAN控制器的消息缓冲器组合在一个中,以形成能缓冲32个消息的缓冲器。

    标准CAN控制器:该CAN控制器能够处理仅有11位标识符的消息。

    扩展CAN控制器:该控制器能够处理含有11位和29位标识符的消息。

    时间触发CAN(TTCAN)控制器:该CAN控制器根据时间和事件的触发来安排CAN消息,增强了CAN网络的总体性能和行为的确定性。

     

    数据方向和通信速度

           数据字节的传输首先从最高位开始。一个8位的数据字节能在一次发送中进行传输,最大的CAN总线速度是1Mbps。

     

    物理接口

           大多数CAN微控制器需要一个外部收发器来连接物理总线。目前市场上提供以下一些收发器:

           高速CAN收发器有飞利浦的82C251,TI的SN65/75LBC031,Bosch的CF150,C250,Unitrode的UC5350;

           低速CAN收发器有飞利浦82C252、TJA1053,西门子TLE 6252G;

           单线CAN收发器有飞利浦AU5790,英飞凌TLE 6255,Delphi DK166153。

     

    5、串行总线的选择:

    微控制器是当今各种先进电子产品的核心,它需要与一个或多个外设器件通信。以前,µC的外设是以存储器映射方式与数据和地址总线连接的。对地址线译码以获得片选信号,从而在有限的地址范围内为每个外设分配唯一的地址。这种接口类型所需的最少引脚数(除电源和地之外)为:8 (数据) + 1 (R//W) + 1 (/CS) + n条地址线[n = log2(内部寄存器或存储器字节的数目)]。例如,与一个16字节外设通信时,需要的引脚数为:8 +1 + 1 + 4 = 14。这种接口的访问速度快,但较多的引脚数也同时带来了封装尺寸增大和总成本提高的问题。要降低成本和缩小封装尺寸,串行接口显然是理想的替代方案。

     

    选择串行总线并非易事。除需要考虑数据速率、数据位传输顺序(先传最高位或最低位)和电压外,设计者还应该考虑以下几点:

    通过何种方式选择某个外设(通过硬件片选输入或软件协议)。

    外设如何与µC保持同步(借助一条硬件时钟线,或借助内嵌于数据流中的时钟信息)。

    数据是在单根线上传输(在“高”和“低”之间转换),还是在一对差分线上传输(两根线按相反的方向同时转换其电压)。

    通信线路的两端均使用匹配电阻实现阻抗匹配(通常用于差分信号传输),还是不匹配或仅在一端匹配(通常用于单端总线)。

    表1以矩阵的形式展示了各种通用总线系统之间的差异。16种可能组合中只有4种通用类型为大家所熟知。

     

    除这些特性外,具体应用还会提出更多要求,如供电方式、隔离、噪声抑制、µC (主机)与外设(从机)间的最大传输距离、以及电缆连接方式(总线型、星型、可承受线路反接等)。提出类似要求的应用包括楼宇自动化、工业控制和抄表等,并且都已制定了相应的标准。

     

    I2C,SPI,UART,USART,USB的区别及串行总线的选择

    下面的一段话看看就好了解一下:

    I²C/SMBus与1-Wire总线

    如果实际应用可以提供时钟线,则总线选择范围可扩展到I²C12和SMBus13器件。根据SMBus的规范,它可以看作是100kbps I²C总线规范增加了超时特性后的派生总线类型。在某个节点与总线主机失去同步的情况下,超时特性可避免总线发生闭锁,而I²C系统则需要经过一次上电复位过程,才能从这种故障状态恢复至正常工作状态。在1-Wire系统中,复位/在线检测周期可将通信接口复位至确定的启动条件下。

     

    除了时钟线外,I²C/SMBus还为总线上传输的每个字节提供一个应答位。这使得有效数据速率降低了12%。通信过程开始于一个启动条件,并跟随从器件地址和一个数据方向位(读/写),最后结束于一个停止条件。对于1-Wire系统,首先需要满足网络层的要求(即选择某个特定器件,执行search ROM命令或者广播);接下来发送与特定器件相关的命令代码,该代码同时会影响数据的传输方向(读/写)。

     

    原有I²C和SMBus总线系统的一个突出问题是其有限的7位地址空间。由于可提供超过127种不同器件类型,我们无法根据从器件地址推断器件功能。此外,许多I²C器件还允许用户随意设置1个或多个地址位,以在总线上挂接多个相同器件。这种特性进一步减少了可用的地址空间。解决地址冲突问题的标准做法是将总线系统划分成若干段,某一时刻可在软件控制下激活某个网络段。该网络段需要增加更多硬件,也使应用固件更为复杂。I²C系统不具备网络节点查找或枚举功能,因此很难处理节点数动态变化的系统。这一问题可借助SMBus Specification Version 2.013中的地址分辨率协议得以解决。但是,支持该特性的SMBus器件极为稀少。

     

    SPI和MICROWIRE接口

    SPI14和MICROWIRE15 (SPI的子集)均需要为每个从器件提供一条额外的片选线。由于具有片选信号,SPI协议只定义了针对存储器地址和状态寄存器的读/写命令。它不提供应答功能。通常,SPI器件的数据输入和数据输出采用不同的引脚。鉴于数据输出在除了读操作外的任何情况下均为三态(禁止),因此可将两个数据引脚接到一起以构成单根双向数据线。当其它总线系统无法提供所需的功能或需要较高的数据传输速率时,可选用SPI总线,它可以支持2Mbps或更高的速率。SPI和MICROWIRE的不利因素在于产生CS信号的译码逻辑,以寻址某个特定器件。但是不会产生地址冲突问题。和I²C总线一样,不提供节点查找功能。主机无法根据从器件的逻辑地址来推断器件功能,因此很难管理节点动态变化的网络。

     

    RS-485、LVDS、CAN、USB 2.0和FireWire

    我们对这些标准进行讨论,以举例说明差分传输的特点。这类总线系统中传输速率最快的两种是FireWire16和USB 2.017,它们采用点对点电气连接。使用先进的节点或集线器,可以构成树状拓扑的虚拟总线,数据包从源发送至端点(USB),或采用对等传输(FireWire),突发数据速率高达480Mbps (USB 2.0)或1600Mbps (FireWire)。尺寸有限的数据包以及接收/缓冲/重发通信机制增加了传输时间,反过来降低了有效的数据吞吐能力。USB的拓扑和协议允许最多连接126个节点,FireWire允许最多63个节点,使用无源电缆时节点间的最大传输距离为4.5m。专为包括PC外设、多媒体、工业控制和航空(仅FireWire)应用而设计,USB和FireWire器件可以带电插入系统(热插拔)。该特性允许网络节点数动态变化。

     

    LVDS18、RS-48519和CAN20可实现挂接主机和从机的总线型结构,甚至可以连接多个主机。这些标准中低压差分信号(LVDS)是速率最快的,如果总线长度不超过10m,可工作在100Mbps速率下。可用的数据速率及吞吐可以更快或更慢,具体取决于网络尺寸。LVDS电气标准专为背板应用而设计,支持热插拔功能,但不包含任何协议。

     

    RS-485也仅定义了电气参数。RS-485定义了负载和每条总线的最大负载数目(32),而不是以节点的形式给出。一个电气节点的负载可以小于1。12m网络距离下的典型数据速率可高达35Mbps,1200m距离下数据速率可达100kbps,这些特性足以满足数据采集和控制应用。RS-485设备的协议通常基于原来设计用于RS-232的部分协议。

     

    与此不同,控制器局域网(CAN)为分布式实时控制定义了通信协议,安全性非常高,专门面向汽车应用和工业自动化领域。数据速率从40m距离下的1Mbps到1000m距离下的50kbps。寻址方式是基于消息的,协议本身对节点数没有任何限制。CAN节点支持热插拔,网络节点数可以动态变化。

     

    结语

    在简单、低成本总线系统中,与LIN总线和SensorPath相比,1-Wire系统的从器件可提供最广泛的功能和网络驱动器。I²C和SMBus除了需要数据线和参考地之外,还需要时钟线和VCC电源,当然可供选择的器件功能也非常多。SPI和MICROWIRE需要额外的片选线,但可以提供更高的数据速率。除支持寄生供电和网络节点查找功能外,1-Wire接口和协议还支持热插拔,这一特性通常仅在使用差分信号的高速系统以及SMBus 2.0兼容产品中才提供。iButton®产品是使用极为广泛的热插拔1-Wire器件,热插拔是这类器件的正常工作方式。事实已经证明,1-Wire器件在下列应用中极为有效:全球识别号21、电路板/配件标识与认证10、温度检测和执行装置等。另外一种非常成功的1-Wire产品是具有安全存储器和质询-响应机制的器件,它能以最低的成本实现双向认证和软件代码保护22, 23。

    总线选择准则

           不同的应用在选择总线的标准方面并不同,下面是一些进行总线选择的通用参考准则:

           1.评估使用不同串行总线在网络上连接各种器件的系统成本。例如,在汽车应用中,一个只需要控制功能的系统可以用像LIN这类低成本的串行总线来管理。

           2.如果用在汽车中,CAN或LIN是较好的选择。由于它们具有很强的鲁棒性,因此具有较强的容故障能力和传输可靠性。

           3.注意器件间的距离,有些串行总线只支持短距离通信。

           4.确定在网络上将连接多少器件,以及总线将可能具有的电容量。有些串行总线对连在网络上的器件数目有限制。

           5.在效率、速度和可靠性方面确定对你最重要的性能。例如,对于一个安全关键系统来讲,可靠性是极为重要的,故而CAN是较好的选择(比如汽车)。

    展开全文
  • SPI、I2C、UART(即串口)三种串行总线详解

    万次阅读 多人点赞 2019-01-03 09:17:06
    (3)UART包括RS232、RS499、RS423、RS422和RS485等接口标准规范和总线标准规范。它们的主要区别在于其各自的电平范围不相同。 嵌入式设备中常常使用到的是TTL、TTL转RS232的这种方式。 2、通信协议 (1)起始...
  • SJXXX串口扩展芯片 UART(1) to UART(4)

    千次阅读 2017-07-17 16:18:12
    SJ000是一款具备I2C总线/SPI总线/UART接口的四通道异步收发器件,通过模式选择使得该器件工作于以上任何一种主接口模式下。器件的四个通道UART可提供高达2Mbps的数据率,低功耗模式和睡眠电流。每个通道含有一个接收...
  • SPI、I2C、UART串行总线

    2017-01-10 11:44:44
    Peripheral Interface 串行外围接口 ISP:In Syesterm Program 在系统编程 AT89S52在系统编程(ISP)所用到的几个引脚定义: SPI JTAG 三者区别详解" title="ISP SPI JTAG 三者区别详解" style=...
  • 区别一:定义:  SPI(Serial Peripheral Interface:串行外设接口);  I2C(INTER IC BUS) ... UART(Universal Asynchronous Receiver Transmitter:通用... SPI总线由三条信号线组成:串行时钟(SCLK)、串行数据
  • 串口简介 1.什么是串口? 串口是计算机上一种非常通用的设备通信的协议。串口通信的概念非常简单,串口按位(bit)发送和接收字节。尽管比按字节(byte)的并行通信慢...uart属于异步串口(Universal Asynchro...
  • 串行数据总线由于占用较少的管脚被广泛应用在MCU和外设的连接中,在过去的几十年里,有三种最常用的多线串行数据传输格式SPI、I2C和UART。这3种串行总线的主要区别: SPI- Serial Peripheral Interface(串行外设...
  • 我第一次知道I2C总线是1995年,项目中用到电视机高频头(也叫调谐器、Tuner),能够方便买到的高频头要么是飞利浦(Philips)的,要么是日系厂商的,但日系厂商联系起来比较费劲。Tuner其实就是通过I2C总线送控制字...
  • 目录 ... USB总线系统中的设备 4. USB2.0 传输协议 4.1 包(package)是什么? 4.1.1 同步域(SYNC) 4.1.2 标识符字段(PID) 4.1.3 数据字段(DATA) 4.1.4 循环冗余校验字段(CRC) 4...
  • 我们在进行复杂系统设计,或者做嵌入式开发,用单片机连接其它各种传感器,都会面临怎样高效通信,设计什么样的总线问题,这里主要梳理了我们常见的USB、串口、I2C、SPI、CAN总线的基本概念,以及在总线设计时我们该...
  • SPI息线的UART扩展方法(转)

    千次阅读 2015-03-23 16:47:04
     目前,UART(Universal Asynchronous Receiver Transmitter,通用异步收发器)接口的使用越来越广泛,许多设备上都提供了UART接口。工业使用的微处理器一般都只包括2个UART口。在实际工业数据发送和采集应用系统中...
  • SJXX串口扩展芯片1 概述SJ000是一款具备I2C总线/SPI总线/UART接口的四通道异步收发器件,通过模式选择使得该器件工作于以上任何一种主接口模式下。器件的四个通道UART可提供高达2Mbps的数据率,低功耗模式和睡眠电流...
  • SPI、IIC、UART、CAN 等常见总线协议

    千次阅读 2019-08-29 13:42:13
    SPI、IIC、UART、GPIO 等常见的总线协议,它们的通信方式。
  • 四通道UART HUB

    2014-10-23 15:40:47
    IIC总线接口 2.5V-5.5V宽电压 SOP20 4通道16级FIFO的UART扩展 通用异步收发器

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,572
精华内容 1,028
关键字:

串行uart总线的扩展