V_M_Luck 0 26 февраля, 2009 Опубликовано 26 февраля, 2009 · Жалоба Необходимо запустить 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 0 26 февраля, 2009 Опубликовано 26 февраля, 2009 · Жалоба Продолжая разбираться получил следующее: если сделать Flow Controller - SSP, то DMA идет. Но в этом случае не отслеживается колличество принятых байт, а мне бы этого хотелось. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Flexz 0 27 февраля, 2009 Опубликовано 27 февраля, 2009 · Жалоба 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. Остальные устройства не поддерживают необходимые команды. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
V_M_Luck 0 27 февраля, 2009 Опубликовано 27 февраля, 2009 · Жалоба Спасибо, сейчас попробую. По поводу что флоу котроллером периферию можно назначать только для USB., то в доках сказано, что только USB умеет выставлять "Last burst and last single requests", т.е. корректно завершать передачу по DMA. С SSP то же все работает, но там не очень очевидно отслеживается конец. Я запускал передачу по SSP по DMA, так что бы дождаться конца приема по DMA, нужно было дождаться окончания работы канала DMA на отправку, а потом еще и ожидать опустошения FIFO и регистра DR SSP. Спасибо брат!!! :a14: :beer: ЗАРАБОТАЛО! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться