本文在国产雅特力32位MCU AT32开发库的基础上,针对SPI的NSS功能按照不同的工作模式展开介绍。 1)硬件NSS输出(SPI做主设备)
关键配置如下
SPI_InitStructure.SPI_Mode = SPI_MODE_MASTER;
SPI_InitStructure.SPI_NSSSEL = SPI_NSSSEL_HARD;///<set hardware nss
SPI_Init(SPIx, &SPI_InitStructure);
SPI_NSSHardwareOutputEnable(SPIx, ENABLE)///<enable the master nss output
此时SPIx将被配置为主设备,其NSS pin脚有效并配置为NSS输出控制,此时只要SPI一使能,其将恒定的在NSS线上输出低电平。
2)硬件NSS输入(SPI做主设备)
关键配置如下
SPI_InitStructure.SPI_Mode = SPI_MODE_MASTER;
SPI_InitStructure.SPI_NSSSEL = SPI_NSSSEL_HARD;///<set hardware nss
SPI_Init(SPIx, &SPI_InitStructure);
SPI_NSSHardwareOutputEnable(SPIx, DISABLE)///<disable the master nss output
此时SPIx将被配置为主设备,其NSS pin脚有效并配置为NSS输入检测,此时只要SPI一使能,其将不停的侦测NSS pin脚上的电平状态,只要检测到低电平,会立即产生模式错误并关闭SPI及清除主模式配置,若开启对应中断的话,会响应错误中断。
3)硬件NSS输入(SPI做从设备)
关键配置如下
SPI_InitStructure.SPI_Mode = SPI_MODE_SLAVE;
SPI_InitStructure.SPI_NSSSEL = SPI_NSSSEL_HARD;///<set hardware nss
SPI_Init(SPIx, &SPI_InitStructure);
此时SPIx将被配置为从设备,其NSS pin脚有效并配置为NSS输入侦测,此时只要SPI一使能,其将不停的侦测NSS pin脚上的电平状态来筛选SCK线上的CLK(NSS pin脚为低时,SCK线上的边沿有效,反之无效)
4)软件NSS(SPI做主设备)
关键配置如下
SPI_InitStructure.SPI_Mode = SPI_MODE_MASTER;
SPI_InitStructure.SPI_NSSSEL = SPI_NSSSEL_SOFT;///<set software nss
SPI_Init(SPIx, &SPI_InitStructure);
此时SPIx将被配置为主设备,其NSS pin脚无效,既不会输出NSS信号到pin脚上又不会侦测pin脚上的电平。实际将会由软件来实现内部NSS状态拉高(这一步AT库在SPI_Init函数内已完成),因此通常不需用户自己去控制内部NSS状态。
值得注意的是:如果使用的是配置寄存器的方式,要将内部NSS状态设为高。
5)软件NSS(SPI做从设备)
关键配置如下
SPI_InitStructure.SPI_Mode = SPI_MODE_SLAVE;
SPI_InitStructure.SPI_NSSSEL = SPI_NSSSEL_SOFT;///<set software nss
SPI_Init(SPIx, &SPI_InitStructure);
此时SPIx将被配置为从设备,其NSS pin脚无效,既不会输出NSS信号到pin脚上又不会侦测pin脚上的电平。实际将会由软件将内部NSS状态拉低(这一步AT库在SPI_Init函数内已完成)。如果应用需要实时控制从设备是否参与通信,可通过调用如下其中一条命令来达到效果
SPI_NSSInternalSoftwareConfig(SPIx, SPI_ISS_SET);///<prohibit communication
SPI_NSSInternalSoftwareConfig(SPIx, SPI_ISS_RESET);///<permit communication
|