引言
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 工程中对应的串口终端界面中可以看到对应的内容。
雷曼光电打造专属超高清裸眼3D震撼视效
博泰车联网成功入选“2023世界物联网大奖-年度杰出企业”
对于新手而言,该如何去正确选择航模电池
亚太天能科技T55X指纹锁介绍
Sepic电路的参数计算及仿真
MindSDK应用基础—SPI模块样例简介
华为p50折叠屏参数配置 支持5G吗
3Glasses运用VR技术普及安全常识 防患于未然
RK1808嵌入式芯片参数介绍
调查显示:55%的美国人担心政府通过电子设备来追踪
教育软件购买指南
硕盟type-c转HDMI+VGA+USB3.0+PD3.0
三星电子和Xilinx推出赛灵思 Spartan-6 FPG
微软承诺:接下来会对Windows 10的体验进行提升,减少一些Bug
又一里程碑!中科驭数点亮首颗国产DPU芯片 业内生态伙伴热烈寄语
直播回顾|基于Klocwork的静态测试管理平台应用
用人工智能个性化治疗_让医学诊断更准确
全球内存模组厂排名出炉 AMD正式公布了RDNA架构白皮书
艾迈斯助力无线耳塞实现聆听体验重大突破
手术机器人备受欢迎 前景未来可期