1、SPI简介

ME32F030支持扩展的 SPI (Serial Peripheral interface)接口,它可以支持标准的 SPI 操作,兼容 4 线的 SSI (SynchronousSerial Interface )。该接口允许多主、从机总线模式,但同一时刻,只有一个主/从机在发送数据。数据传输支持 4 位 到 16 位全双工模式。外设时钟(SPI_PCLK)由系统时钟(system clock)提供,并受控于 SYSAHBCLKDIV 寄存器。主要功能如下:

•支持标准的SPI,兼容4线的SSI

•同步串行通信

•支持主/从机模式

•深度为8帧的先进先出FIFO(First In First Out)缓存器

•每帧数据长度4位到16位

SPI由4个管脚负责通信,分别是:

SCK:同步主机和从机的时钟,由主机输出时钟。

SSEL:片选线,由主机决定使能要通信的从机,同一时间只能选中一个从机。

MISO:主机输入,从机输出数据。

MOSI:从机输入,主机输出数据。

SPI管脚的具体功能如下图所示:

图1

2、SPI寄存器

在单片机的开发过程中,我们可能都用过模拟串口。同理SPI也是可以通过端口来模拟实现的,但是笔者并不推荐这么做。因为SPI外设的SCK主频一般都是M级别以上,通过端口模拟的话,时序要求较高,模拟SPI通信的可靠性不如硬件SPI稳定。因此还是推荐优先使用单片机提供的硬件SPI。ME32F030就有一系列寄存器来实现SPI功能,其包含的寄存器如图所示:

图2

2-1 SPI控制寄存器0

控制寄存器0用来选择总线类型、数据大小、SPI时钟时序类型。实际应用中通常都是按字节为单位传输数据,数据大小选择8位传输即可。这里要注意一下,时钟极性和时钟相性的选择,这个要与SPI从机的时钟的相性和极性相匹配,否则SPI通信会出现数据错位、字节发送失败等情况。

图3

2-2 SPI控制寄存器1

此寄存器控制 SPI 控制器的使能、模式选择等功能。具体见下面的表格。

图4

2-3 SPI数据寄存器

软件可向该寄存器写入要发送的数据,并读取已接收的数据。

写:当状态寄存器中的 TNF 位为 1 (指示 Tx FIFO 未满)时,软件就可以将要在后续帧中发送的数据写入该寄存器。如果 Tx FIFO 先前为空且总线上的 SPI 控制器空闲,则将立即开始发送数据。否则,一旦先前所有的数据都已发送(和接收) ,即会发送写入该寄存器的数据。如果数据长度小于 16 位,则软件必须使写入该寄存器的数据向右对齐。

读:只要状态寄存器中的 RNE 位为 1 (指示 Rx FIFO 未空),软件就可以从该寄存器读取数据。当软件读取该寄存器时, SPI 控制器返回 Rx FIFO 中最早接收到的帧数据。如果数据长度小于 16 位,则使此字段的数据向右对齐,更高阶位用 0 填充。

2-4 SPI状态寄存器

该只读寄存器反映 SPI 控制器的当前状态,并作出相应的操作。

图5

2-5 SPI时钟分频器寄存器

该寄存器用于产生 SPI 时钟频率。 SPI 时钟频率通过对 SPI 外设时钟(SPI_PCLK) 进行分频而取得。。

图6

2-6 SPI中断屏蔽控制寄存器

该寄存器控制是否启用 SPI 控制器中 4 个可能的中断条件。分别是接收溢出中断、接收超时中断、Rx FIFO半满中断、Tx FIFO半满中断。

2-7 SPI原始中断状态寄存器

不论中断屏蔽寄存器是否屏蔽中断,只要出现有效的中断条件,该只读寄存器都会在相应的中断位置包含 1。

图7

2-8 SPI中断寄存器

该寄存器为只读寄存器。当中断条件出现且相应的中断在中断屏蔽寄存器中使能时,该寄存器中对应的位为 1。当出现 SPI 中断时,中断服务程序可读取此寄存器以确定中断的原因,随后进行相应的操作。

图8

2-9 SPI中断清除寄存器

软件可向该只写寄存器相应位写入 1 以清除 SPI 控制器的中断。对应 FIFO 空/满中断,可通过写入或读取相应的 FIFO 清除,或通过清除中断屏蔽寄存器中的相应位将其禁用。

图9

3、SPI驱动函数

在LIB->common->Drivers->Source文件夹内提供有spi.c文件,这个就是spi的库函数文件。笔者对每段函数做了下注释,便于大家理解。

3-1 SPI功能初始化

该函数用于SPI的初始化,首先是对SPI外设时钟使能、复位操作。随后设置SPI时钟主频、选择主机/从机模式、设置数据位宽等操作。

Framemode:工作模式选择,SPI_FRAME 或 SSS_FRAME。

Bitwidth:数据位宽,支持4-16位宽度。

Master:主机/从机模式选择。

Spionlymode:设置时钟相性和时钟极性,支持SPI_MODE0 ~ SPI_MODE3。

Freq:SPI时钟主频

void SPI_Open(uint8_t framemode, uint8_t bitwidth, uint8_t master,               uint8_t spionlymode,uint32_t freq){volatile uint32_t temp=0;//使能SPI时钟SYSCON->SYSAHBCLKCTRL_b.SPI_CLK=1;//复位SPI模块SYSCON->PRESETCTRL_b .SPI_RST_N =0;while(temp++<0x0F);SYSCON->PRESETCTRL_b .SPI_RST_N =1;//设置SPI时钟主频temp=SystemCoreClock/freq;if (temp>255)temp=255;SPI->CPSR_b.CPSDVSR=temp;//选择SPI/SSI模式SPI->CR0_b.FRF=framemode;//设置数据位宽SPI->CR0_b.DSS=bitwidth-1;//选择主机/从机模式if (master==SPI_MASTER)SPI->CR1_b.MS=0;elseSPI->CR1_b.MS=1;//选择SPI的时钟相性 和 时钟极性SPI->CR0_b.CPOL=spionlymode;SPI->CR0_b.CPHA=spionlymode>>1;temp=0;while(temp++<0xFF);//使能SPI片选SPI->CR1_b.SSE=1;return;}

3-2 SPI功能关闭

这个函数用于关闭SPI功能,调用该函数可关闭SPI的时钟。

void SPI_Close(void){               //关闭SPI时钟               SYSCON->SYSAHBCLKCTRL_b.SPI_CLK=0;return;}

3-3 SPI清空FIFO

void SPI_ClearFIFO(void){//等待 TX FIFO 空while(SPI_TX_FIFO_Not_Empty);//清空 RX FIFOSPI->CR1_b.RSFR=1;SPI->CR1_b.RSFR=0;return;}

3-4 SPI读写函数

该函数集合SPI的读和写功能,是实现和SPI外设通信的基本函数。

void SPI_SingleWriteRead(uint16_t *data){//等待 TX FIFO 空while(SPI_TX_FIFO_Not_Empty);//清空 RX FIFOSPI->CR1_b.RSFR=1;SPI->CR1_b.RSFR=0; //SPI->DR=*data; //等待 TX FIFO 空while(SPI_TX_FIFO_Not_Empty); //从 FIFO读取接收数据*data=SPI->DR;return;}

3-5 SPI使能中断

可以使能的中断类型有:接收FIFO满中断、接收FIFO非空中断、接收FIFO半满中断、发送FIFO半空中断。

void SPI_EnableInt(uint8_t inttype){SPI->IMSC |= inttype;return;}

3-6 SPI关闭中断

void SPI_DisableInt(uint8_t inttype){SPI->IMSC &= ~inttype;return;}

3-6 SPI清除中断标志

void SPI_ClrInt(void){SPI->ICR_b.RORIC;}

SPI 读取不同长度 寄存器_敏矽微电子Cortex-M0学习笔记10-SPI通信详解相关推荐

  1. SPI 读取不同长度 寄存器_正点原子Linux第二十七章SPI实验

    1)资料下载:点击资料即可下载 2)对正点原子Linux感兴趣的同学可以加群讨论:935446741 3)关注正点原子公众号,获取最新资料更新 第二十七章SPI实验 同I2C一样,SPI是很常用的通信 ...

  2. SPI 读取不同长度 寄存器_[读书笔记]《计算机科学速成课》—6 寄存器和内存

    上节中介绍的ALU进行计算后得到的结果需要对其进行存储,可能还要进行多个连续操作,这就需要用到计算机内存了.计算机使用的是随机存取存储器(Random Access Memory, RAM),其只能在 ...

  3. java 检查bytebuf长度_Java学习笔记16-Netty缓冲区ByteBuf详解

    Java学习笔记16-Netty缓冲区ByteBuf详解 Netty自己的ByteBuf ByteBuf是为解决ByteBuffer的问题和满足网络应用程序开发人员的日常需求而设计的. JDK Byt ...

  4. wringPi 初始化GPIO 为上拉_敏矽微电子Cortex-M0学习笔记04-GPIO详解及应用实例

    前面我们已经对敏矽微电子的基于cortex m0内核的ME32F030R8T6的基本功能做了介绍,然后详细讲解了开发环境MDK的安装,pack包的安装,工程的建立及程序的仿真,紧接着讲解了ME32F0 ...

  5. SPI 读取不同长度 寄存器_SPI协议,MCP2515裸机驱动详解

    SPI概述 Serial Peripheral interface 通用串行外围设备接口 是Motorola首先在其MC68HCXX系列处理器上定义的.SPI接口主要应用在 EEPROM,FLASH, ...

  6. vc读取北通手柄按键_《噬血代码》手柄怎么操作 北通手柄按键功能详解

    噬血代码手柄怎么操作?应该很多朋友都还不是很清楚吧,所以呢小编今天给大家带来的就是噬血代码北通手柄按键功能详解,需要的朋友不妨进来看看. 北通手柄按键功能详解 游戏介绍 本作是由<噬神者> ...

  7. vc读取北通手柄按键_噬血代码手柄怎么操作 噬血代码北通手柄按键功能详解-游侠网...

    噬血代码手柄怎么操作?应该很多朋友都还不是很清楚吧,所以呢小编今天给大家带来的就是噬血代码北通手柄按键功能详解,需要的朋友不妨进来看看. 北通手柄按键功能详解 游戏介绍 本作是由<噬神者> ...

  8. mysql之触发器详解_学习笔记之MySQL触发器详解

    触发器是由事件来触发某个操作,这些事件包括INSERT语句,UPDATE语句和DELETE语句 创建触发器 创建只有一个执行语句的触发器 CREATE TRIGGER 触发器名 BEFORE|AFTE ...

  9. cdt规约报文用程序解析_程序员必备的学习笔记《TCP/IP详解(二)》

    把这三个协议放到一起学习是因为这三个协议处于同一层,ARP 协议用来找到目标主机的 Ethernet 网卡 Mac 地址,IP 则承载要发 送的消息.数据链路层可以从 ARP 得到数据的传送信息,而从 ...

最新文章

  1. 三星Exynos芯片只卖魅族?或是高通所致
  2. java6.2免费下载_jasperreports(Java开源报表系统)
  3. Ocelot + IdentityServer4 构建 GateWay
  4. 一张图探秘施耐德电气全生命周期服务的无限可能
  5. Android 如何实现带滚动条的TextView,在更新文字时自动滚动到最后一行
  6. 1023 组个最小数 (20 分)(c语言)
  7. 用Windows Live Writer 2012发博客
  8. 分布式与人工智能课程(part10)--图像库的基本使用
  9. Asp.Net Core下的开源任务调度平台ScheduleMaster
  10. html dom 修改,HTML DOM - 修改
  11. JDK自带工具keytool的使用
  12. BAT算法工程师的成长之路,超详细的学习路线
  13. GIS基础(3)火星坐标系?
  14. MATLAB实现遥感图像分类——K均值算法
  15. 代码何须全部自己写,融云守护程序猿发际线
  16. Mac操作系统下怎么显示隐藏文件
  17. 生产者-消费者-管程法(java代码示例)
  18. 回溯算法 允许重复选择元素的组合
  19. win8.1CPU使用率过高、卡顿、破音问题整理
  20. java发送带图片的邮件代码

热门文章

  1. 我的世界 - ComputerCraft: Tweaked [CC:T] 模组入门教程 (1) - 概述
  2. mysql纯数字用什么类型_用幸运数字起名美到极致,个性又独特,你的幸运数字是什么?...
  3. (附源码)计算机毕业设计ssm二手图书回收销售网站
  4. M401a armbian下安装cups共享打印机
  5. [Revit教程]斑马:如何自学Revit#S002
  6. Frenet坐标系下横纵向轨迹决策规划(SL投影及ST投影)及Apollo决策算法解析
  7. 读书笔记(python)--图及其算法
  8. 拉格朗日乘数法 对y的偏导数的推导 (有点牵强,作为理解吧)
  9. Tomcat8:java.lang.IllegalArgumentException: 为此cookie指定的域[.xxx.com]无效
  10. 各类会议分析(Conference、workshop等,转载)