1405288_zh-CN

cancel
Showing results for 
Show  only  | Search instead for 
Did you mean: 

1405288_zh-CN

1405288_zh-CN

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?

Tags (1)
No ratings
Version history
Last update:
3 weeks ago
Updated by: