查看: 524|回复: 0

[原创] RT10xx通过PIT定期触发DMA收发SPI数据

[复制链接]

该用户从未签到

22

主题

50

帖子

0

高级会员

Rank: 4

积分
650
最后登录
2024-4-13
发表于 2023-11-26 10:27:38 | 显示全部楼层 |阅读模式
本帖最后由 lszisgood 于 2023-11-27 16:14 编辑

在Freescale Kinetis MCU,IMX RT10xx的手册上都明确说了支持PIT Periodic DMA Triggering。即,通过PIT周期触发DMA传输。
最近有一实际应用场景:
   RT1052通过LPSPI与外部的ADC芯片通信,周期获取ADC的16-bit采样数据。要求采样频率100KHz,并且时间间隔要精确,否则影响采样效果。如果在Timer中断ISR里启动SPI传输,频繁的中断影响系统效率,受其他高优先级中断打断,不能保证100KHz的精确时间间隔。最好的解决方法是采用PIT定期触发DMA收发SPI数据,不需要CPU的干预。但官方SDK并未提供相关例程,搜索网上也是三言两语含糊不清。为此,我抛砖引玉编写了下面二个例程,并通过了实际测试。

1.     PIT中断直接触发DMA SPI传输。在SDK的lpspi_edma_b2b_transfer_master例程的基础上增加PIT触发DMA的代码。关键代码如下,PIT模块可以触发头四路DMA通路,并且每个PIT通道对应相应的DMAMux请求路由器(60~63)。只有DMA通道的前四路通道(Channel0~3)具有周期触发DMA的功能。
   DMAMUX_EnableAlwaysOn(EXAMPLE_LPSPI_MASTER_DMA_MUX_BASE, 0, true);
   DMAMUX_SetSource(EXAMPLE_LPSPI_MASTER_DMA_MUX_BASE, 0, 60);
   DMAMUX_EnablePeriodTrigger(EXAMPLE_LPSPI_MASTER_DMA_MUX_BASE, 0);
   DMAMUX_EnableChannel(EXAMPLE_LPSPI_MASTER_DMA_MUX_BASE, 0);

PIT启动后,按设定的定时周期触发一次DMA传输。可以在DMA Finished完成中断ISR处理一组ADC数据,并重新设置DMA的收发buffer。

2.     PIT周期触发 DMA memory to peripheral传输。在SDK例程lpspi_interrupt_b2b_master代码基础上,通过PIT DMA定期把数据传输到LPSPIx->TDR寄存器,即PIT DMA代替LPSPI_WriteData( )函数,不需要CPU参与。在lpspi的Rx FiFo满中断ISR中处理一组ADC数据。

上述二个测试例程,PIT定期触发DMA,都不需要CPU参与干涉,高效、精准。

PIT_lpspi_edma_b2b_transfer_master.rar (507.34 KB, 下载次数: 8)

lpspi_edma_b2b_transfer_master.rar

506.63 KB, 下载次数: 6, 下载积分: 威望 1

回复

使用道具 举报

您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /4 下一条

Archiver|手机版|小黑屋|恩智浦技术社区

GMT+8, 2024-4-27 23:07 , Processed in 0.106074 second(s), 19 queries , MemCache On.

Powered by Discuz! X3.4

Copyright © 2001-2024, Tencent Cloud.

快速回复 返回顶部 返回列表