以STM32F103RCT6芯片为例,查芯片手册,可以看到SPI1的NSS引脚对应PA4引脚,那么这个NSS引脚作用是什么?
SPI通信需要有MOSI、MISO、SCLK、CS(Chip Select)四个引脚。一般SPI的从机的片选端(CS)为低电平时,从机被选中,此时从机才能正常工作。所有的主机和从机其实都有片选信号,只有片选了,才能工作。而SPI的主机要正常工作,片选端需要为高电平。但是从STM32的数据手册中找不到SPI的CS引脚,其实文章开头提到的NSS引脚起到的就是CS引脚的作用。下面我们对主机的NSS引脚的配置进行分析:
在使用固件库对SPI进行配置时,调用的是SPI_Init函数,在对入口参数SPI_InitStruct的成员的有效性判断函数的定义中,我们可以查找到SPI_Mode成员的有效值为
#define SPI_Mode_Master ((uint16_t)0x0104)
#define SPI_Mode_Slave ((uint16_t)0x0000)
而SPI_NSS成员的有效值为
#define SPI_NSS_Soft ((uint16_t)0x0200)
#define SPI_NSS_Hard ((uint16_t)0x0000)
在调用SPI_Init配置SPI主机时,我们将SPI_Mode设置为SPI_Mode_Master,并将SPI_NSS设置为SPI_NSS_Soft即可。这其中的原理是什么呢?
根据SPI_Mode_Master和SPI_NSS_Soft的宏定义,实际上这两个参数将SPI_CR1寄存器的第2、8、9位设置为了1。位2是主设备选择位,查手册可知要配置为主机,显然要将此位置1。但仅配置这一位是不够的,上面提到NSS引相当于CS引脚的作用,在配置为主设备时,需要将其接高电平。一种方法是硬件上直接接高电平,也就是在芯片的外部把PA4引脚接到高电平。而我们这里的配置则采用了软件上的方法。CR1寄存器的第九位SSM实际上就决定了是通过软件的方法来配置NSS引脚的电平还是通过硬件的方法来配置NSS引脚的电平。我们使用的SPI_NSS_Soft 宏就是将第九位置位,选择使用软件方法将NSS引脚接高电平。
那么软件方法是什么意思?软件方法就是在我们把SSM位置位后,芯片外部的PA4引脚输入的电平就不再影响NSS引脚最终获得的电平,NSS引脚与CR1寄存器的第八位(SSI)自动进行了关联。NSS引脚的电平将由SSI位来决定。当SSI位置1时,就相当于给NSS引脚接了高电平,当SSI位置0时,就相当于给NSS引脚接了低电平,也就是说我们完全可以通过编程操作CR1寄存器的SSI位来实现将NSS引脚接到高电平,而无需在芯片外部进行实际电路的连接。我们调用SPI_Init函数时,SPI_Mode_Master宏将SSI位置1,因此这个宏相当于给NSS接了高电平,将这个SPI设置为了主机。