LPC55S69 与 SPI - DMA - 关联或乒乓传输无缘 这件事已经拖得太久了...... 我看过单次 SPI/DMA 传输的示例,这些都能正常工作。 我看过 DMA/链接内存传输的示例,这些都能正常工作。 但没有一个能满足我的要求,我想尽办法也找不到合适的。 我需要一个使用 DMA 的自由运行 SPI TX/RX,既可以是链接配置,也可以是乒乓启动。 这里肯定有人已经做到了这一点,愿意分享一些知识? 到目前为止,我所能做到的最好的方法是为 SPI_DMA 设置一组链接配置,这些配置只执行一次(尽管最后一个链接会返回到第一个链接),然后停止。 更糟糕的是,链接 16 位传输只需一次 8 位传输。 我已经没有办法了,而且很确定我现在正在尝试一些已经失败的事情。 有人吗? 概述 LPC55xx 外设 Re: LPC55S69 Getting nowhere with SPI - DMA - Linked or Ping-Pong transfers 我知道这是个老帖子了,但不管怎样......问题与您的 Tx 传输宽度有关。要配置 fifo,必须是 32 位(16 个数据 + 16 个 cfg),否则 spi 中的所有配置位都是 0,就会出现您遇到的问题。 --格拉 Re: LPC55S69 Getting nowhere with SPI - DMA - Linked or Ping-Pong transfers 你好@IanMcCarthy
我想对延误表示歉意。这些天,我们正在试验一个正常的问题量。真的非常感谢你们的耐心。
关于你的问题,一旦你进行一次手动启动(在调试会话中运行),所有代码都必须无限期运行,来自SPI的SCK必须生成2个以上的脉冲(持续直到你按停止)。请问您使用的是 LPC55S69 SDK 中的哪个示例?您对代码做了哪些修改?这样我就可以在我的板上重现你的代码,看看发生了什么。
非常感谢你们的帮助。如果您有更多问题,请告诉我。
致以最崇高的敬意 巴勃罗-阿瓦洛斯 Re: LPC55S69 Getting nowhere with SPI - DMA - Linked or Ping-Pong transfers 第三次尝试发布更新... 我需要以固定速率持续接收来自从属SPI设备的数据(手动触发不符合要求)。 下面的代码显示了我目前所做的工作,但这只是生成 2 个 SPI 时钟增量,仅此而已。 我想一旦配置了 SPI,就可以配置一组关联的 DMA 描述符,然后手动启动一次,就可以无限期运行,还是我弄错了? 如果有人愿意帮忙,将不胜感激。 srcClock_Hz = EXAMPLE_SPI_MASTER_CLK_FREQ;
SPI_MasterGetDefaultConfig(&masterConfig);
masterConfig.sselNum = (spi_ssel_t)EXAMPLE_SPI_SSEL;
masterConfig.sselPol = (spi_spol_t)EXAMPLE_MASTER_SPI_SPOL;
masterConfig.dataWidth = kSPI_Data8Bits;
masterConfig.baudRate_Bps = 8000;
SPI_MasterInit(EXAMPLE_SPI_MASTER, &masterConfig, srcClock_Hz);
DMA_Init(EXAMPLE_DMA);
// Enable channels
DMA_EnableChannel(EXAMPLE_DMA, EXAMPLE_SPI_MASTER_TX_CHANNEL);
DMA_EnableChannel(EXAMPLE_DMA, EXAMPLE_SPI_MASTER_RX_CHANNEL);
// Set channel priorities
DMA_SetChannelPriority(EXAMPLE_DMA, EXAMPLE_SPI_MASTER_TX_CHANNEL, kDMA_ChannelPriority3);
DMA_SetChannelPriority(EXAMPLE_DMA, EXAMPLE_SPI_MASTER_RX_CHANNEL, kDMA_ChannelPriority2);
// Create channel handles
DMA_CreateHandle(&masterTxHandle, EXAMPLE_DMA, EXAMPLE_SPI_MASTER_TX_CHANNEL);
DMA_CreateHandle(&masterRxHandle, EXAMPLE_DMA, EXAMPLE_SPI_MASTER_RX_CHANNEL);
// Set channel callbacks
DMA_SetCallback(&masterTxHandle, TxCallback, NULL);
DMA_SetCallback(&masterRxHandle, RxCallback, NULL);
DMA_SetupDescriptor(
&dmaTxDescriptors[0],
DMA_CHANNEL_XFER(true, false, true, false, 1, 0, 0, 1),
&masterTxData,
(void *)&SPI7->FIFOWR,
&dmaTxDescriptors[1]);
DMA_SetupDescriptor(
&dmaTxDescriptors[1],
DMA_CHANNEL_XFER(true, false, true, false, 1, 0, 0, 1),
&masterTxData,
(void *)&SPI7->FIFOWR,
&dmaTxDescriptors[2]);
DMA_SetupDescriptor(
&dmaTxDescriptors[2],
DMA_CHANNEL_XFER(true, false, true, false, 1, 0, 0, 1),
&masterTxData,
(void *)&SPI7->FIFOWR,
&dmaTxDescriptors[0]);
DMA_PrepareChannelTransfer(&dmaChannelConfig,
&masterTxData,
(void *)&SPI7->FIFOWR,
DMA_CHANNEL_XFER(true, false, true, false, 1, 0, 0, 1),
kDMA_MemoryToPeripheral,
NULL,
// &dmaChannelTrigger,
&dmaTxDescriptors[0]
);
DMA_SubmitChannelTransfer(&masterTxHandle, &dmaChannelConfig);
DMA_StartTransfer(&masterTxHandle); Re: LPC55S69 Getting nowhere with SPI - DMA - Linked or Ping-Pong transfers 我还没完全理解你的回答,你能再解释一下吗?为什么不保留传输的 uint8_t 宽度? 我还注意到函数 DMA_SetupDescriptor() 的第 3 个和第 4 个输入参数位置不正确。 此外,每个描述符目标地址是否应该将数据重定向到另一个内存位置,而不是全部指向 &masterTxData?
記事全体を表示