目录
1、SPI简介
2、SPI时序单元
2.1 模式0(应用最多)
2.2 模式1
2.3 模式2
模式2与模式0类似,区别在于CPOL=1,SCK初始为高电平,其他完全一致
2.4 模式3
模式3与模式1类似,区别在于CPOL=1,SCK初始为高电平,其他完全一致
3、SPI移位示意图
4、简单软件SPI代码(HAL库)
①软件SPI
#include "stm32f1xx_hal.h" // Device header
#include "MySPI.h"
/*引脚配置层*/
#define SPI_SS_PORT GPIOB
#define SPI_SS_PIN GPIO_PIN_9
#define SPI_SCK_PORT GPIOA
#define SPI_SCK_PIN GPIO_PIN_5
#define SPI_MOSI_PORT GPIOA
#define SPI_MOSI_PIN GPIO_PIN_7
#define SPI_MISO_PORT GPIOA
#define SPI_MISO_PIN GPIO_PIN_6
/**
* 函 数:SPI写SS引脚电平
* 参 数:BitValue 协议层传入的当前需要写入SS的电平,范围0~1
* 返 回 值:无
* 注意事项:此函数需要用户实现内容,当BitValue为0时,需要置SS为低电平,当BitValue为1时,需要置SS为高电平
*/
void MySPI_W_SS(uint8_t BitValue)
{
HAL_GPIO_WritePin(SPI_SS_PORT, GPIO_PIN_9, (GPIO_PinState)BitValue); //根据BitValue,设置SS引脚的电平
}
/**
* 函 数:SPI写SCK引脚电平
* 参 数:BitValue 协议层传入的当前需要写入SCK的电平,范围0~1
* 返 回 值:无
* 注意事项:此函数需要用户实现内容,当BitValue为0时,需要置SCK为低电平,当BitValue为1时,需要置SCK为高电平
*/
void MySPI_W_SCK(uint8_t BitValue)
{
HAL_GPIO_WritePin(SPI_SCK_PORT, SPI_SCK_PIN, (GPIO_PinState)BitValue); //根据BitValue,设置SCK引脚的电平
}
/**
* 函 数:SPI写MOSI引脚电平
* 参 数:BitValue 协议层传入的当前需要写入MOSI的电平,范围0~0xFF
* 返 回 值:无
* 注意事项:此函数需要用户实现内容,当BitValue为0时,需要置MOSI为低电平,当BitValue非0时,需要置MOSI为高电平
*/
void MySPI_W_MOSI(uint8_t BitValue)
{
HAL_GPIO_WritePin(SPI_MOSI_PORT, GPIO_PIN_7, (GPIO_PinState)BitValue); //根据BitValue,设置MOSI引脚的电平,BitValue要实现非0即1的特性
}
/**
* 函 数:I2C读MISO引脚电平
* 参 数:无
* 返 回 值:协议层需要得到的当前MISO的电平,范围0~1
* 注意事项:此函数需要用户实现内容,当前MISO为低电平时,返回0,当前MISO为高电平时,返回1