SPI

mac2022-06-30  117

涉及寄存器: “控制寄存器CR1”:SPI 模式、波特率、LSB先行、主从模式、单双向模式、数据帧长度等等 控制时钟信号、CPOL位(时钟极性:0空闲SCL为低,1空闲SCL为高)、CPHA位(时钟相位:0第一个边沿采 集信号,1第二个边沿采集信号)。 “状态寄存器(SR)”:读取状态寄存器相关寄存器位,就可以了解SPI的工作状态了。如发送完一帧数据的时候,“状态寄存器SR”中的“TXE标志位”会被置 1 ,表示传输完一帧,类似当接收完一帧的时候,“RXNE标志位”会被置 1 ,表示传输完一帧。 MOSI和MISO都连接到数据移位寄存器上,通过写SPI的“数据寄存器DR”把数据填充到发送F缓冲区中,通讯读“数据寄存器DR”可以获取接受缓冲区的内容。其中数据帧长度可以通过“控制寄存器CR1”的“DFF”位配置成8位及16位模式;配置“LSBFIRST位”可选择MSB先行(高位数据在前)还是LSB先行(低位数据在前)。

SPI:串行外围设备接口 高速、全双工、同步的通信总线。 在芯片的管教上占四根线。 硬件连接:

四根线:

SDO -主设备数据输出,从设备数据输入 对应MOSI(master output slave input)SDI -主设备数据输入,从设备数据输入 对应MISO(master input slave output)SCLK -时钟信号,由主设备产生CS -从设备使能信号,由主设备控制 CS:其中CS是控制芯片是否被选中,也就是说只有片选信号为预先规定的使能信号时(高电位或低电位),对此芯片才有效,这就允许在同一总线上连接多个SPI设备成为可能。 SDI/SDO/SCLK:数据是一位一位的传输。数据输出通过SDO线,数据在时钟上升沿或下降沿时改变,再紧接着的下降沿或上升沿被读取。完成一位数据传输,输入同样道理。这样,在至少8次时钟信号的改变(上沿和下沿为一次),就可以完成8位数据的传输。

注意:SCK信号线只由主设备控制,从设备不能控制信号线。 在点对点的通信中,SPI接口不需要进行寻址操作,且为全双工通信,显得简单高效。在多个设备的系统中,每个从设备需要独立的是使能信号,硬件上比IIC系统要复杂。 SPI接口的一个缺点:没有指定的流控制,没有应答机制确认是否接收到数据。

时序是在SCK的控制下,两个双向移位寄存器进行数据交换。

上升沿发送、下降沿接收、高位先发送。 上升沿到来的时候,SDO上的电平将被发送到从设备的寄存器中。 下降沿到来的时候,SDI上的电平将被接收到主设备的寄存器中。

模式:SPI有四种模式(需要根据从设备的模式进行配置主设备SPI模式)

Mode0: CPOL=0, CPHA=0Mode1: CPOL=0, CPHA=1Mode2: CPOL=1, CPHA=0Mode3: CPOL=1, CPHA=1 时钟极性CPOL用来配置SCLK的电平处于哪种状态是空闲态或有效态。时钟相位CPHA是用来配置数据采样是在第几个边沿。 /*addy by wbf*/ void SPI_INIT2(SPI_TypeDef* SPIx) { if((SPIx==SPI1)||(SPIx==SPI3)) { SPIx->CR1 = 0; SPIx->CR1 |= (0<<15);//四线SPI SPIx->CR1 |= (0<<13);//CRC 禁止 SPIx->CR1 |= (0<<10);//全双工 SPIx->CR1 |= (0<<10);//全双工 // SPIx->CR1 |= (0<<9);//硬件控制使能,SSM // SPIx->CR1 |= (0<<8);//使能电平//SSI SPIx->CR1 |= (1<<9); SPIx->CR1 |= (1<<8); SPIx->CR1 |= (0<<7);//MSB SPIx->CR1 |= (0x04<<3);//速率72/32=2.25 SPIx->CR1 |= (0x01<<2);//master SPIx->CR1 |= (0x00<<1);//cpol SPIx->CR1 |= (0x00);//cpha SPIx->CR2 = 0; SPIx->CR2 |= (0x01<<12); //FIFO深度为8-bit SPIx->CR2 |= (0x07<<8); //数据宽度8 // SPI1->CR2 |= (0x01<<3); //NSSP,NSS产生脉冲 // SPI1->CR2 |= (0x01<<2); //SSOE SPIx->CR1 |= (0x01<<6);//使能 } else if(SPIx==SPI2) { SPIx->CR1 = 0; SPIx->CR1 |= (1<<14);//transmit-only SPIx->CR1 |= (0<<13);//CRC 禁止 SPIx->CR1 |= (1<<9); SPIx->CR1 |= (1<<8); SPIx->CR1 |= (1<<7);//LSB SPIx->CR1 |= (0x04<<3);//速率72/32=2.25 SPIx->CR1 |= (0x01<<2);//master SPIx->CR1 |= (0x00<<1);//cpol SPIx->CR1 |= (0x00);//cpha SPIx->CR2 = 0; SPIx->CR2 |= (0x01<<12); //FIFO深度为8-bit SPIx->CR2 |= (0x07<<8); //数据宽度8 SPIx->CR1 |= (0x01<<6);//使能 } }
最新回复(0)