硬汉嵌入式论坛

 找回密码
 立即注册
查看: 4637|回复: 2
收起左侧

[技术讨论] SPI的CS线几种配置说明

[复制链接]

38

主题

4

回帖

118

积分

初级会员

积分
118
发表于 2021-6-10 18:20:57 | 显示全部楼层 |阅读模式
本帖最后由 hoopzhao 于 2022-3-5 15:37 编辑

SPI的CS线几种配置说明

SPI通讯中,CS线通常用于从设备的选择,其存在多种配置组合,本文以AT32F403A_407_Firmware_Library_V2.x.x版本库为基础介绍各种配置下的CS状态
1)硬件CS输出(SPI做主设备)
关键配置如下
  spi_init_struct.master_slave_mode = SPI_MODE_MASTER;
  spi_init_struct.cs_mode_selection = SPI_CS_HARDWARE_MODE;///<set hardware cs
  spi_init(SPIx, &spi_init_struct);
  spi_hardware_cs_output_enable(SPIx, TRUE);///<enable the master cs output
此时SPIx将被配置为主设备,其CS pin脚有效并配置为CS输出控制,此时只要SPI一使能,其将恒定的在CS线上输出低电平
个人心得:此配置通常用于单机通讯,且从设备对CS信号不做特殊要求时
2)硬件CS输入(SPI做主设备)
关键配置如下
  spi_init_struct.master_slave_mode = SPI_MODE_MASTER;
  spi_init_struct.cs_mode_selection = SPI_CS_HARDWARE_MODE;///<set hardware cs
  spi_init(SPIx, &spi_init_struct);
  spi_hardware_cs_output_enable(SPIx, FALSE);///<disable the master cs output
此时SPIx将被配置为主设备,其CS pin脚有效并配置为CS输入检测,此时只要SPI一使能,其将不停的侦测CS pin脚上的电平状态,只要检测到低电平,会立即产生模式错误并关闭SPI及清除主模式配置,若开启对应中断的话,会响应错误中断。
个人心得:此配置下CS pin脚上一定要由外部控制为高电平时才可正常通信。此特性通常可被用于一从多主通讯场景的主设备配置。
3)软件CS(SPI做主设备)
关键配置如下
  spi_init_struct.master_slave_mode = SPI_MODE_MASTER;
  spi_init_struct.cs_mode_selection = SPI_CS_SOFTWARE_MODE;///<set software cs
  spi_init(SPIx, &spi_init_struct);
此时SPIx将被配置为主设备,其CS pin脚无效,既不会输出CS信号到pin脚上又不会侦测pin脚上的电平。实际将会由软件来实现内部CS状态拉高(这一步AT库在spi_init函数内已完成),因此通常不需用户自己去控制内部CS状态。
个人心得
如果用户不使用AT库,而自己通过操作寄存器的方式来初始化SPI的话,在配置主设备软件CS时,一定记得要设定内部CS状态为高(即SPI_CTRL1寄存器的第8bit写一),不然会在SPI使能时产生模式错误。此特性通常可被用于一主多从通讯场景的主设备配置(其中实际上主设备将选用多个普通IO口去控制从设备的CS pin脚)。
4)硬件CS输入(SPI做从设备)
关键配置如下
  spi_init_struct.master_slave_mode = SPI_MODE_SLAVE;
  spi_init_struct.cs_mode_selection = SPI_CS_HARDWARE_MODE;///<set hardware cs
  spi_init(SPIx, &spi_init_struct);
此时SPIx将被配置为从设备,其CS pin脚有效并配置为CS输入侦测,此时只要SPI一使能,其将不停的侦测CS pin脚上的电平状态来筛选SCK线上的CLK(CS pin脚为低时,SCK线上的边沿有效,反之无效)
个人心得:此模式下从设备通过监测CS pin脚上的电平来决定是否参与通信,此特性通常可被用于一主多从通讯场景的从设备配置。
5)软件CS(SPI做从设备)
关键配置如下
  spi_init_struct.master_slave_mode = SPI_MODE_SLAVE;
  spi_init_struct.cs_mode_selection = SPI_CS_SOFTWARE_MODE;///<set software cs
  spi_init(SPIx, &spi_init_struct);
此时SPIx将被配置为从设备,其CS pin脚无效,既不会输出CS信号到pin脚上又不会侦测pin脚上的电平。实际将会由软件将内部CS状态拉低(这一步AT库在spi_init函数内已完成)。如果应用需要实时控制从设备是否参与通信,可通过调用如下其中一条命令来达到效果
spi_software_cs_internal_level_set(SPIx,SPI_SWCS_INTERNAL_LEVEL_HIGHT);///<prohibit communication
spi_software_cs_internal_level_set(SPIx,SPI_SWCS_INTERNAL_LEVEL_LOW);///<permit communication
个人心得:此模式下通常可被用于一从多主通讯场景的从设备配置(其中实际上从设备将选用多个普通IO口去控制主设备的CS pin脚)。

评分

参与人数 1金币 +100 收起 理由
eric2013 + 100 很给力!

查看全部评分

回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107049
QQ
发表于 2021-6-10 18:32:01 | 显示全部楼层
感谢楼主分享。
回复

使用道具 举报

38

主题

4

回帖

118

积分

初级会员

积分
118
 楼主| 发表于 2021-6-11 17:39:20 | 显示全部楼层

谢谢大佬的认可
回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-16 00:34 , Processed in 0.156038 second(s), 26 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表