SPI是串行外设接口(Serial Peripheral Interface)的缩写,是Motorola公司推出的一种同步串行接口技术,是一种高速、全双工、同步的通信总线。
今天这篇就分享一下SPI的资料。
1、资料了解:
缺点没有指定的流控制,没有应答机制确认是否接收到数据,所以跟IIC总线协议比较在数据可靠性上有一定的缺陷。
特点(1):高速、同步、全双工、非差分、总线式
(2):主从机通信模式5、SPI电路连接
(1):SPI的通信原理很简单,它以主从方式工作,这种模式通常有一个主设备和一个或多个从设备,有三线制和四线制之分。信号线包括SDI(串行数据输入 Serial Digital IN)、SDO(串行数据输出 Serial Digital OUT)、SCLK(时钟)、CS(片选)。
(2):SDO/MOSI – 主设备数据输出,从设备数据输入
(3):SDI/MISO – 主设备数据输入,从设备数据输
(4):SCLK – 时钟信号,由主设备产生;
(5):CS/SS – 从设备使能信号,由主设备控制。当有多个从设备的时候,因为每个从设备上都有一个片选引脚接入到主设备机中,当主设备和某个从设备通信时将需要将从设备对应的片选引脚电平拉低(一般低有效)。
SPI通信模式分析SPI通信有4种不同的模式,不同的从设备在出厂时配置模式已经固定, 这是不能改变的,但通信双方设备必须工作在同一模式下,所以可以对主设备的SPI模式进行配置,通过CPOL(时钟极性)和CPHA(时钟相位)来控制主设备的通信模式。
2、原理图:
各个引脚连接如下图:
3、代码:
初始化:
QSPI_REGS->QSPI_CTRLA = QSPI_CTRLA_SWRST_Msk;
QSPI_REGS->QSPI_CTRLB = QSPI_CTRLB_MODE_SPI | QSPI_CTRLB_CSMODE_NORELOAD | QSPI_CTRLB_DATALEN(0x0) | QSPI_CTRLB_LOOPEN(0);
QSPI_REGS->QSPI_BAUD = (QSPI_BAUD_BAUD(119)) ;
QSPI_REGS->QSPI_CTRLA = QSPI_CTRLA_ENABLE_Msk;
while((QSPI_REGS->QSPI_STATUS & QSPI_STATUS_ENABLE_Msk) != QSPI_STATUS_ENABLE_Msk)
bool QSPI_WriteRead (void* pTransmitData, size_t txSize, void* pReceiveData, size_t rxSize)
bool QSPI_Write(void* pTransmitData, size_t txSize)
uint8_t config_reg;
appData.isTransferDone = false;
appData.transmitBuffer[0] = APP_CMD_CONFIG_REG_READ;
APP_CS_ENABLE();
appData.isCSDeAssert = true;
QSPI_WriteRead(appData.transmitBuffer, 1, appData.transmitBuffer, (1+1));
while (appData.isTransferDone == false);
config_reg = appData.transmitBuffer[1];
return config_reg;
APP_WriteEnable();
appData.isTransferDone = false;
appData.transmitBuffer[0] = APP_CMD_GLOBAL_BLOCK_PROTECTION_UNLOCK;
APP_CS_ENABLE();
appData.isCSDeAssert = true;
QSPI_Write(appData.transmitBuffer, 1);
while (appData.isTransferDone == false);
本帖最后由 meiyao 于 2023-2-5 17:46 编辑