我是靠谱客的博主 顺利咖啡,最近开发中收集的这篇文章主要介绍SWM32系列教程8--SPI及其应用,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

SPI接口是非常常用的一种数字外设,SWM32S单片机有2个SPI接口,其特点如下:

  • 全双工串行同步收发

  • 可编程时钟极性和相位

  • 支持 MASTER 模式和 SLAVE 模式

  • MASTER 模式下最高传输速度支持主时钟 4 分频

  • 数据宽度支持 4BIT 至 16BIT

  • 具备深度为 8 的接收和发送 FIFO

基本功能都有,中规中矩,8字节的收发FIFO算是一个亮点。

端口配置

配置SPI之前,首先要配置一下端口,这里使用P22作为CS引脚, P23为SCLK引脚,P18为MOSI引脚,P19为MISO。程序如下,

GPIO_Init(GPIOP, PIN22, 1, 0, 0);//SPI_CS
  PORT_Init(PORTP, PIN23, FUNMUX1_SPI0_SCLK, 0);
  PORT_Init(PORTP, PIN18, FUNMUX0_SPI0_MOSI, 0);
  PORT_Init(PORTP, PIN19, FUNMUX1_SPI0_MISO, 1);

该单片机的端口映射相对比较灵活,具体介绍可参考GPIO和端口映射部分的教程:

SWM32系列教程3-时钟配置和GPIO

SWM32系列教程4-端口映射及串口应用

SPI配置

端口配置完后需要配置SPI的一些参数,与大部分单片机的方式差不多,程序如下:

SPI_InitStructure SPI_initStruct;


  SPI_initStruct.clkDiv = SPI_CLKDIV_8;
  SPI_initStruct.FrameFormat = SPI_FORMAT_SPI;
  SPI_initStruct.SampleEdge = SPI_FIRST_EDGE;
  SPI_initStruct.IdleLevel = SPI_LOW_LEVEL;
  SPI_initStruct.WordSize = 8;
  SPI_initStruct.Master = 1;
  SPI_initStruct.RXHFullIEn = 0;
  SPI_initStruct.TXEmptyIEn = 0;
  SPI_initStruct.TXCompleteIEn = 0;
  SPI_Init(SPI0, &SPI_initStruct);


  SPI_Open(SPI0);

SPI结构体的定义如下:

typedef struct {
  uint8_t  FrameFormat;  //帧格式:SPI_FORMAT_SPI、SPI_FORMAT_TI_SSI
  uint8_t  SampleEdge;  //在SPI帧格式下,选择数据采样边沿:SPI_FIRST_EDGE、SPI_SECOND_EDGE
  uint8_t  IdleLevel;    //在SPI帧格式下,选择空闲时(无数据传输时)时钟线的电平:SPI_LOW_LEVEL、SPI_HIGH_LEVEL
  uint8_t  WordSize;    //字长度, 有效值4-16
  uint8_t  Master;    //1 主机模式    0 从机模式
  uint8_t  clkDiv;    //SPI_CLK = SYS_CLK / clkDiv,有效值:SPI_CLKDIV_4、SPI_CLKDIV_8、... ... 、SPI_CLKDIV_512


  uint8_t  RXHFullIEn;  //接收FIFO半满中断使能
  uint8_t  TXEmptyIEn;  //发送FIFO  空中断使能
  uint8_t  TXCompleteIEn;  //发送FIFO  空且发送移位寄存器空中断使能
} SPI_InitStructure;

可以看到,这里有三个中断源:

  • 接收FIFO半满中断使能

  • 发送FIFO空中断

  • 发送完成(即FIFO空且发送移位寄存器空)中断

中断的使用方式与串口类似,可以参考串口部分介绍。

SWM32系列教程4-端口映射及串口应用

SPI一般在传输大量数据时才会使用中断。由于SPI其本身接口速率就比较高,在传输少量数据时,频繁中断不会提高多少效率。

SPI读写数据时,直接调用下面这个库函数即可:

uint32_t SPI_ReadWrite(SPI_TypeDef * SPIx, uint32_t data)
{
  SPIx->DATA = data;
  while(!(SPIx->STAT & SPI_STAT_RFNE_Msk));
  return SPIx->DATA;
}

下面这个例程是SPI读写W25Qxx的程序,仅供参考。

链接:https://pan.baidu.com/s/1b-6IK8_Zx8qqrWcylMc0RQ?pwd=bscu

提取码:bscu

推荐阅读:

不会写Bootloader?看这里,现成的!

盘点一些国产“有特点”的单片机

CMSIS是什么,你了解吗?

四位数显表头设计

   欢迎关注公众号"嵌入式技术开发",大家可以后台给我留言沟通交流。如果觉得该公众号对你有所帮助,也欢迎推荐分享给其他人。

最后

以上就是顺利咖啡为你收集整理的SWM32系列教程8--SPI及其应用的全部内容,希望文章能够帮你解决SWM32系列教程8--SPI及其应用所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(49)

评论列表共有 0 条评论

立即
投稿
返回
顶部