打印
[应用相关]

SPI的CS线几种配置说明

[复制链接]
2139|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
hoop|  楼主 | 2021-6-10 18:09 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 hoop 于 2022-3-5 15:33 编辑

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脚)。

使用特权

评论回复
沙发
别看我照片| | 2021-6-10 18:13 | 只看该作者
基础知识很重要,学习一下。

使用特权

评论回复
板凳
yangxiaor520| | 2021-6-10 20:59 | 只看该作者
SPI片选信号一般都是用软控

使用特权

评论回复
地板
勇者无惧你和我| | 2021-6-11 08:30 | 只看该作者
跟着楼主学习一下基础的知识,真的特别重要了。哈哈!

使用特权

评论回复
5
hoop|  楼主 | 2021-6-12 21:36 | 只看该作者
yangxiaor520 发表于 2021-6-10 20:59
SPI片选信号一般都是用软控

看应用需求,不过确实软控与一般的单机通讯很搭

使用特权

评论回复
6
kiwis66| | 2021-6-13 13:17 | 只看该作者
用ST的时候,NSS总是IO软件控制,对于硬件NSS一直没搞懂要如何处理。
借AT来试试

使用特权

评论回复
7
HuangHongLun| | 2021-6-15 08:29 | 只看该作者
SPI片选信号一般都是用软控,这样比较灵活一点。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

80

主题

322

帖子

0

粉丝