我试图利用GPDMA控制器来访问SSP1通道。使用CMSIS库这应该是全面的。但我在SSP1输出时看不到任何东西。

作为我想要发送一个字节的第一个例子。

uint8_t buffer[20] = { 0x9F };

int main(void)
{
  // ... using PINSEL_ConfigPin to configure the SSP1 pins...

  // configure SSP
  SSP_CFG_Type ssp_config;
  ssp_config.Databit = SSP_DATABIT_8;
  ssp_config.CPHA = SSP_CPHA_SECOND;
  ssp_config.CPOL = SSP_CPOL_LO;
  ssp_config.Mode = SSP_MASTER_MODE;
  ssp_config.FrameFormat = SSP_FRAME_SPI;
  ssp_config.ClockRate = 4500000;

  SSP_Init(LPC_SSP1, &ssp_config);
  SSP_Cmd(LPC_SSP1, ENABLE);

  // configure GPDMA
  GPDMA_Channel_CFG_Type dma_config;

  dma_config.ChannelNum = GPDMA_CONN_SSP1_Tx;
  dma_config.TransferSize = 1;                   // <-- (A)
  dma_config.TransferWidth = 0; // M2M only
  dma_config.SrcMemAddr = (uint32_t)&buffer[0];
  dma_config.DstMemAddr = 0;
  dma_config.TransferType = GPDMA_TRANSFERTYPE_M2P;
  dma_config.SrcConn = 0;
  dma_config.DstConn = GPDMA_CONN_SSP1_Tx;
  dma_config.DMALLI = 0;

  Status status = GPDMA_Setup(&dma_config);

  // (B) this was just a try
  LPC_SC->DMAREQSEL |= (1 << dma_config.DstConn);

  // now start DMA
  GPDMA_ChannelCmd(4, ENABLE);
}
.

注释: (a)我变化尺寸:0,1,20,几个值没有变化 (b)CMSIS实现始终重置DMAREQSEL寄存器中的位。由于我认为必须设置,我添加了这一行。但结果不会改变。

当我使用直接读取/写入的SSP轮询函数时,我可以在逻辑分析仪上看到传输。但使用GPDMA时,没有任何反应。这种方法有什么问题?

在那里有一个工作实例吗?

有帮助吗?

解决方案

安装程序不完整。虽然DMA准备转移SSP接口必须启用DMA访问。

此行在函数结束之前使其工作:

SSP_DMACmd(LPC_SSP1, SSP_DMA_TX, ENABLE);
.

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top