spi的学习总结
spi的原理
spi是一个全双工模式,同步的通讯模式。
通讯包括一个主设备(master)和多个从设备(slave)。spi的读写操作都是由主设备发起,通过片选信号选择从设备
spi的信号线:
spi的数据发送接受
spi主机和从机都会有一个串行移位寄存器,主机通过向它的移位寄存器写入一个数据来发起数据传送。
SPI严格来说,只有主从模式之分,外设的读写是同时进行的。主机如果要读一个数据,就必须发送一个数据来引起从机的传输
简单来说就是发一个数据 ,必然会接受到一个数据.反之亦然
spi的时序图
CPOL决定空闲状态的电平.
CPHA决定在一个周期的第几个边沿采样.
spi工作模式:
CPOL=0 CPHA=0 上升沿
CPOL=0 CPHA=1 下降沿
CPOL=1 CPHA=0 下降沿
CPOL=1 CPHA=1 上升沿
具体采用什么模式根据芯片手册和实际情况
spi的使用
stm32cubemx
Frame Format: 决定移位时从高位开始,还是低位
NSS Signal Type: 是硬件片选还是软件片选
使用前建议先封装
1.参数定义
unsigned char rx_data[32] = {0};
unsigned char tx_data[32] = {0};
2.封装
8位的读取
uint8_t read8(unsigned char reg)
{
uint8_t value;
tx_data[0] = reg;
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_RESET);
HAL_SPI_TransmitReceive(&hspi1, tx_data, rx_data, 2, 0x10);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_SET);
value = rx_data[1];
return value;
}
16位的读取
uint16_t read16(unsigned char reg)
{
uint16_t value;
tx_data[0] = reg;
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_RESET);
HAL_SPI_TransmitReceive(&hspi1, tx_data, rx_data, 3, 0x10);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_SET);
value = (rx_data[1]<<8) + rx_data[2];
return value;
}
注:本文的读取函数封装是基于BMP280气压传感器.在从BMP280得到数据时需要先发送reg存储寄存器的地址.返回第一个字节是spi寄存器的值,所以取tx_data[1].
- 所以要对spi有进一步了解,可以查阅spi的芯片手册.