Пример передачи 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);
Другие вопросы по тегам