Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Вопрос по DMA на str911
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
V_M_Luck
Необходимо запустить 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. Не работает. Что не так?
V_M_Luck
Продолжая разбираться получил следующее: если сделать Flow Controller - SSP, то DMA идет. Но в этом случае не отслеживается колличество принятых байт, а мне бы этого хотелось.
Flexz
Cимптомы похожи на мое ковыряние с DMA и UART (проц правда 912FW). Я тогда так до конца и не разобрался в чем именно было дело, (возможно, в последовательности заполнения регистра управления) но помогл отказ от STшных функций. В итоге настройка DMA на прием выглядит так:
CODE
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
;

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

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. Остальные устройства не поддерживают необходимые команды.
V_M_Luck
Спасибо, сейчас попробую.
По поводу
Цитата
что флоу котроллером периферию можно назначать только для USB.
, то в доках сказано, что только USB умеет выставлять "Last burst and last single requests", т.е. корректно завершать передачу по DMA. С SSP то же все работает, но там не очень очевидно отслеживается конец. Я запускал передачу по SSP по DMA, так что бы дождаться конца приема по DMA, нужно было дождаться окончания работы канала DMA на отправку, а потом еще и ожидать опустошения FIFO и регистра DR SSP.

Спасибо брат!!! a14.gif beer.gif
ЗАРАБОТАЛО!
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.