目录

SPI接口原理

SPI内部结构简明图

SPI 主要特点

SPI工作过程

时钟信号的相位和极性

数据帧格式

SPI引脚配置

SPI初始化函数

程序配置过程


SPI:串行外围设备接口

mini板SPI引脚:PA4-PA8

SPI接口原理

SPI是一种高速的,全双工, 同步的通信总线,并且在芯片的管脚上只占用四根线,节约了芯片的管脚,同时为 PCB 的布局 上节省空间,提供方便

SPI内部结构简明图

SPI 接口一般使用 4 条线通信:

MISO 主设备数据输入,从设备数据输出。

MOSI 主设备数据输出,从设备数据输入。

SCLK 时钟信号,由主设备产生。

CS 从设备片选信号,由主设备控制。

SPI 主要特点

可以同时发出和接收串行数据;可以当作主机或从机工作;提供频率可 编程时钟;发送结束中断标志;写冲突保护;总线竞争保护等。

SPI工作过程

1.硬件上为4根线

2。主机和从机都有一个串行移位寄存器,主机通过向它的SPI串行寄存器写入一个字节来发起一次传输。

3.串行移位寄存器通过MOSI信号线将字节传送给从机,从机也将自己的串行移位寄存器中的内容通过MISO信号线返回给主机。这样,两个移位寄存器中的内容就被交换。

4.外设的写操作和读操作是同步完成的。如果只进行写操作,主机只需忽略接收到的字节;反之,若主机要读取从机的个字节,就必须发送一个空字节来引发从机的传输。

简单理解:一个过程后主从机移位寄存器内数据交换

时钟信号的相位和极性

SPI_CR寄存器的CPOL和CPHA位,能够组合成四种可能的时序关系。CPOL(时钟极性)位控制 在没有数据传输时时钟的空闲状态电平,此位对主模式和从模式下的设备都有效。如果CPOL被 清’0’,SCK引脚在空闲状态保持低电平;如果CPOL被置’1’,SCK引脚在空闲状态保持高电平。 如果CPHA(时钟相位)位被置’1’,SCK时钟的第二个边沿(CPOL位为0时就是下降沿,CPOL位 为’1’时就是上升沿)进行数据位的采样,数据在第二个时钟边沿被锁存。如果CPHA位被清’0’, SCK时钟的第一边沿(CPOL位为’0’时就是下降沿,CPOL位为’1’时就是上升沿)进行数据位采 样,数据在第一个时钟边沿被锁存。

CPOL时钟极性和CPHA时钟相位的组合选择数据捕捉的时钟边沿。 图212显示了SPI传输的4种CPHA和CPOL位组合。此图可以解释为主设备和从设备的SCK脚、 MISO脚、MOSI脚直接连接的主或从时序图。

数据帧格式

根据SPI_CR1寄存器中的LSBFIRST位,输出数据位时可以MSB在先也可以LSB在先。 根据SPI_CR1寄存器的DFF位,每个数据帧可以是8位或是16位。所选择的数据帧格式对发送和 /或接收都有效。

SPI引脚配置

STM32 SPI接口可配置为支持SPI协议或者支持12S音频协议,默认是SPI模式。可以通过软件切换到I2S方式。

SPI初始化函数

void SPI1_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA| RCC_APB2Periph_SPI1, ENABLE ); //①GPIO,SPI 时钟使能
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); GPIO_SetBits(GPIOA,GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7); //①初始化 GPIO SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex; //设置 SPI 全双工 SPI_InitStructure.SPI_Mode = SPI_Mode_Master; //设置 SPI 工作模式:设置为主 SPI SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b; // 8 位帧结构
SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;//选择了串行时钟的稳态:时钟悬空高
SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge; //数据捕获于第二个时钟沿
SPI_InitStructure.SPI_NSS = SPI_NSS_Soft; //NSS 信号由硬件管理
SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256; //预分频 256
SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; //数据传输从 MSB 位开始
SPI_InitStructure.SPI_CRCPolynomial = 7; //CRC 值计算的多项式
SPI_Init(SPI1, &SPI_InitStructure); //②根据指定的参数初始化外设 SPIx 寄存器
SPI_Cmd(SPI1, ENABLE); //③使能 SPI 外设
SPI1_ReadWriteByte(0xff);/ /④启动传输
} 

程序配置过程

①配置相关引脚的复用功能,使能SPlx时钟

void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct),

②初始化SPIx,设置SPIx工作模式

void SPI_Init(SPI_ TypeDef* SPIx, SPI_Init TypeDef* SPI InitStruct);

③使能SPIx

void SPI_Cmd(SPI_TypeDef* SPlx, FunctionalState NewState),

④SPI传输数据

void SPI_12S_SendData(SPI_TypeDef* SPIx, uint16_t Data);

uint16_t SPI_/2S_ReceiveData(SPI TypeDef* SPIx)

⑤查看SPI传输状态

SPI_/2S_GetFlagStatus(SPI2, SPI /2S FLAG_RXNE);

SPI接口与原理配置相关推荐

  1. PIC单片机SPI接口配置

    一般所有单片机的SPI接口都需要配置以下几点内容(CPU作为SPI主模式): 1.引脚功能/方向配置:标准SPI接口由4根线组成,SCK,MISO(SDI),MOSI(SDO),SS(CS),其中SC ...

  2. 基于Verilog的SPI接口设计

    SPI接口电路的学习 1.SPI接口电路原理 SPI, Serial Perripheral Interface, 串行外围设备接口, 是Motorola 公司推出的一种同步串行接口技术. SPI 总 ...

  3. STM32——SPI接口原理与配置

    一.SPI接口简介 SPI是英语Serial Peripheral Interface的缩写,顾名思义就是串行外围设备接口,是Motoroal首先在其MC68HCXX系列处理器上定义的. SPI是一种 ...

  4. SPI接口原理与配置

    SPI 是英语Serial Peripheral interface的缩写,顾名思义就是串行外围设备接口.是Motorola首先在其MC68HCXX系列处理器上定义的. SPI,是一种高速的,全双工, ...

  5. 高通APQ8074 spi 接口配置

    高通APQ8074 spi 接口配置 8074 平台含有两个BLSP(BAM Low-Speed Peripheral) , 每一个BLSP含有两个QUP, 每一个QUP可以被配置为I2C, SPI, ...

  6. 基于FPGA实现SPI接口(配置或通信)

    基于FPGA实现SPI接口(配置或通信总线) 1)总线简介 串行外设接口(SPI)是微控制器(FPGA)和外围IC(如传感器.ADC.DAC.移位寄存器.SRAM等)之间使用最广泛的接口之一.主要用于 ...

  7. SPI接口的FPGA实现(二)——配置DAC

    这一篇主要结合DAC81416的datasheet来进一步阐述如何配置DAC.先附上DAC81416的datasheet的链接. 一.datasheet概述 如果自己不做电路板,DAC81416的da ...

  8. SPI、I2C、UART三种串行总线协议的区别和SPI接口介绍(转)

    SPI.I2C.UART三种串行总线协议的区别 第一个区别当然是名字: SPI(Serial Peripheral Interface:串行外设接口); I2C(INTER IC BUS) UART( ...

  9. SPI接口的MISO和MOSI连接时注意

    经常遇到一些朋友,在设计SPI主机和从机的逻辑互联时,会习惯性地仿照UART上的TXD和RXD交叉连接,而将SPI主机的MISO和从机的MOSI进行逻辑连接,SPI主机的MOSI和从机的MISO进行逻 ...

最新文章

  1. 委托、lamda表达式..委托概念-匿名函数-泛型委托-Lamda表达式-多播委托
  2. Spring 注解 @Resource和@Autowired(转)
  3. XCODE 所有DeviceSupport
  4. 【算法】梯度消失与梯度爆炸
  5. python瀑布图怎么做_教你用Python创建瀑布图
  6. SpringAMQP--消息转换器
  7. 不学好css模型的怎么入山门?师傅与徒弟的真实独白
  8. 【nyoj-456】 邮票分你一半 (dp,0-1背包的中点问题)
  9. json数据解析_shell从入门到放弃解析json数据(2)
  10. ExtJs 设置GridPanel表格文本垂直居中
  11. Opencv图像二值化操作
  12. 铂电阻测温电路c语言程序,pt100检测电路,Pt100铂电阻测温电路经验
  13. 如何进入bios设置U盘启动的教程,如何在bios设置u盘启动项
  14. 近景摄影测量空间后方交会python
  15. 运行删除指定文件库rimraf
  16. 我上了一节小学AI课,发现四年级的小朋友不仅懂AI,还学会了写代码运行
  17. IDEA中出现Connection refused: connect问题的解决方法
  18. Android开发——RelativeLayout.LayoutParams的使用
  19. hive的引擎mapreduce、tez和spark三者比较
  20. 决策树实现及调参的R与python方法对比——以泰坦尼克幸存者数据为例

热门文章

  1. 06 pandas回顾 文件的读取read_excel、索引与切片(loc、iloc)、过滤、删除、级联、映射、排序、分组 的详细例子
  2. Win8.1系统“Windows 套接字初始化失败”解决方案
  3. 【转载】清华差生10年奋斗经历:各种反省各种彻悟
  4. Java API——容器(二)Queue
  5. 环信IM SDK使用(二):环信SDK初始化及注册和登录
  6. 黑金AX301开发板学习(1)——流水灯实验及黑金AX301开发板资料
  7. 大数据mysql 更换密码_解决重置Mysql root用户账号密码问题
  8. java facets_elasticsearch__3__java操作之Facets 数据分组统计处理
  9. 读书与读人生-《如何阅读一本书》的优秀读后感2300字
  10. 异常检测的N种方法,这次全都盘出来了