SPI协议:全双工 3/4根信号线
SPI 主要特点有:可以同时发出和接收串行数据;可以当作主机或从机工作;提供频率可编程时钟;发送结束中断标志;写冲突保护;总线竞争保护等。
MISO 主设备数据输入,从设备数据输出。(MISO:master input slave output)
MOSI 主设备数据输出,从设备数据输入。(MOSI:master output slave input)
SCLK时钟信号,由主设备产生。(SCLK:serial clock)
CS从设备片选信号,由主设备控制。(CS:chip select)这个一主多从通信的时候才会用到
SPI工作原理
(1)硬件上为4根线。
(2)主机和从机都有一个串行移位寄存器,主机通过向它的SPI串行寄存器写入一个字节来发起一次传输。
(3)串行移位寄存器通过MOSI信号线将字节传送给从机,从机也将自己的串行移位寄存器中的内容通过MISO信号线返回给主机。这样,两个移位寄存器中的内容就被交换。
(4)外设的写操作和读操作是同步完成的。如果只进行写操作,主机只需忽略接收到的字节;反之,若主机要读取从机的一个字节,就必须发送一个空字节来引发从机的传输。
SPI初始化配置
SPI控制器的初始化步骤有以下几步:
(1)使能SPI复用功能所映射的GPIO口时钟。
(2)SPI控制器时钟使能。
(3)配置GPIO为复用功能。(MOSI/MISO/CLK)
(4)GPIO复用功能为第几复用功能(AFx)。
(5)配置GPIO输出速率为50MHz。
(6)配置SPIx->CR1寄存器。
//SPI 口初始化
//这里针是对 SPI1 的初始化
void SPI1_Init(void)
{
u16 tempreg=0;
RCC->AHB1ENR|=1<<0; //使能 PORTA 时钟
RCC->APB2ENR|=1<<12; //SPI1 时钟使能
GPIO_Set(GPIOB,7<<3,GPIO_MODE_AF,GPIO_OTYPE_PP,GPIO_SPEED_100M,
GPIO_PUPD_PU); //PB3~5 复用功能输出
GPIO_AF_Set(GPIOB,3,5); //PB3,AF5
GPIO_AF_Set(GPIOB,4,5); //PB4,AF5
GPIO_AF_Set(GPIOB,5,5); //PB5,AF5
//这里只针对 SPI 口初始化
RCC->APB2RSTR|=1<<12; //复位 SPI1
RCC->APB2RSTR&=~(1<<12);//停止复位 SPI1
tempreg|=0<<10; //全双工模式
tempreg|=