Пример передачи SSP1/GPDMA на Cortex-M3 (LPC1787)
Я пытаюсь использовать контроллер 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, которая непосредственно читает / записывает регистры LPC_SSP1, я вижу передачу в логическом анализаторе. Но ничего не происходит, когда используется GPDMA. Что не так с подходом?
Есть ли рабочий пример там?
1 ответ
Настройка была неполной. Пока DMA готов к передаче, интерфейс SSP должен разрешить доступ DMA.
Эта строка до конца функции заставляет ее работать:
SSP_DMACmd(LPC_SSP1, SSP_DMA_TX, ENABLE);