Jump to content

    
Sign in to follow this  
kostyan1

SAM3U чтение SSC через DMAC

Recommended Posts

Народ, подкиньте пожалуйста пример ЧТЕНИЯ из SSC через DMAC, если у кого есть. :blink:

В поставке иара идет пример, но он на запись. Пробовал его на чтение приспособить - ну никак не получается. По прерыванию ацп ADS1274 читать получается, но хотелось бы таки через DMA.

Share this post


Link to post
Share on other sites

Пример настройки:

typedef struct DMA_DSCR
{
void				*saddr;
void				*daddr;
u_int				ctrla;
u_int				ctrlb;
struct DMA_DSCR		*dscr;
} DMA_DSCR;


#pragma arm section zidata = "extsram"
__align(4) u_char audio_buffers[AUDIO_BUFFERS][AUDIO_BUFFER_SIZE];
#pragma arm section zidata

DMA_DSCR audio_dscrs[AUDIO_BUFFERS];


//******************************************************************************
//*    

#define	AUDIO_DMA_CTRLA		(AT91C_HDMA_DST_WIDTH_WORD | AT91C_HDMA_SRC_WIDTH_WORD |	\
AT91C_HDMA_DCSIZE_4 | AT91C_HDMA_SCSIZE_1 | (AUDIO_BUFFER_SIZE / 4))
#define	AUDIO_DMA_CTRLB		(AT91C_HDMA_FC_PER2MEM | AT91C_HDMA_SRC_ADDRESS_MODE_FIXED | AT91C_HDMA_SRC_DSCR_FETCH_DISABLE)

void audio_start_dma(void)
{
u_int a;


*AT91C_HDMA_CHDR = AT91C_HDMA_ENA0 << AUDIO_DMA_CH;

for(a = 0; a < AUDIO_BUFFERS; a++)
{
	audio_dscrs[a].saddr = (void *)AT91C_SSC0_RHR;
	audio_dscrs[a].daddr = audio_buffers[a];
	audio_dscrs[a].ctrla = AUDIO_DMA_CTRLA;
	audio_dscrs[a].ctrlb = AUDIO_DMA_CTRLB;
	audio_dscrs[a].dscr = (a == (AUDIO_BUFFERS - 1)) ? &audio_dscrs[0] : &audio_dscrs[a + 1];
}

AT91C_BASE_HDMA->HDMA_CH[AUDIO_DMA_CH].HDMA_SADDR = (u_int)audio_dscrs[AUDIO_BUFFERS - 1].saddr;
AT91C_BASE_HDMA->HDMA_CH[AUDIO_DMA_CH].HDMA_DADDR = (u_int)audio_dscrs[AUDIO_BUFFERS - 1].daddr;
AT91C_BASE_HDMA->HDMA_CH[AUDIO_DMA_CH].HDMA_CTRLA = audio_dscrs[AUDIO_BUFFERS - 1].ctrla;
AT91C_BASE_HDMA->HDMA_CH[AUDIO_DMA_CH].HDMA_CTRLB = audio_dscrs[AUDIO_BUFFERS - 1].ctrlb;
AT91C_BASE_HDMA->HDMA_CH[AUDIO_DMA_CH].HDMA_DSCR = (u_int)audio_dscrs[AUDIO_BUFFERS - 1].dscr;

AT91C_BASE_HDMA->HDMA_CH[AUDIO_DMA_CH].HDMA_CFG = AT91C_HDMA_FIFOCFG_HALFFIFO | AT91C_HDMA_AHB_PROT |
	AT91C_HDMA_SOD | AT91C_HDMA_SRC_H2SEL_HW | SSC_RX_DMA_IF_NUM;

*AT91C_HDMA_EBCIER = (AT91C_HDMA_BTC0 << AUDIO_DMA_CH) | (AT91C_HDMA_ERR0 << AUDIO_DMA_CH);

*AT91C_HDMA_CHER = AT91C_HDMA_ENA0 << AUDIO_DMA_CH;
}

Share this post


Link to post
Share on other sites

Однако шведские индусы меня обманули :( По ихнему хедеру работает только нулевой канал DMA.

Не могли бы вы, уважаемый aaarrr, скинуть свой файл, где определено всё это дело AT91C_BASE_HDMA->HDMA_CH, в иаре сиё называется AT91SAM3U4_H?

 

Share this post


Link to post
Share on other sites

Ага спасибо большое. А где взяли файло если не секрет?

 

в моем хедере тупо не было

 

AT91_REG HDMA_SPIP; // HDMA Channel Source Picture in Picture Configuration Register

AT91_REG HDMA_DPIP; // HDMA Channel Destination Picture in Picture Configuration Register

AT91_REG HDMA_BDSCR; // HDMA Reserved

AT91_REG HDMA_CADDR; // HDMA Reserved

 

Оно вообщето таких регистров и в описании на проц нету, я просто заглушку из 4х пустых регистров добавил. Ну и спасибо за код, взял его за основу + поправил хеадер = заработало так как мне нужно.

Share this post


Link to post
Share on other sites
Ага спасибо большое. А где взяли файло если не секрет?

Если ничего не путаю, файл взят из огромного software pack непосредственно у атмела. Но это единственная полезная его часть :)

 

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