一、SPI通信方式介绍
全双工同步通信:
MOSI,MISO,CLK,NSS/CSN 四线控制。
二、模块特性
1.引脚介绍
● MISO:主设备输入/从设备输出引脚。该引脚在从模式下发送数据,在主模式下接收数据。
● MOSI:主设备输出/从设备输入引脚。该引脚在主模式下发送数据,在从模式下接收数据。
● SCK:串口时钟,作为主设备的输出,从设备的输入
● NSS:下面详细介绍
2.NSS/CSN介绍
NSS/CSN:这是一个可选择的引脚,用来选择主/从设备。它常用于主设备选择从设备的片选引脚。
1.软件控制设备的主/从模式(则设置寄存器SSM位 = 1)
:内部NSS(模块内部)由寄存器SSI位的值决定。若SSI寄存器为1,则为该设备为主模式;若SSI寄存器值为0,则该设备为从模式。
2.硬件控制设备的主/从模式(则设置寄存器SSM位 = 0)
:内部NSS(模块内部)由NSS外部引脚的输入电平决定。若输入高电平,则该设备为主模式;若输入低电平,则该设备为从模式。
3.应用:一般主芯片为主模式,各个外设为从模式的情况:
我们将主芯片SPI模块设置为软件控制的主模式(SSM = 1,SSI=1)。
其他外设默认是由硬件引脚决定主从模式,主芯片通过拉低相应的引脚来选择从设备并将外设设置为从设备模式属性。
3.时钟极性和时钟相位
-
CPOL(时钟极性)位控制:
在没有数据传输时时钟的空闲状态电平,此位对主模式和从模式下的设备都有效。如果CPOL被清’0’,SCK引脚在空闲状态保持低电平;如果CPOL被置’1’,SCK引脚在空闲状态保持高电平。
-
CPHA(时钟相位)位控制:
该位决定了在第几个时钟边沿开始数据采样。如果CPHA位被清‘0’,则在第一个时钟边沿进行数据采样;如果CPHA位置‘1’,则在第二个时钟边沿进行数据采样。
三、SPI通信实验
1.模块初始化
void SPI1_Init(void)
{
RCC->APB2ENR|=1<<2; //PORTA时钟使能
RCC->APB2ENR|=1<<12; //SPI1时钟使能
//这里只针对SPI口初始化
GPIOA->CRL&=0X000FFFFF;
GPIOA->CRL|=0XBBB00000; //PA5/6/7复用推挽输出
GPIOA->ODR|=0X7<<5; //PA5/6/7上拉
SPI1->CR1|=0<<10; //全双工模式
SPI1->CR1|=1<<9; //软件nss管理 SSM =1
SPI1->CR1|=1<<8; //SSI = 1,设置为主模式
SPI1->CR1|=1<<2; //SPI主机
SPI1->CR1|=0<<11; //8bit数据格式
SPI1->CR1&=0xFFFFFFFC; //0xC = 1100 空闲模式下SCK为0 CPOL=0 数据采样从第一个时间边沿开始,CPHA=0
//对SPI1属于APB1的外设.时钟频率最大为36M.
SPI1->CR1|=3<<3; //Fsck=Fpclk1/256
SPI1->CR1|=0<<7; //MSBfirst
SPI1->CR1|=1<<6; //SPI设备使能
//SPI1_ReadWriteByte(0xff);//启动传输
}
2.发送
//SPI1 读写一个字节
//TxData:要写入的字节
//返回值:读取到的字节
u8 SPI1_ReadWriteByte(u8 TxData)
{
u16 retry=0;
while((SPI1->SR&1<<1)==0) //等待发送区空
{
retry++;
if(retry>=0XFFFE)return 0; //超时退出
}
SPI1->DR=TxData; //发送一个byte
retry=0;
while((SPI1->SR&1<<0)==0) //等待接收完一个byte
{
retry++;
if(retry>=0XFFFE)return 0; //超时退出
}
return SPI1->DR; //返回收到的数据
}
3.接收
同发送函数接口一样。因为SPI通信每发送一个byte,必然接收一个byte的消息。因此只需要发送0xFF,读取接收的数据即可获取接收消息。