另一方面,距离主机越远的从机,获得服务的优先级越低,所以需要安排好从机的优先级,并且设置总线检测器,如果某个从机超时,则对该从机进行短路,防止单个从机损坏造成整个链路崩溃的情况;
具体的连接如下图所示;
文章插图
菊花链连接
其中红线加粗为数据的流向;
所以最终的数据流向图可以表示为:
文章插图
数据流图
SCK为时钟信号,8clks表示8个边沿信号;
其中D为数据,X为无效数据;
所以不难发现,菊花链模式充分使用了SPI其移位寄存器的功能,整个链充当通信移位寄存器,每个从机在下一个时钟周期将输入数据复制到输出 。
优缺点SPI通讯的优势
使SPI作为串行通信接口脱颖而出的原因很多;
-
全双工串行通信;
-
高速数据传输速率 。
-
简单的软件配置;
-
极其灵活的数据传输,不限于8位,它可以是任意大小的字;
-
非常简单的硬件结构 。从站不需要唯一地址(与I2C不同) 。从机使用主机时钟,不需要精密时钟振荡器/晶振(与UART不同) 。不需要收发器(与CAN不同) 。
-
没有硬件从机应答信号(主机可能在不知情的情况下无处发送);
-
通常仅支持一个主设备;
-
需要更多的引脚(与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协议并没有我想的那么简单】
推荐阅读
- 交通事故协议书 交通事故协议书范本
- 工程施工安全责任协议书怎么写 安全施工协议
- 巴萨买哈兰德?巴萨或与哈兰德达成加盟协议
- 加班|《木卫四协议》开发商公开宣传“996”:CEO现已道歉
- 游戏|《木卫四协议》为不跳票狂赶工 一周7天、一天15小时
- 核聚变|从月薪5000到年薪1.2亿美元?假的!博士电视求职被拒并没有翻身
- 尼康d5300好吗?尼康d5300的缺点_1
- 小孩尿臭是怎么回事
- 面试|我工作了1年多就当上了管理,我并没有高兴,而是对未来多了迷茫
- |怎么养紫砂壶