通常SPI通过4个引脚与外部器件相连:
● MISO:主设备输入/从设备输出引脚。该引脚在从模式下发送数据,在主模式下接收数据。
● MOSI:主设备输出/从设备输入引脚。该引脚在主模式下发送数据,在从模式下接收数据。
● SCK:串口时钟,作为主设备的输出,从设备的输入
●NSS:从设备选择。这是一个可选的引脚,用来选择主/从设备。它的功能是用来作为“片选引脚”,让主设备可以单独地与特定从设备通讯,避免数据线上的冲突。从设备的NSS引脚可以由主设备的一个标准I/O引脚来驱动。一旦被使能(SSOE位),NSS引脚也可以作为输出引脚,并在SPI处于主模式时拉低;此时,所有的SPI设备,如果它们的NSS引脚连接到主设备的NSS引脚,则会检测到低电平,如果它们被设置为NSS硬件模式,就会自动进入从设备状态。当配置为主设备、NSS配置为输入引脚(MSTR=1,SSOE=0)时,如果NSS被拉低,则这个SPI设备进入主模式失败状态:即MSTR位被自动清除,此设备进入从模式。
注意:
- 在改变CPOL/CPHA位之前,必须清除SPE位将SPI禁止。
- 主和从必须配置成相同的时序模式。
3.SCK的空闲状态必须和SPI_CR1寄存器指定的极性一致(CPOL为’1’时,空闲时应上拉SCK为高电平;CPOL为’0’时,空闲时应下拉SCK为低电平)。 - 数据帧格式(8位或16位)由SPI_CR1寄存器的DFF位选择,并且决定发送/接收的数据长度。
编程实现:
#define SPI1_SCK_PORT GPIOA
#define SPI1_SCK_PIN GPIO_Pin_5
#define SPI1_MISO_PORT GPIOA
#define SPI1_MISO_PIN GPIO_Pin_6 //MISO 主设备输入从设备输出
#define SPI1_MOSI_PORT GPIOA
#define SPI1_MOSI_PIN GPIO_Pin_7 //MOSI 主设备输出 从设备输入
#define SPI1_APB2_GPIO RCC_APB2Periph_GPIOA //SPI1所在管脚时钟
#define SPI2_SCK_PORT GPIOB
#define SPI2_SCK_PIN GPIO_Pin_13
#define SPI2_MISO_PORT GPIOB
#define SPI2_MISO_PIN GPIO_Pin_14
#define SPI2_MOSI_PORT GPIOB
#define SPI2_MOSI_PIN GPIO_Pin_15
#define SPI2_APB1_GPIO RCC_APB2Periph_GPIOB //SPI2所在管脚时钟
class SPI
{
private:
SPI_TypeDef *spiX;
SPI_InitTypeDef SPI_InitStructure;
GPI