我使用 iMX RT1011 Nano 套件
不错的板
我尝试从移位器 0 设置 8 位并行的 EDMA Flexio。
定时器 0 设置为 30MHz,EDMA 发送 512 字节(每个请求 1 字节)
代码:
FLEXIO_DEV->SHIFTCTL[TX_SHIFTER] =
FLEXIO_SHIFTCTL_TIMSEL(WR_TIMER)
| FLEXIO_SHIFTCTL_TIMPOL(0U)
| FLEXIO_SHIFTCTL_PINCFG(3U) /* 输出 */
| FLEXIO_SHIFTCTL_PINSEL(DATA_PIN_START)
| FLEXIO_SHIFTCTL_PINPOL(0U)
| FLEXIO_SHIFTCTL_SMOD(2U); /* 传输 */
/* 定时器0:写保护选通,每字节一个脉冲
* TIMCMP 低字节 = (flexio_clk / (2*wr_clk)) - 1
* TIMCMP[15:8] = (beats*2)-1 = 1,表示每次移位加载一个字节 */
timDiv = (flexioClk_Hz / (2U * wrClock_Hz));
如果 (timDiv != 0U) { timDiv -= 1U; }
timDiv &= 0xFFU;
FLEXIO_DEV->TIMCMP[WR_TIMER] = (1U << 8U) | FLEXIO_DEV->TIMCMP[WR_TIMER] = (1U << 8U) |蒂姆迪夫;
FLEXIO_DEV->TIMCFG[WR_TIMER] =
FLEXIO_TIMCFG_TIMOUT(1U)
| FLEXIO_TIMCFG_TIMDEC(0U)
| FLEXIO_TIMCFG_TIMRST(0U)
| FLEXIO_TIMCFG_TIMDIS(2U) /* 禁用比较 */
| FLEXIO_TIMCFG_TIMENA(2U) /* 高触发时启用 */
| FLEXIO_TIMCFG_TSTOP(0U)
| FLEXIO_TIMCFG_TSTART(0U);
FLEXIO_DEV->TIMCTL[WR_TIMER] =
FLEXIO_TIMCTL_TRGSEL((4U * TX_SHIFTER) + 1U) /* Shifter0 标志 */
| FLEXIO_TIMCTL_TRGPOL(1U) /* 低电平有效 */
| FLEXIO_TIMCTL_TRGSRC(1U) /* 内部 */
| FLEXIO_TIMCTL_PINCFG(3U) /* 输出 */
| FLEXIO_TIMCTL_PINSEL(WR_PIN)
| FLEXIO_TIMCTL_PINPOL(1U) /* WR 低电平有效 */
| FLEXIO_TIMCTL_TIMOD(1U); /* 双 8 位波特率/位 */
/* 启用来自 Shifter0 的 DMA 请求 */
FLEXIO_DEV->SHIFTSDEN |= (1U << TX_SHIFTER);
/* 启用 FlexIO */
FLEXIO_DEV->CTRL |= FLEXIO_CTRL_FLEXEN_MASK;
我在逻辑分析仪上看到了信号。
看起来和我预期的一样,但我在某些 512 包中发现数据缺失。
我的意思是,比如先发送 200 字节,然后停止,之后再发送所有 512 个字节。
扎希
你好@TZAHI ,
非常感谢您对我们产品的关注以及对我们社区的使用。
最有可能的检查方向是:在 30 MHz WR 时钟下,eDMA 能否足够快地持续填充 FlexIO SHIFTBUF。
在当前每次请求传输一个字节的配置下,DMA 请求速率可能会非常高。这对于 eDMA、总线仲裁和 FlexIO SHIFTBUF 重新填充时间来说可能非常紧张。
一个可能的症状是变速箱换挡器运转不畅。请在传输失败后立即检查 SHIFTERR,然后再重新初始化或清除 FlexIO:
如果可能的话,请尝试提高 CPU/总线时钟频率,或者将 WR 时钟频率降低到 30 MHz 以下,例如降低到 20 MHz 或 10 MHz。如果传输在较低的 WR 时钟频率下变得稳定,则强烈表明该问题与 DMA/FlexIO 的重新填充时序有关。
希望对你有帮助
顺祝商祺!
5月