精华内容
下载资源
问答
  • 串行总线:SPI、IIC、UART

    千次阅读 2020-06-06 19:43:24
    SPI(Serial Peripheral Interface - 串行外设接口)是一种用于短距离通信(主要是嵌入式系统中)的同步串行通信接口规范,这种接口由Motorola发明,已经成了一种事实标准。广泛用于各种MCU处理器中,同传感器,串行...

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

    一、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

    展开全文
  • 串行总线技术(一)-串行总线结构(以PCIe为例)串行总线的出现在早期的计算机系统中,多数外围设备使用并行总线结构。这些总线包括PCI和PATA(并行ATA)。当通信速率较低时,并行总线结...

    3bb40fa785e836bab1494a6103cfce2b.png

    串行总线技术(一)-串行总线结构(以PCIe为例)

    串行总线的出现

    在早期的计算机系统中,多数外围设备使用并行总线结构。这些总线包括PCI和PATA(并行ATA)。当通信速率较低时,并行总线结构可以设计得非常简单和有效,可以连接大量外围设备。通过使用中央仲裁机制,可以方便地实现总线设备间的通信:然而,当速率和带宽不断增加时,并行结构的潜力不断被发掘并不再能够满足系统设计要求。

    并行总线结构的带宽可以通过增加总线宽度或者提高总线的工作频率来实现,但这种增加带宽的方式会逐渐变得困难。并行总线会占用很多引脚,而对现代数字芯片来说,单一芯片中集成了大量的功能,引脚本身就是一种非常紧张的资源,这为继续增加总线宽度带来了困难。

    另外,总线频率已经进行了多次增加(如PCI-->PCIX),继续对大量信号线提高工作频率也变得更加困难。除此之外,并行结构还有一些固有不足,如没有包的概念,没有错误检验机制等。在并行总线中,传输的是数据突发片段,不是完整的数据包,也没有与所传输数裾 相关的CRC校验结果以进行差错控制。并行总线的不足促进串行总线结构的发展,这不仅克服了原有的缺陷,还带来了其他好处。如图所示为并行总线与串行总线示例。

    447b79565efe60fd75ab5f99374ac1e2.png 538966c2d406f5b4c3040a8ae4c835df.png

    现在的数字系统中有很多种串行总线。PCI Express(代替了并行PCI总线)、SATA(代替PATA)以及USB等就是一些常用的高速总线。这些总线的速率也从MHz达到了GHz。

    串行总线的优缺点

    优点

    • 占用引脚数量少

    串行总线使用一对信号线发送数据(TX+ TX-),使用一对信号线接收数据(RX+ RX-)。而PCI和PCIX等并行总线会占用大量引脚。

    • 差分信号

    TX和RX信号线上采用的是差分信号传输方式,这种传输方式具有很高的抗噪声能力。

    • 强错误检测能力

    串行协议使用基干包的数据传输方式,对数据包采用了CRC校验。相比于PCI中采用的奇偶校验,CRC校验具有很强的检错能力。

    • 纠错与恢复

    因为采用基于包的传输方式并且带有CRC校验,接收设备能够检测出接收数据包中的错误并通知发送端出现了传输错误,发送端可以重新发送出现错误的数据包。

    • 全双工数据和控制流

    数据包可以在TX信号线上传输,同时可以在RX信号线上接收控制信息。SATA使用类似HOLD的流控原语来实时阻止数据发送以避免数据溢出。

    • 分割式数据传输

    在分割式数据传输中,request和completion可以不出现在同一个数据传输操作中。这不是串行总线所特有的必要特征。所有的串行总线都使用包和分割式数据传输协议进行数据传输。多数早期的并行总线(PCI、AHB)不支持分割式数据传输。最新的并行总线,如AXI 开始支持这一协议。

    缺点

    串行总线也存在一些不利之处。

    • 只支持点到点连接

    通过串行总线只能连接两个设备,而对于并行总线,可以在单一总线上连接多个设备,并目.很容易增减总线上的设备。对于串行总线,我们需要使用交换机和多个总线设备连接。

    • 更大的延迟

    由于串行及分层结构特点,串行结构的总线延迟更大一些。

    串行总线结构

    串行总线结构只允许点到点连接,一条串行总线只能连接两个设备,而并行总线可以同吋连接多个设备。在串行总线结构中,总线设备中需要包括两个基本电路部件:MAC控制器(通常简称为控制器)和PHY(主要实现模拟收发功能)。MAC具有分层结构,通常包括三个 层次。PHY包括两个部分:PCS和PMA。PCS(Physical Coding Sublayer,物理编码子层)主要实现编解码等数字逻辑功能。PMA主要实现时钟恢复、均衡和信号电平检测等模拟功能。

    下面我们将以PCIe和SATA为例,对串行总线结构加以分析,如图所示。

    2c62c0ff59219bbf1c1f9f34e0f37b58.png

    MAC控制器包括三个层次:PHY逻辑层 、 数据链路层和事务层。每一层都有自己特定的功能。

    PHY逻辑层

    两个相互联接设备的PHY逻辑层之间使用PHY层包进行通信,称为有序训练集合,如图所示。PHY层包被用于建立链路和确定交互的操作速度,在训练阶段结束时,双方进入连接阶段,此时它们已经做好了传输数据链路层和事务层包的准备。PHY层包产生于PHY层,终结于另一侧的PHY逻辑层,不会上交给其他层次。

    c57f1de5cd76df56330b490ed5b0ffc6.png

    数据链路层

    数据链路层使用短的、固定长度(2个dword/8字节)的包在两个设备间交互链路信息,如图所示。这些包也被称为DLLP(Data Link Layer Packet,数据链路层包)。DLLP被用于交换信用信息、ACK、NAK和功率管理协议。DLLP在本层产生,终止于对端的同一层, 不会进一步向上提交。

    28e72432b2e5353c9821d6f296acd7ff.png

    事务层

    本层在两个设备间进行实际的数据交互,如下图所示。这些包被称为TLP(Transaction Layer Packet,事务层包),TLP为变长包。TLP包括头域、数据净荷和CRC校验。一个TLP由start-of-packet符号开始,以END符号结束。

    0d05b15fd1039fc03ccd92a570a89a89.png

    串行总线时钟

    在PCIe中,平台提供100MHz参考时钟,通过PCIe插槽提供给总线设备。PCIe端点设备从PCIe连接器处获取该参考时钟并将其交给PHY PMA层。PMA内部有一个PLL,它根据输入的100MHz时钟和输入的RX数据流生成250MHz的时钟PCLK。PHY将PCLK提供给MAC发送数据(从MAC到PHY)和接收数据(从PHY到MAC)都同步于PCLK。对于PCIe,MAC的接收和发送电路工作在同一个时钟域。对于其他串行总线结构,如SATA收发电路时钟可能不同。在SATA中,发送和接收时钟是不同的,属于异步时钟。

    发送路径的微结构

    MAC和PHY PCS之间的接口是标准的,虽然这不一定必要,但标准化有利于IP核的开发,可提高不同芯片厂商IP核之间的互操作性。对于PCIe来说,该接口被称为PIPE接口。

    MAC提供的发送数据的位宽为8比特或16比特。PCLK的频率与数据总线的位宽有直接关系,数据位宽为8比特时,PCLK为250MHz数据位宽为16比特时,PCLK为125MHz,如图所示。

    00ca7a2918b58ad29b3e0755584b5048.png

    这两个频率是PCIe Genl所使用的,在Gen2中,二者都进行了翻倍。位宽变换电路模块可以将16比特的数据位宽转换成8比特的位宽,接着将其送入8b/10b编码器。编码器将每个8比特的数据转换成为10比特的编码值并将其传递到PHY的PMA层。PMA层使用一个高速时钟(Genl时为2.5GHz,Gen2时为5GHz)进一步将10比特的编码结果转换为单比特串行数据并通过TX信号线发出。

    接收路径的微结构

    PMA接收电路实现比特提取和串并变换功能,将单比特的串行接收数据变换成为10比特的并行数据,如图所示。

    88466fc5bea9f359e763c6ba2d7f96c8.png

    10比特的数据流从PMA接收电路进入PCS接收电路。此时的10比特数据流并非是字符对准的。在PCS内部,10比特数据流先后进入字符对准电路、弹性缓冲区、10b/8b解码电路并最终进入可选的8b/16b转换电路。

    字符对准

    PCIe接收的数据是以10比特的字符为组成单位的。PMA接收电路将接收数据组成10比特字符时没有按照字符边界进行。字符对准逻辑电路查找COMMA字符并以它为基础进行字符边界对准。对准后的字符流被送入弹性缓冲区,如图所示。

    19976dbf9a65f8790824289f7f5fd492.png

    弹性缓冲区

    PCIe链路两端所使用时钟的标称值均为250MHz。它们可以使用平台提供的同一个时钟,或者选择它们自带的时钟源来生成250MHz的工作时钟。当使用相互独立的时钟时,它们之间会有微小的偏差(偏差可能非常微小,但不会为0),此时,经过一段时间之后,会造成数据的上溢或下溢。总线一端的时钟频率可能比另一端略微高一些,频率低的一端会出现数据缓冲区上溢,频率高的一端会出现数据缓冲区下溢。串行总线中使用弹性缓冲区来处理时钟频率上的微小差别。我们将对PCIe和SATA中的弹性缓冲区加以介绍。

    位宽为10比特的接收符号流被写入一个FIFO。按照PCIe协议,在发送数据时,会按照一定的间隔定期发送填充包(称为SKIP集合)。这些填充包可以在不影响数据净荷、编码/解码、扰码/解扰码的情况下快速插入和去除。写入逻辑持续将10比特的字符写入FIFO,读岀逻辑持续将FIFO中的字符读出。如果写入速度比读出速度快,FIFO中的数据深度将逐渐增加。

    当FIFO中的数据深度达到了预先设定的上限时,写入逻辑会丢弃1个或多个SKIP字符。类似地,当写入速度低于读出速度时,FIFO中的数据深度会逐渐降低,当深度降至预先设定的下限时,读出逻辑不再从FIFO中读出数据,它会暂停读出数据,同时向数据通路中插入一个SKIP符号。这里的FIFO就是弹性缓冲区,其内部数据深度是变化的,可以用于调整读写时钟频率的微小偏差,如图所示。

    4a1e61ba9fb2709ff8e331b7c8e7b38a.png

    需要说明的是,这种工作机制可以用于处理微小的读写频率偏差,不适合处理较大的频率偏差(较大的时钟偏差需要深度较大的弹性缓冲区并且会引入较大的延迟)。规范中对频率偏差会提出限制,例如,PCIe中的频率偏差应小于300PPM。当时钟偏差被限定在一定PPM之内时,SKIP出现的间隔就可以计算得到。

    SATA使用了类似的机制,它会在每256个双字之间插入两个ALIGH原语。ALIGN原语根据两边的频率差可以快速地被丢弃或插入。

    10b/8b解码和8b/16b转换

    弹性缓冲区的输出进入解码器电路,它会将10比特的字符转换成为8比特的数据。如果PCS-MAC接口数据通道宽度为16比特,那么需要将两个连续的8比特数据拼接起来构成16比特的数据并送给接收MAC如果数据通路宽度为8比特,那么不需要做任何处理,直接送给接收MAC。

    后面会继续讲讲《串行总线更多结构》,敬请期待。

    032f0b24a3963054f4579f492b607e8c.gif

    NOW

    学习Xilinx FPGA最好的资料其实就是官方手册,下表总结了部分手册的主要介绍内容,关注我,持续更新中......

    文件名主标题内容简单介绍是否有中文版
    UG4767 Series FPGAs GTX/GTH  TransceiversGTX和GTH介绍,PCIe、serdes等学习必备
    UG4717 Series FPGAs SelectIO Resources描述 7 系列 FPGA 中可用的 SelectIO资源。
    UG1114PetaLinux Tools DocumentatonPetaLinux 工具文档 参考指南是,V2019.2
    UG949UltraFAST 设计方法指南(适用于 Vivado  Design Suite)赛灵思® UltraFast™  设计方法是用于为当今器件优化设计进程的一套最佳实践。这些设计的规模与复杂性需要执行特定的步骤与设计任务,从而确保设计每一个阶段的成功开展。依照这些步骤,并遵循最佳实践,将帮助您以最快的速度和最高的效率实现期望的设计目标是,V2018.1
    IP手册pg057FIFO GeneratorFIFO生成器IP使用手册
    pg104Complex Multiplier复数乘法器IP使用手册
    pg122RAM-Based Shift Register 移位寄存器IP使用手册

    45ca22f429c9dfff436af538e7189353.png

    推荐阅读

    【Vivado那些事】如何查找官网例程及如何使用官网例程

    【Vivado使用误区与进阶】总结篇

    【Vivado那些事】Vivado中常用的快捷键(二)其他常用快捷键

    SystemVerilog数字系统设计_夏宇闻 PDF

    图书推荐|ARM Cortex-M0 全可编程SoC原理及实现

    简谈:如何学习FPGA

    Github 上有哪些优秀的 VHDL/Verilog/FPGA 项目

    AD936x+ZYNQ搭建收音机(一)

    AD936x+ZYNQ搭建OpenWIFI

    无招胜有招-Vivado非工程模式下的详细设计

    面试中经常会遇到的FPGA基本概念,你会几个?

    推荐一些可以获取免费的国外的原版书籍(电子版)网站

    FPGA 的重构

    国产CPU概括

    从电子游戏历史看IC发展的助推剂

    80年代电子游戏及电脑游戏的发展历史

    PCIe总线的基础知识

    万字长文带你回顾电子游戏的七十多年历史(完整版)

    FPGA中异步复位,同步释放的理解

    OpenFPGA系列文章总结

    用Verilog设计一个16 位 RISC 处理器

    介绍一些新手入门FPGA的优秀网站(新增)

    Verilog数字系统基础设计-CR

    Verilog数字系统基础设计-奇偶校验

    建立和保持时间及时序简单理解

    (Xilinx)FPGA中LVDS差分高速传输的实现

    Xilinx Multiboot实例演示

    高速串行通信常用的编码方式-8b/10b编码/解码
    Verilog计时(微秒、毫秒和秒)脉冲的产生及同步整形电路

    图书推荐|一本图像/视频处理的强大工具书

    Verilog HDL-同步技术

    再说System Verilog 与 Verilog 的关系

    数模混合信号建模语言Verilog-AMS

    Intel/Altera 系列FPGA简介

    一块带给无数人年少欢乐的CPU,别说你没用过它

    Verilog在编写第一行代码之前

    【例说】Verilog HDL 编译器指令,你见过几个?

    穿越时空的爱恋-Z80 CPU的前世今生

    【Vivado】那些事儿-汇总篇

    古老CPU启示录-晶体管之路

    【Vivado那些事儿】约束的顺序

    童年修复系列-SNES芯片组介绍及FPGA实现

    优秀的 Verilog/FPGA开源项目介绍(二)-RISC-V

    展开全文
  • SPI串行总线

    千次阅读 2019-03-30 22:57:46
    SPI是一种高速的、全双工、同步通信总线,标准的SPI也仅仅使用4个引脚,广泛用于EEPROM、Flash、RTC(实时时钟)、ADC(数模转换器)、DSP(数字信号处理器)以及数字信号解码器上。SPI通信的速度很容易达到好几兆...

    原理介绍:

    SPI是同步串行通信接口。英文是serial
    peripheral interface的缩写,也就是串行外围设备接口。

    SPI是一种高速的、全双工、同步通信总线,标准的SPI也仅仅使用4个引脚,广泛用于EEPROM、Flash、RTC(实时时钟)、ADC(数模转换器)、DSP(数字信号处理器)以及数字信号解码器上。SPI通信的速度很容易达到好几兆bps,所以可以用SPI总线传输一些未压缩的音频以及压缩的视频。SPI通信原理比I2C要简单,它主要是主从方式通信,这种模式通常只有一个主机和一个或者多个从机,标准的SPI是4根线,分别是SSEL(片选,也写作SCS)、SCLK(时钟,也写作SCK)、MOSI(主机输出从机输入Master Output/Slave Input)和MISO(主机输入从机输出Master Input/Slave Output)。

    SSEL:从设备片选使能信号。如果从设备是低电平使能的话,当拉低这个引脚后,从设备就会被选中,主机和这个被选中的从机进行通信。

    SCLK:时钟信号,由主机产生,和I2C通信的SCL有点类似。

    MOSI:主机给从机发送指令或者数据的通道。

    MISO:主机读取从机的状态或者数据的通道。

    在某些情况下,我们也可以用3根线的SPI或者2根线的SPI进行通信。比如主机只给从机发送命令,从机不需要回复数据的时候,那MISO就可以不要;而在主机只读取从机的数据,不需要给从机发送指令的时候,那MOSI可以不要;当一个主机一个从机的时候,从机的片选有时可以固定为有效电平而一直处于使能状态,那么SSEL可以不要;此时如果再加上主机只给从机发送数据,那么SSEL和MISO都可以不要;如果主机只读取从机送来的数据,SSEL和MOSI都可以不要。 3线和2线的SPI大家要知道怎么回事,实际使用也是有应用的,但是当我们提及SPI的时候,一般都是指标准SPI,都是指4根线的这种形式。

    先来学习两个名词:

    CPOL: Clock Polarity,就是时钟的极性。通信的过程分为空闲时刻和通信时刻,SCLK在数据发送之前和之后的空闲状态是高电平那么CPOL,那么CPOL = 1,如果空闲状态SCLK是低电平,那么CPOL = 0;如果空闲状态SCLK是低电平,那么CPOL = 0;

    CPHA: Clock Phase,就是时钟的相位。

    CPHA=1,就表示数据的输出是在一个时钟周期的第一个沿上,至于这个沿是上升沿还是下降沿,这要是CPOL的值而定,CPOL=1那就是下降沿,反之就是上升沿。那么数据的采样自然就是在第二个沿上了。

    CPHA=0,就表示数据的采样是在一个时钟周期的第一个沿上,同样它是什么沿由CPOL决定。那么数据的输出自然就在第二个沿上了。

    主机和从机要交换数据,就牵涉到一个问题,即主机在什么时刻输出数据到MOSI上而从机在什么时刻采样这个数据,或者从机在什么时刻输出数据到MISO上而主机什么时刻采样这个数据。同步通信的一个特点就是所有数据的变化和采样都是伴随着时钟沿进行的,也就是说数据总是在时钟的边沿附近变化或被采样。而一个时钟周期必定包含了一个上升沿和一个下降沿,这是周期的定义所决定的,只是这两个沿的先后并无规定。又因为数据从产生的时刻到它的稳定是需要一定时间的,那么,如果主机在上升沿输出数据到MOSI上,从机就只能在下降沿去采样这个数据了。反之如果一方在下降沿输出数据,那么另一方就必须在上升沿采样这个数据。

    每个clock周期内,SPI设备都会发送并接收1 bit数据,相当于有1 bit数据被交换了。数据传输高位在前,低位在后(MSB
    first)。SPI主从结构内部数据传输示意图如下图所示
    在这里插入图片描述

    下面是4种模式:

    模式0:CPOL = 0,CPHA = 0。SCK串行时钟线空闲是为低电平,数据的采样是在第一个沿上,也就是上升沿,数据的输出是在第二个沿上,也就是下降沿。
    在这里插入图片描述

    模式1:CPOL = 0,CPHA =
    1。SCK串行时钟线空闲是为低电平,数据的输出是在第一个沿上,也就是上升沿,所以数据的采样是在下降沿。
    在这里插入图片描述

    模式2:CPOL = 1,CPHA =
    0。SCK串行时钟线空闲是为高电平,数据的采样是在第一个沿上,也就是下降沿,所以数据的输出是在下降沿。
    在这里插入图片描述

    模式3:CPOL = 1,CPHA =
    1。SCK串行时钟线空闲是为高电平,数据的输出是在第一个沿上,也就是下降沿,所以数据的采样是在上升沿。
    在这里插入图片描述
    仿真程序后面补上

    展开全文
  • 本文只是简单介绍一下各种嵌入式高速串行总线的使用场景以及定位。

    嵌入式高速串行总线技术应用对比

    SRIO总线

    SRIO(Serial RapidIO)是一种低延时、基于包交换和分发结构的、支持消息和读写操作的、具有容错机制和流量控制的、高效率低功耗、可支持数千个节点的新型总线结构。
    SRIO总线的定位是针对嵌入式系统多处理器间的互连。

    JESD204总线

    JESD204总线是面向DAC、ADC的串行通信总线结构。
    JESD204协议采用CML(Current Mode Logic)电平,以一对差分线代替原来并行的12~16位数据线,实现ADC、DAC器件的串行通信接口。

    PCIE

    PCIE主要用于PC领域的高速串行通信。
    PCIE是PC内的系统总线或局部系统总线,用于连接CPU及各种功能的外设,是一种通用总线结构。
    PC领域有一个中央处理器CPU,其余均为CPU的外设,即只有一个主设备。

    SATA总线

    SATA主要用于实现PC领域的存储。
    SATA是面向硬盘存储的总线接口。

    Aurora

    Aurora总线协议由Xilinx公司于2002年首次提出,是针对FPGA间的高速串行数据传输总线。
    与SRIO,PCIE总线相比,Aurora总线特征明显,用于解决FPGA之间的数据传输,速率任意,不支持交换结构。

    FC标准

    SRIO主要用于解决嵌入式处理器之间的互联,JESD204实现ADC、DAC与FPGA之间的接口,SATA主要用于实现PC领域的存储,而企业级的存储区域网络(SAN,Storage Area Network)也需要一种高速的串行通信技术用于代替并行的SCSI方式了,FC总线标准诞生了。
    FC准备综合了通道技术和网络技术这两种技术的各自优势。通道技术的设计目的是为了使数据信息在设备缓存间能够快速传输,而不需要进行很多的逻辑操作,属于一种硬件密集型的技术,如前面的SRIO;
    网络技术属于一种软件密集型技术,具有操作大量节点的能力,网络上的数据包通过网络技术可以被路由到许多设备中的某个节点上,典型应用为SAN。

    VPX架构

    VPX是嵌入式串行总线的集大成者,可以在嵌入式系统中实现多种总线的互连。

    参考文献:
    嵌入式高速串行总线技术-基于FPGA实现与应用

    展开全文
  •  通用串行总线(USB)正迅速成为大部分PC外设的标准接口。由于它具有出色的速度、灵活性,并且支持设备热插拔,因而正在取代RS-232和并行打印机端口。工业和医疗设备制造商也非常希望使用这种总线,但苦于没有很好的...
  • 摘要:以USB1.1为基础讨论了USB的基本原理、工作流程、通信协议和相应的关键技术,并介绍了一种USB接口的10M以太网卡的设计方案。...它是一种用于将适用USB的外围设备连接到主机的外部总线
  • 总线的定义, 并行总线和串行总线

    千次阅读 2020-09-24 08:47:17
    任何一个微处理器都要与一定数量的部件和外围设备连接,但如果将各部件和每一种外围设备都分别用一组线路与CPU直接...内部总线是微机内部各外围芯片与处理器之间的总线用于芯片一级的互连;而系统总线是微机中各插件
  •  通用串行总线(USB)正迅速成为大部分PC外设的标准接口。由于它具有出色的速度、灵活性,并且支持设备热插拔,因而正在取代RS-232和并行打印机端口。工业和医疗设备制造商也非常希望使用这种总线,但苦于没有很好的...
  • 目录 ... USB总线系统中的设备 4. USB2.0 传输协议 4.1 包(package)是什么? 4.1.1 同步域(SYNC) 4.1.2 标识符字段(PID) 4.1.3 数据字段(DATA) 4.1.4 循环冗余校验字段(CRC) 4...
  • PCI Express是一种高速串行连接,其运行方式更像是网络而不是总线
  • 通用串行总线USB

    千次阅读 2013-07-18 15:31:28
    7.3.2 通用串行总线USB USB(Universal Serial Bus)的中文含义是通用串行总线,它是一种新型的外设接口标准。USB以Intel公司为主,并有Compaq、IBM、DEC以及NEC等公司共同开发,于1994年11月制定了第一
  • 高速串行总线系列(3)GTX/GTH 物理层结构分析

    千次阅读 多人点赞 2019-12-23 23:02:29
    我们熟知的各种高速串行总线,例如SRIO,Aurora,以及PCIE等都是以MGT为物理层实现的,因此,了解MGT是很有必要的。 本文以数据手册UG476为参考资源,来简单记录下对MGT硬核资源的理解。 Transceiver总览 ...
  • 这3种串行总线主要区别: SPI- Serial Peripheral Interface(串行外设接口),突出了外设,也就有了主(Master - 控制器)和从(Slave - 外设)之分,在总线中也就只有一个“主人”,其它都是处于服从的位置,...
  • SPI、I2C、UART三种串行总线的区别

    千次阅读 2013-10-26 22:11:56
    SPI、I2C、UART三种串行总线的区别 第一个区别当然是名字:  SPI(Serial Peripheral Interface:串行外设接口); I2C(INTER IC BUS:意为IC之间总线) UART(Universal Asynchronous Receiver Transmitter...
  • Universal Serial Bus (USB ) 通用串行总线

    千次阅读 2015-09-14 10:49:52
    Bus(通用串行总线)的缩写,而其中文简称为“通串线”,是一个外部总线标准,用于规范电脑与外部设备的连接和通讯。是应用在PC领域的接口技术。USB接口支持设备的即插即用和热插拔功能。USB是在1994年底由英特尔、...
  • SPI、I2C、UART(即串口)三种串行总线详解

    万次阅读 多人点赞 2017-03-23 16:48:29
    用于连接微控制器及其外围设备 , 是微电子通信控制领域广泛采用的一种总线标准。 UART (Universal Asynchr onous Receiver Transmitter: 通用异步收发器 ),是电脑硬件的一部分,它把将要传输的资料在串行...
  • I2C,SPI,UART,USART,USB 的区别及串行总线的选择 1、首先看看它名字真正的含义: SPI(Serial Peripheral Interface:串行外设接口); I2C(INTER IC BUS:意为IC之间总线) UART(Universal Asynchronous Receiver ...
  • 树莓派 SPI,I2C,UART串行总线介绍

    千次阅读 2019-06-09 03:08:50
    很多人对总线串行等概念不熟悉特别是SPI,I2C,UART,GPIO等概念。 因此我收集了一些资料,用于总结。希望对大家有所帮助。 首先看一下树莓派上的接口: GPIO引脚 x 26 UART总线 x 1 SPI总线 x 1...
  • 几乎任何地改变都是趋利避害:拿芯片间通信为例,过去几乎完全是并行总线,碍于技术限制,使用串行总线所需的serialize(串行化)以及deserialize(解串行化)所需的逻辑量远远超过了减少引脚数量所带来的节省。...
  • 1 车速传感器性能测试平台简介 车速传感器是电控汽车的关键部件,其性能优劣...所以,整个系统必须通过一个测试操作台计算机将上层局域网和底层串行总线网络连接起来以保证实测数据(各项性能指标数据)的顺利上传和
  • SPI、I2C、UART三种串行总线的原理、区别及应用

    万次阅读 多人点赞 2013-04-24 16:11:38
    SPI协议解析,链接如下 https://blog.csdn.net/weiqifa0/article/details/82765892 I2C协议解析,链接如下 ... 串口UART串行总线协议 https://blog.csdn.net/weiqifa0/article/detai...
  • 表1 车用串行总线标准概览表 表1是一张总表,我们分项介绍之: 一、APIX接口 APIX接口的全称是Automotive pixel link,是德国公司Inova主推的,发展到现在已经到了第三代,称之为APIX3接口标准,最高带宽可达12Gbps...
  • MEEB_3DP MEEB的3d打印机控制板。
  • SPI、I2C、UART三种串行总线协议的区别 第一个区别当然是名字:  SPI(Serial Peripheral Interface:串行外设接口);  I2C(INTER IC BUS)  UART(Universal Asynchronous Receiver Transmitter:通用...
  • 除了这些标准,连接还常用于异步和点对点应用中。  然而今天,子系统之间带宽的迅速增长,低延时通路在子系统边界扩展的风险,以及严格的功耗和成本预算等因素导致一切变得更加复杂。在很多设计中,不可能在系统中...
  • : 能用于替代标准的并行总线,能连接的各种集成电路和功能模块。I2C是多主控总线,所以任何一个设备都能像主控器一样 工作 ,并控制总线总线上每一个设备都有一个独一无二的地址,根据设备它们自己的能力,它们...
  • I2C,也叫 IIC,是一种常见的串行总线,它只需要两根线即可在连接于总线上的器件之间传送信息。 0. 电气知识 开漏输出:Open drain output,不输出电压,低电平时接地,高电平时不接地。 上拉电阻:pull-up ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 27,604
精华内容 11,041
热门标签
关键字:

串行总线主要用于连接