我尝试利用 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 寄存器中的位。由于我认为必须设置,我添加了这一行。但结果并没有改变。
当我使用直接读取/写入 LPC_SSP1 寄存器的 SSP 轮询功能时,我可以在逻辑分析仪上看到传输。但是当使用 GPDMA 时什么也没有发生。方法有什么问题?
那里有一个可行的例子吗?