【经验】灵动MindSDK应用基础——SPI模块样例详解
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 工程中对应的串口终端界面中可以看到对应的内容。
- |
- +1 赞 0
- 收藏
- 评论 0
本文由ll转载自灵动MM32MCU公众号,原文标题为:灵动微课堂 (第267讲)|MindSDK应用基础——SPI模块样例,本站所有转载文章系出于传递更多信息之目的,且明确注明来源,不希望被转载的媒体或个人可与我们联系,我们将立即进行删除处理。
相关推荐
【经验】灵动微电子MM32F0160微控制器开源项目:如何实现一套低成本带RGB灯效的机械键盘
灵动的软件与系统工程SE团队,基于带有 USB 外设模块的 MM32F0160 微控制器,实现了一套低成本带RGB灯效的机械键盘。这里将设计机械键盘的全过程开源出来,感兴趣的开发者,可以向灵动申请 MM32F0160 微控制器的样片,复刻一把自己专属的机械键盘,也可以继续进行二次开发,实现更加有趣的作品。
【经验】单独下载可执行文件到灵动MM32F5系列微控制器的几种简易方法
本文将以下载MicroPython固件文件到灵动MM32F5微控制器为例,总结了几种简单易用的方法,专门针对使用DAP-Link调试器的情况,通过常用图形界面工具,实现单独下载可执行文件的功能。
【经验】如何验证不同Flash对灵动微微控制器执行程序性能的影响
本文通过在QSPI Flash,片内Flash 与片内SRAM中分别运行测试工程Arm CMSIS-DSP FFT、Mbed-TLS RSA1024与Helix MP3 Decoder,获取微控制器性能数据,从而对比在不同Flash位置的执行速度的差异。
MindMotion(灵动微) MCU选型表
32位高性能,高性价比MCU,Core核心有M0、M0+、2XM0、M3、STAR-MC1,Flash存储容量范围 16KB~2048KB,RAM存储容量范围 2KB~128KB,工作电压:1.8~48V,CPU频率(MHz):48~180MHz,GPIO 端口数(个):6~86,LQFP/TSSOP/QFN等多种封装形式。
产品型号
|
品类
|
内核
|
管脚数(个)
|
工作温度(℃)
|
CPU频率(MHz)
|
工作电压(V)
|
GPIO 端口数(个)
|
Flash(KB)
|
SRAM (KB)
|
封装/外壳/尺寸
|
MM32F0163D7PV
|
32位MCU
|
M0
|
64
|
-40℃~105℃
|
96MHz
|
2.0~5.5V
|
57
|
128KB
|
16KB
|
LQFP64
|
选型表 - MindMotion 立即选型
基于灵动MM32F0130微控制器的智能插排方案,实现远程开关控制、定时开关、随时了解家电设备的使用状况
智能插座又可以称为WIFI插座,在普通插座的功能基础上延伸了许多功能,如防雷击,防短路,防过载,防漏电,配合智能手机的APP应用,可以实现远程开关控制、定时开关、随时了解家电设备的使用状况。基于灵动MM32F0130微控制器的插排,具有以下特点:-内置Timer进行解码红外输入-通过串口与云端连接,进行远程控制,以及电量监控等-通过I2C与计量芯片通讯,进行异常检测,过流,过/欠压等保护
MM32F0140 基于 Arm® Cortex®-M0 内核的 32 位微控制器数据手册
型号- MM32F0141B1T,MM32F0141C1T,MM32F0144C4PV,MM32F0144C4QV,MM32F0144C1TV,MM32F0144C4P,MM32F0141B6P,MM32F0144C3N,MM32F0144C4N,MM32F0144C6P,MM32F0140,MM32F0144C6PV,MM32F0144C3NV,MM32F0144C1T,MM32F0141B4Q,MM32F0141C4P,MM32F0141C4Q,MM32F0141C4N,MM32F0141C6P,MM32F0141B3N,MM32F0144C4Q,MM32F0141B4P,MM32F0141C3N
MM32G0001 基于 Arm® Cortex®-M0 内核的 32 位微控制器数据手册
型号- MM32G0001A1T,MM32G0001A6T1V,MM32G0001,MM32G0001A1NV,MM32G0001A6TV,MM32G0001A6T,MM32G0001A6T1,MM32G0001A1TV,MM32G0001A1N
MM32F0160 基于 Arm® Cortex®-M0 内核的 32 位微控制器数据手册
型号- MM32F0163D4QV,MM32F0162DAP,MM32F0163DAP,MM32F0163D7PV,MM32F0163D6PV,MM32F0160,MM32F0162D6P,MM32F0163D6P,MM32F0162D7P,MM32F0163D7P,MM32F0164D3N,MM32F0161D3N,MM32F0162D4Q,MM32F0163D4Q
MM32SPIN0280微控制器精准驱动电动自行车的智能核心
MM32SPIN0280微控制器作为电动自行车的主控单元,提供精确的动力控制、电助动与电驱动功能,同时确保骑行安全,满足现代城市出行的需求
基于微控制器MM32F3270的智能监护仪,实现精准监测与高效护理
MM32F3270微控制器为监护仪提供了从信号采集到数字处理的全方位解决方案,确保了医疗监测的高精度和高效率,助力提高护理工作的智能化水平。
灵动Cortex-M0内核微控制器的自诊断库通过IEC 60730-1及IEC 60335-1认证
灵动股份Arm® Cortex®-M0核心微控制器的自诊断库经必维电子电气检测,证明符合IEC 60730-1 Class B附录H&IEC60335-1附录R的功能安全需求规定,获得了VOC认证证书和测试报告。
MM32F5270 32-bit Microcontrollers based on Arm China STAR-MC1 Data Sheet
型号- MM32F5277E8PV,MM32F5277E7PV,MM32F5277E9PV,MM32F5277,MM32F5270
MM32系列微控制器优化血氧仪性能与用户体验
MM32微控制器的集成LCD控制器和低功耗特性,为便携式血氧仪带来了更优化的性能和更持久的电池寿命,改善了用户的测量体验。
MM32F0020 基于 Arm® Cortex®-M0 内核的 32 位微控制器数据手册
型号- MM32F0020B1NV,MM32F0020,MM32F0020B1T,MM32F0020B1TV,MM32F0020B1N
MM32SPIN0x 32-bit Micro controller based on ARM Cortex M0 Data sheet
型号- MM32SPIN07PF,MM32SPIN0X,MM32SPIN06NT,MM32SPIN05PT,MM32SPIN05TW,MM32SPIN05NTX,MM32,MM32SPIN06,MM32SPIN05
电子商城
现货市场
服务
朗能泛亚提供是德(Keysight),罗德(R&S)等品牌的测试测量仪器维修服务,包括网络分析仪、无线通讯综测仪、信号发生器、频谱分析仪、信号分析仪、电源等仪器维修,支持一台仪器即可维修。
提交需求>
可定制连接器的间距范围1.25mm~4.5mm、单列/双列列数、焊尾/表面贴装/浮动式等安装方式、镀层、针数等参数,插拔寿命达100万次以上。
最小起订量: 1 提交需求>
登录 | 立即注册
提交评论