1,野火的自带版本讲的还不错,综合多方的资料看比较好
(1) SS ( Slave Select):从设备选择信号线,常称为片选信号线,也称为 NSS、CS,以下用 NSS 表示。当有多个 SPI 从设备与 SPI 主机相连时,设备的其它信号线 SCK、MOSI及 MISO 同时并联到相同的 SPI 总线上,即无论有多少个从设备,都共同只使用这 3 条总线;而每个从设备都有独立的这一条 NSS 信号线,本信号线独占主机的一个引脚,即有多少个从设备,就有多少条片选信号线。I2C 协议中通过设备地址来寻址、选中总线上的某个设备并与其进行通讯;而 SPI 协议中没有设备地址,它使用 NSS 信号线来寻址,当主机要选择从设备时,把该从设备的 NSS 信号线设置为低电平,该从设备即被选中,即片选有效,接着主机开始与被选中的从设备进行 SPI通讯。所以 SPI通讯以 NSS 线置低电平为开始信号,以 NSS 线被拉高作为结束信号。
2,SPI作为一个协议,注意还是要与外设串行FLASH分开一下。类似的I2C与EEPROM。
此次移植中,SPI的操作函数HAL_SPI_TransmitReceive(&hspiflash,&d_send,&d_read,1,0xFFFFFF)是基石,2是基于1的。
相应的其他函数,如void SPI_FLASH_BufferWrite(uint8_t* pBuffer, uint32_t WriteAddr, uint16_t NumByteToWrite);都是在封装函数2下的操作。
还有就是对于外设的操作,一般都有很多命令,只是在我们封装函数的内部,而不是作为条件参数显示而已,万变不离其宗
3,移植时的需要注意到,对于不同的通道PX,当X改变时,要更改对应的时钟
#define FLASH_SPI_CS_CLK_ENABLE() __HAL_RCC_GPIOC_CLK_ENABLE()
最开始只是更改了2,3.后来改了1之后就调通了。