Jump to content

    
Sign in to follow this  
V_M_Luck

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

Recommended Posts

Необходимо запустить 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. Не работает. Что не так?

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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. Остальные устройства не поддерживают необходимые команды.

Share this post


Link to post
Share on other sites

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

По поводу

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

 

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

ЗАРАБОТАЛО!

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this