Перейти к содержанию
    

Вопрос по DMA на str911

Необходимо запустить dma на SSP на прием данных.

str911faw44, настройка SSP:

SSP_DeInit(SSP0);
SSP_InitStructure.SSP_FrameFormat = SSP_FrameFormat_Motorola;    
SSP_InitStructure.SSP_Mode = SSP_Mode_Master;
SSP_InitStructure.SSP_CPOL = SSP_CPOL_High;
SSP_InitStructure.SSP_CPHA = SSP_CPHA_2Edge;
SSP_InitStructure.SSP_DataSize = SSP_DataSize_8b;                                 
SSP_InitStructure.SSP_ClockPrescaler = 4;
SSP_InitStructure.SSP_ClockRate = 59; 
SSP_Init(SSP0, &SSP_InitStructure);
SSP_DMACmd(SSP0, SSP_DMA_Transmit, ENABLE);
SSP_DMACmd(SSP0, SSP_DMA_Receive, ENABLE);
SSP_Cmd(SSP0,  ENABLE);

настройка DMA:

DMA_DeInit();                         
DMA_Cmd(ENABLE);
DMA_StructInit(&DMA_InitStruct);
DMA_InitStruct.DMA_Channel_LLstItm=0; 
DMA_InitStruct.DMA_Channel_SrcAdd=(u32)((&SSP0->DR));
DMA_InitStruct.DMA_Channel_DesAdd=(u32)(rdata);
DMA_InitStruct.DMA_Channel_SrcWidth= DMA_SrcWidth_Byte;
DMA_InitStruct.DMA_Channel_DesWidth= DMA_DesWidth_Byte; 
DMA_InitStruct.DMA_Channel_FlowCntrl= DMA_FlowCntrl2_DMA;
DMA_InitStruct.DMA_Channel_Src = DMA_SRC_SSP0_RX;
DMA_InitStruct.DMA_Channel_TrsfSize =9;
DMA_ChannelDESIncConfig (DMA_Channel2, ENABLE);
DMA_Init(DMA_Channel2,&DMA_InitStruct); 
DMA_ChannelCmd (DMA_Channel2,ENABLE);

далее передаю по SSP 9 байт и смотрю что в приемном буфере.

А там ничего. Для определения окончания приема использую опрос регистра TCRISR. Не работает. Что не так?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Продолжая разбираться получил следующее: если сделать Flow Controller - SSP, то DMA идет. Но в этом случае не отслеживается колличество принятых байт, а мне бы этого хотелось.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Cимптомы похожи на мое ковыряние с DMA и UART (проц правда 912FW). Я тогда так до конца и не разобрался в чем именно было дело, (возможно, в последовательности заполнения регистра управления) но помогл отказ от STшных функций. В итоге настройка DMA на прием выглядит так:

	DMA_Channel_RX->CCNF = DMA_FlowCntrl2_DMA | C328_UART_SRC_RX | DMA_ITMask_ITC;
DMA_Channel_RX->SRC = (u32)(&C328_UART->DR);
DMA_Channel_RX->CC = DMA_DesWidth_Byte | DMA_SrcWidth_Byte |
    				DMA_DesBst_1Data | DMA_SrcBst_1Data |
    				DMA_ChannelDESInc
    				//| 0x80000000 | length
    				;

а запуск приема так:

void	startDMAuartRX(DMA_Channel_TypeDef *DMA_ChannelX, char *dst, unsigned short length)
{
DMA_ChannelCmd (DMA_ChannelX,DISABLE);

DMA_ChannelX->DES = (u32)dst;
DMA_ChannelX->LLI = 0;

DMA_ChannelX->CC |= 0x80000000 | length;
DMA_ChannelCmd (DMA_ChannelX,ENABLE);
return;
}

C328_UART_SRC_RX - DMA_SRC_UART1_RX

C328_UART - UART1

0x80000000 - активация прерывания.

По поводу SSP как флоу контроллера - в доках явно указано, что флоу котроллером периферию можно назначать только для USB. Остальные устройства не поддерживают необходимые команды.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Спасибо, сейчас попробую.

По поводу

что флоу котроллером периферию можно назначать только для USB.
, то в доках сказано, что только USB умеет выставлять "Last burst and last single requests", т.е. корректно завершать передачу по DMA. С SSP то же все работает, но там не очень очевидно отслеживается конец. Я запускал передачу по SSP по DMA, так что бы дождаться конца приема по DMA, нужно было дождаться окончания работы канала DMA на отправку, а потом еще и ожидать опустошения FIFO и регистра DR SSP.

 

Спасибо брат!!! :a14: :beer:

ЗАРАБОТАЛО!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...