0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

MindSDK应用基础—SPI模块样例简介

灵动MM32MCU 来源:灵动MM32MCU 2023-08-10 17:14 次阅读

引言

MindSDK为MM32主流的微控制器,实现了一系列SPI驱动的样例工程。本文通过讲解 SPI 模块的样例工程,介绍 SPI 模块的功能和用法。关于 SPI 模块对应的驱动程序,以及 SPI 外设模块硬件的实现细节,可具体查阅 MindSDK 工程的源文件,以及 MM32 微控制器(例如MM32F5270)的用户手册。

样例工程

MindSDK 中为 SPI 驱动设计的样例工程包括:

spi_master_basic

spi_master_tx_dma

spi_master_xfer_dma

spi_master_b2b_interrupt

spi_master_b2b_polling

spi_slave_b2b_interrupt

其中,spi_master_basic、spi_master_tx_dma 与 spi_master_xfer_dma 分别演示了 SPI 做主机的典型数据传输方式,包括:基础数据传输、SPI 使用 DMA 发送数据、SPI 使用 DMA 收发数据。另外,还有一些 SPI 板级通信的样例,通过将一块 SPI 做主机,另一块 SPI 做从机的方式进行一系列板对板的基础数据传输,主机样例与从机样例结合使用,包括:SPI做主机进行中断数据传输,SPI做主机进行轮询数据传输,SPI做从机进行中断数据传输(SPI从机引脚与SPI主机引脚相连进行数据传输)。

spi_master_basic

spi_master_basic 描述了 SPI 模块最基本的数据传输方式,轮询方式。在样例工程中,通过 SPI_InitMaster() 函数,配置 SPI 为主模式,选定一个 SPI 数据采样时序,为空闲时时钟线为低电平、下降沿时数据有效的 SPI_PolPha_Alt0 ,并指定传输数据宽度为 SPI_DataWidth_8b 、SPI 的波特率为 BOARD_LOOP_SPI_BAUDRATE ,选定 SPI 的传输方向为 SPI_XferMode_TxRx 。然后,通过 SPI_Enable() 函数启动 SPI,使 SPI 能够进行数据传输。

每当 SPI 发送缓冲区未满时,可进行数据发送,数据由 MOSI 引脚传出;当 SPI 接收缓冲区接收有效数据时,可读取有效的接收数据。

在最终运行程序时,需要将 SPI 的 MOSI 引脚与 MISO 引脚使用杜邦线相连,通过向 PC 机上的串口通信终端输入任意按键,使 SPI 进行 APP_SPI_BUFF_LEN 次数据发送并接收到数据,主循环对接收数据和发送数据进行验证,若存在验证失败数据,则可看到串口打印出错信息 spi loopback xfer error. app_spi_xfer_err_count = ,若验证成功,则可看到串口打印 spi loopback xfer done. ,从而验证 SPI 做主机的数据轮询传输情况。

spi_master_tx_dma

spi_master_tx_dma 相较于 spi_master_basic 样例工程,实现通过 DMA 进行 SPI 的数据发送功能。

其实现原理,是在 spi_master_basic 的基础上,增加对于 DMA 的初始化,通过 DMA_InitChannel() 函数,选定所使用的 DMA 通道为 BOARD_SPI_TX_DMA_CHANNEL ,配置 DMA 数据搬运方向为存储器到外设 DMA_XferMode_MemoryToPeriph ,数据宽度为 DMA_XferWidth_8b ,通过 SPI_GetTxDataRegAddr() 函数获取外设地址并进行配置,设定存储器地址为 (uint32_t)app_spi_tx_buf ,外设地址自增模式为不自增 DMA_AddrIncMode_StayAfterXfer ,存储器地址自增模式为 DMA_AddrIncMode_IncAfterXfer。然后,启用选定 SPI 外设的 DMA 发送通道对应的 NVIC 中断。最后,通过 DMA_EnableChannelInterrupts()函数,在 BOARD_SPI_TX_DMA_CHANNEL 通道使能 DMA_CHN_INT_XFER_DONE 中断,每次在 DMA_EnableChannel() 启动 DMA 数据传输后,DMA 传输完成时,会触发中断。

实际运行程序时,将 SPI 的 MOSI 引脚与 MISO 引脚使用杜邦线相连后,用户在串口调试终端中每次输入任意字符,程序均会调用一次 DMA_EnableChannel() 函数,启动 DMA 传输,在 SPI 进行一次 DMA 传输并完成后,DMA 输标志位`app_dma_xfer_done`将在中断处理函数中被设置为true,主程序循环等待,当标志位为 true 时,打印 spi tx dma xfer done. 到串口终端界面。

spi_master_xfer_dma

spi_master_xfer_dma 相较于 spi_master_tx_dma 样例工程,实现通过 DMA 进行 SPI 的数据收发功能。

其实现原理,是在 spi_master_tx_dma 的基础上,增加对于 SPI 使用 DMA 接收通道的初始化,选定使用的 SPI DMA 接收通道为 BOARD_SPI_RX_DMA_CHANNEL ,在初始化 DMA 发送通道后,继续使用 DMA_InitChannel() 函数初始化 DMA 接收通道,修改传输方向为 DMA_XferMode_PeriphToMemory ,设定存储器地址为 (uint32_t)app_spi_rx_buf ,通过 SPI_GetRxDataRegAddr() 函数获取外设地址并配置。然后启用选定 SPI 外设的 DMA 接收通道对应的 NVIC 中断。最后,在 BOARD_SPI_RX_DMA_CHANNEL 通道使能 DMA_CHN_INT_XFER_DONE 中断,每次在 DMA_EnableChannel() 启动 DMA 数据传输后,当 DMA 传输完成,会触发对应通道的中断。

实际运行时,将 SPI 的 MOSI 引脚与 MISO 引脚使用杜邦线相连后,用户在串口调试终端中每次输入任意字符,程序均会调用一次 DMA_EnableChannel() 函数,启动 DMA 的发送与接收通道,在 SPI 进行一次 DMA 发送并完成后,DMA 发送完成标志位 app_dma_tx_done 将在发送通道所对应的中断处理函数中被设置为 true,再进行 SPI 的 DMA 接收操作,DMA 接收数据完成后,DMA 接收完成标志位 app_dma_rx_done 将在接收通道所对应的中断处理函数中被设置为 true,主程序循环等待,当发送完成标志位为 true 时,打印 spi tx dma done. 到串口终端界面,当接收完成标志位未 true 时,打印 spi rx dma done with data: 以及接收数据到串口终端界面。

spi_master_b2b_interrupt

spi_master_b2b_interrupt 实现的是一个使用 SPI 主模式中断传输的样例工程,在主从机的从属关系中做主机,需与从机结合使用。

其实现原理,是在 spi_master_basic 的基础上,增加 SPI 传输所使用的结构体,通过 SPI_EnableInterrupts() 函数使能发送完成中断 SPI_INT_TX_DONE 与接收完成中断 SPI_INT_RX_DONE 中断,当发送或接收数据完成时,产生对应中断,在中断处理函数中,传输次数达到所设定的 rx_idx 或 tx_idx ,将通过 SPI_EnableInterrupts() 函数关闭对应的接收完成中断或发送完成中断,接收完成后调用 spi_rx_done_callback() 回调函数,并将全局标志位 app_spi_xfer_flag 置为true。

实际运行此程序时,需令一块开发板下载此样例工程,另一块开发板下载 spi_slave_b2b_interrupt 样例工程,使用杜邦线连接两开发板的 MOSI、MISO、NSS、SCK 引脚,通过串口终端界面输入任意按键,进行 SPI 的数据收发,串口终端打印发送数据与接收数据。

spi_master_b2b_polling

spi_master_b2b_polling 实现的是一个使用 SPI 主模式轮询传输的样例工程,在主从机的从属关系中做主机,需与从机结合使用。

该实现原理与 spi_master_basic 基本相同,通过 while 循环等待当前达到发送或接收数据所需的传输条件,达到后进行数据收发,设定发送 APP_SPI_BUF_LEN 个数据并接收。

实际运行此程序时,需令一块开发板下载此样例工程,另一块开发板下载 spi_slave_b2b_interrupt 样例工程,使用杜邦线连接两开发板的 MOSI、MISO、NSS、SCK 引脚,通过串口终端界面输入任意按键,进行 SPI 的数据收发,串口终端打印发送数据与接收数据。

spi_slave_b2b_interrupt

spi_slave_b2b_interrupt 实现的是一个使用 SPI 从模式中断的样例工程,在主从机的从属关系中做从机,需与主机结合使用。

在样例工程中,通过 SPI_InitSlave() 函数配置 SPI 为从模式,设置传输方向为 SPI_XferMode_TxRx ,SPI 从机的数据采样时序需要与主机的数据采样时序配置相同,为 SPI_PolPha_Alt0 ,设定数据宽度为 SPI_DataWidth_8b 。通过 SPI_EnableInterrupts() 函数使能 SPI_INT_RX_DONE 中断,并启用选定 SPI 外设对应的 NVIC 中断。最后,启动 SPI,SPI 作为从机,等待主机的命令。当 SPI 接收完成数据后,产生接收完成中断,并执行中断处理函数,在中断处理函数中将已接收的数据发送出去。

在最终运行程序时,需令一块开发板下载此样例工程,另一块开发板下载 spi_master_b2b_polling 样例工程或 spi_master_b2b_interrupt 样例工程,使用杜邦线连接两开发板的 MOSI、MISO、NSS、SCK 引脚,在 spi_master_b2b_xxx 工程中对应的串口终端界面下输入任何字符,在 spi_slave_b2b_interrupt 工程中对应的串口终端界面中可以看到对应的内容。






审核编辑:刘清

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 微控制器
    +关注

    关注

    48

    文章

    7423

    浏览量

    150785
  • 存储器
    +关注

    关注

    38

    文章

    7422

    浏览量

    163485
  • 数据传输
    +关注

    关注

    9

    文章

    1779

    浏览量

    64393
  • SPI
    SPI
    +关注

    关注

    17

    文章

    1688

    浏览量

    91153
  • dma
    dma
    +关注

    关注

    3

    文章

    556

    浏览量

    100308

原文标题:灵动微课堂 (第267讲)|MindSDK应用基础——SPI模块样例

文章出处:【微信号:MindMotion-MMCU,微信公众号:灵动MM32MCU】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    基于FPGA的SPI自动发送模块的设计

    基于FPGA的SPI自动发送模块的设计:一、摘要:SPI 接口应用十分广泛,在很多情况下,人们会用软件模拟的方法来产生SPI 时序或是采用带SPI
    发表于 10-04 08:44 25次下载

    SPI、IIC、IIS、UART、SDIO、GPIO 简介

    SPI、IIC、IIS、UART、SDIO、GPIO 简介
    发表于 10-29 17:00 0次下载

    常见总线简介CAN、USART、SPI、SCI等

    常见总线简介,包括CAN、USART、SPI、SCI等
    发表于 11-30 14:08 0次下载

    SPI接口的应用与基于FPGA的SPI自动发送模块设计

    SPI 接口应用十分广泛,在很多情况下,人们会用软件模拟的方法来产生SPI 时序或是采用带SPI 功能模块的MCU。但随着可编程逻辑技术的发展,人们往往需要自己设计简单的
    发表于 10-19 10:33 19次下载
    <b class='flag-5'>SPI</b>接口的应用与基于FPGA的<b class='flag-5'>SPI</b>自动发送<b class='flag-5'>模块</b>设计

    fireflyAIO-3288C主板SPI接口简介

    SPI是一种高速的,全双工,同步串行通信接口,用于连接微控制器、传感器、存储设备等,本文以指纹识别模块简单介绍SPI使用。
    的头像 发表于 12-16 14:11 1199次阅读
    fireflyAIO-3288C主板<b class='flag-5'>SPI</b>接口<b class='flag-5'>简介</b>

    SPI总线接口在OLED模块中的应用详细说明

    针对OLED模块应用中8位数据并行接口占用单片机I/O管脚较多的问题,本文介绍了SPI总线接口在OLED模块中的应用,并以VGG12864L-S002显示模块
    发表于 11-21 16:39 7次下载
    <b class='flag-5'>SPI</b>总线接口在OLED<b class='flag-5'>模块</b>中的应用详细说明

    SPI基础,SPI是怎么的?

    SPI是一种简单的接口,允许一个芯片与一个或多个其他芯片进行通信。 1,SPI是怎么的? 让我们从一个简单的示例开始,其中只有两个芯片必须一起通信。 SPI要求在两个芯片之间使用4条
    的头像 发表于 11-19 18:06 4890次阅读

    SPI Nand Flash简介

    1.SPI Nand Flash简介SPI Nand Flash顾名思义就是串行接口的Nand Flash,它和普通并行的Nand Flash相似,比如:SLC Nand Flash。2.SP
    发表于 12-02 10:51 34次下载
    <b class='flag-5'>SPI</b> Nand Flash<b class='flag-5'>简介</b>

    SPI通信简介

    目录(?)[-]SPI简介SPI特点1采用主-从模式Master-Slave 的控制方式2采用同步方式Synchronous传输数据3数据交换Data Exchanges4 SPI有四
    发表于 12-22 19:14 9次下载
    <b class='flag-5'>SPI</b>通信<b class='flag-5'>简介</b>

    MindSDK概述、使用方法及应用案例

    MindSDK(mm32-mcu-sdk)是由灵动官方的软件团队开发和维护的基于灵动微控制器的软件开发平台。
    的头像 发表于 08-12 09:10 1311次阅读

    MindSDK中FlexCAN驱动程序及工程

    和MM32F0140微控制器,其中就有FlexCAN外设模块的驱动程序以及工程,以及对CAN总线通信协议CANopen的适配工程。本文将介绍MindSDK中FlexCAN驱动程序及
    的头像 发表于 06-23 15:41 1126次阅读
    <b class='flag-5'>MindSDK</b>中FlexCAN驱动程序及<b class='flag-5'>样</b><b class='flag-5'>例</b>工程

    MindSDK应用基础—TIM模块

    MindSDK为MM32使用星辰处理器内核的系列微控制器,实现了一组TIM工程,MindSDK中的TIM模块对应硬件定时器TIM外设。
    的头像 发表于 06-29 17:16 801次阅读

    MindSDK为MM32实现了一组TIM工程

    MindSDK为MM32使用星辰处理器内核的系列微控制器,实现了一组TIM工程,MindSDK中的TIM模块对应硬件定时器TIM外设。
    的头像 发表于 06-30 17:32 851次阅读

    MindSDK应用基础—ADC模块

    MindSDK为MM32主流的微控制器,实现了一组ADC工程。本文通过讲解ADC模块
    的头像 发表于 08-17 17:16 882次阅读

    MindSDK应用基础——TIM模块

    MindSDK应用基础——TIM模块
    的头像 发表于 10-25 16:25 525次阅读