1、内部图简明图
SPI 接口一般使用 4 条线通信:
- MISO 主设备数据输入,从设备数据输出。master in
- MOSI 主设备数据输出,从设备数据输入。master out
- SCLK 时钟信号,由主设备产生。
- CS 从设备片选信号,由主设备控制通信·。
一般自定义GPIO输出、拉低开始通信,拉高结束通信
3、CPOL和CPHA
- 时钟极性( CPOL)
CPOL=0,串行同步时钟的空闲状态为低电平 CPOL=1,串行同步时钟的空闲状态为高电平 - 时钟相位( CPHA)
CPHA=0,在串行同步时钟的第一个跳变沿(上升或下降)数据被采样 CPHA=1,在串行同步时钟的第二个跳变沿(上升或下降)数据被采样 - 最高有效位(MSB)
- 最低有效位(LSB)
3、cubemx配置
3.1、spi5
- Data Size 数据长度
8bit和16bit两种 - First Bit 对齐形式
MSB 在前还是 LSB 在前 - Prescaler 预分频(psc)
用于控制波特率,波特率 = 时钟/psc 这里 SPI5用的是APB2 - Clock Polarity CPOL
时钟极性设置 - Clock Phase CPHA
时钟相位设置 - CRC Calculation
是否启用CRC - NSS Signal Type 片选形式
-硬件实现还是软件实现
3.2、片选线
4、应用
- 对spi flash进行读写
- spi flash 为 W25Q256
4.1、原理图
4.2、读取设备id
- 这里是读取命令
- dummy 表示任意数据
void spi_readid(void){
uint16_t temp = 0;
uint8_t rxdata = 0;
uint8_t txdata = 0;
HAL_GPIO_WritePin(F_CS_GPIO_Port,F_CS_Pin,GPIO_PIN_RESET);
txdata = 0x90;
HAL_SPI_Transmit(&hspi5,&txdata,1,999);
txdata = 0x00;
HAL_SPI_Transmit(&hspi5,&txdata,1,999);
HAL_SPI_Transmit(&hspi5,&txdata,1,999);
HAL_SPI_Transmit(&hspi5,&txdata,1,999);
txdata = 0xff;
HAL_SPI_TransmitReceive(&hspi5,&txdata,&rxdata,1,999);
u1_printf("%x\r\n",rxdata);
temp |= rxdata<<8;
HAL_SPI_TransmitReceive(&hspi5,&txdata,&rxdata,1,999);
u1_printf("%x\r\n",rxdata);
temp |= rxdata;
HAL_GPIO_WritePin(F_CS_GPIO_Port,F_CS_Pin,GPIO_PIN_SET);
if(temp == 0xEF18){
u1_printf("spi ok\r\n");
}
else{
u1_printf("spi error\r\n");
u1_printf("%hx\r\n",temp);
}
}
|