本帖最后由 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脚)。
|