SPI协议并没有我想的那么简单( 三 )


 

  •  
    另一方面,距离主机越远的从机,获得服务的优先级越低,所以需要安排好从机的优先级,并且设置总线检测器,如果某个从机超时,则对该从机进行短路,防止单个从机损坏造成整个链路崩溃的情况;
     
  •  
    具体的连接如下图所示;
    SPI协议并没有我想的那么简单

    文章插图
    菊花链连接
     
    其中红线加粗为数据的流向;
     
    所以最终的数据流向图可以表示为:
    SPI协议并没有我想的那么简单

    文章插图
    数据流图
     
    SCK为时钟信号,8clks表示8个边沿信号;
    其中D为数据,X为无效数据;
     
    所以不难发现,菊花链模式充分使用了SPI其移位寄存器的功能,整个链充当通信移位寄存器,每个从机在下一个时钟周期将输入数据复制到输出 。
    优缺点SPI通讯的优势
    使SPI作为串行通信接口脱颖而出的原因很多;
     
    •  
      全双工串行通信;
       
    •  
      高速数据传输速率 。
       
    •  
      简单的软件配置;
       
    •  
      极其灵活的数据传输,不限于8位,它可以是任意大小的字;
       
    •  
      非常简单的硬件结构 。从站不需要唯一地址(与I2C不同) 。从机使用主机时钟,不需要精密时钟振荡器/晶振(与UART不同) 。不需要收发器(与CAN不同) 。
       
    SPI的缺点
    •  
      没有硬件从机应答信号(主机可能在不知情的情况下无处发送);
       
    •  
      通常仅支持一个主设备;
       
    •  
      需要更多的引脚(与I2C不同);
       
    •  
      没有定义硬件级别的错误检查协议;
       
    •  
      与RS-232和CAN总线相比,只能支持非常短的距离;
       
    编程实现 
    下面是通过STM32的cubemx自动生成的HAL库代码,比较简单,截取了其中一部分,具体如下;
    staticvoidMX_SPI1_Init( void)
    {
    hspi1.Instance = SPI1;
    hspi1.Init.Mode = SPI_MODE_MASTER; //主机模式
    hspi1.Init.Direction = SPI_DIRECTION_2LINES; //全双工
    hspi1.Init.DataSize = SPI_DATASIZE_8BIT; //数据位为8位
    hspi1.Init.CLKPolarity = SPI_POLARITY_LOW; //CPOL=0
    hspi1.Init.CLKPhase = SPI_PHASE_1EDGE; //CPHA为数据线的第一个变化沿
    hspi1.Init.NSS = SPI_NSS_SOFT; //软件控制NSS
    hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_2; //2分频,32M/2=16MHz
    hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB; //最高位先发送
    hspi1.Init.TIMode = SPI_TIMODE_DISABLE; //TIMODE模式关闭
    hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE; //CRC关闭
    hspi1.Init.CRCPolynomial = 10; //默认值,无效
    if(HAL_SPI_Init(&hspi1) != HAL_OK) //初始化
    {
    _Error_Handler(__FILE__, __LINE__);
    }
    }
    //发送数据
    HAL_StatusTypeDef
    HAL_SPI_Transmit(SPI_HandleTypeDef *hspi,
    uint8_t*pData,
    uint16_tSize,
    uint32_tTimeout) ;
    //接收数据
    HAL_StatusTypeDef
    HAL_SPI_Receive(SPI_HandleTypeDef *hspi,
    uint8_t*pData,
    uint16_tSize,
    uint32_tTimeout) ;
    免责声明:本文系网络转载,版权归原作者所有 。如涉及作品版权问题,请与我们联系,我们将根据您提供的版权证明材料确认版权并支付稿酬或者删除内容 。

    【SPI协议并没有我想的那么简单】


    推荐阅读