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

Вопросы по samc21

Привет. 

По контроллеру Samc21 нет вообще ни какой информации предлагаю  сделать разбор его функционала. 

Ссылка на даташит. 

Вот пытаюсь настроить запуск ацп через event system от таймера TCC0. 

По пути встречаю подводные камни. 

Вопрос что за параметр в Event User m ---> Bits 7:0 – CHANNEL[7:0] ?

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


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

1107 страниц с картинками на "нет вообще ни какой информации" никак не тянет (атмел скрытностью никогда не отличался).

стр.475 "Эти биты используются для выбора канала"... чёрт чтение документации online вслух, во-первых, не педагогично, а во-вторых, со времён ФИДО... ну вы поняли ;-)

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


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

Вот написал драйвер для связи adc с dma а он не работает. 

	
   static DmacDescriptor dmadescr  __attribute__((aligned(16))) SECTION_DMAC_DESCRIPTOR;
   static DmacDescriptor wrtbck __attribute__((aligned(16))) SECTION_DMAC_DESCRIPTOR;

    GCLK->PCHCTRL[33].reg = GCLK_PCHCTRL_GEN_GCLK0 | GCLK_PCHCTRL_CHEN;
	while (0 == GCLK->PCHCTRL[33].bit.CHEN);
	MCLK->APBCMASK.bit.ADC0_ = 1;
	
	ADC0->CTRLA.reg               =    0x00;
	while(       ADC0->SYNCBUSY.reg       );
	ADC0->CTRLB.reg = ADC_CTRLB_PRESCALER_DIV4;
	ADC0->REFCTRL.reg = ADC_REFCTRL_REFSEL(ADC_REFCTRL_REFSEL_INTREF_Val);
	ADC0->EVCTRL.reg = ADC_EVCTRL_STARTEI | ADC_EVCTRL_RESRDYEO;
	
	ADC0->INTENSET.reg = ADC_INTENSET_RESRDY;
	ADC0->INPUTCTRL.reg = ADC_INPUTCTRL_MUXPOS(ADC_INPUTCTRL_MUXPOS_AIN4_Val) | ADC_INPUTCTRL_MUXNEG(0x19);
	
	ADC0->CTRLC.reg = 0x00;
	
	ADC0->AVGCTRL.reg = ADC_AVGCTRL_ADJRES(0) | ADC_AVGCTRL_SAMPLENUM(ADC_AVGCTRL_SAMPLENUM_1_Val);
	
	ADC0->SAMPCTRL.reg = ADC_SAMPCTRL_SAMPLEN(0x3);
	
	//ADC0->GAINCORR.reg = 
	
    NVIC_SetPriority(ADC0_IRQn, 3);
	NVIC_EnableIRQ(ADC0_IRQn);
	
	ADC0->CTRLA.reg = ADC_CTRLA_ENABLE; 
	while( ADC0->SYNCBUSY.reg & ADC_SYNCBUSY_ENABLE );
	
	/************************************************************************/
	/*                            DMA                                       */
	/************************************************************************/
	
	uint32_t temp_CHCTRLB_reg;

	MCLK->AHBMASK.bit.DMAC_ = 1;

    DMAC->CTRL.reg &= ~DMAC_CTRL_DMAENABLE;
	DMAC->CTRL.reg = DMAC_CTRL_SWRST;

	temp_CHCTRLB_reg = DMAC_CHCTRLB_EVIE | DMAC_CHCTRLB_EVACT(DMAC_CHCTRLB_EVACT_TRIG_Val);
	temp_CHCTRLB_reg |= DMAC_CHCTRLB_TRIGSRC(ADC0_DMAC_ID_RESRDY);
	temp_CHCTRLB_reg |= DMAC_CHCTRLB_TRIGACT(DMAC_CHCTRLB_TRIGACT_BEAT_Val);
	temp_CHCTRLB_reg |= DMAC_CHCTRLB_CMD(DMAC_CHCTRLB_CMD_RESUME_Val);
	
	dmadescr.BTCTRL.reg = DMAC_BTCTRL_BEATSIZE(DMAC_BTCTRL_BEATSIZE_HWORD_Val) | DMAC_BTCTRL_STEPSIZE(DMAC_BTCTRL_STEPSIZE_X1) | DMAC_BTCTRL_STEPSEL_DST | DMAC_BTCTRL_DSTINC | DMAC_BTCTRL_VALID;

	dmadescr.BTCNT.reg = DMAC_BTCNT_BTCNT(4);
	dmadescr.SRCADDR.reg =	(uint32_t) &ADC0->RESULT.reg;	
	dmadescr.DSTADDR.reg =	(uint32_t) &adcresult;	
	dmadescr.DESCADDR.reg = 0 ;		
	
	DMAC->BASEADDR.reg = (uint32_t) &dmadescr;
	DMAC->WRBADDR.reg = (uint32_t)	&wrtbck;
	DMAC->CTRL.reg = DMAC_CTRL_DMAENABLE | DMAC_CTRL_LVLEN(0xf);

	DMAC->CHID.reg = DMAC_CHID_ID(0);
	DMAC->CHCTRLA.reg &= ~DMAC_CHCTRLA_ENABLE;
	DMAC->CHCTRLA.reg = DMAC_CHCTRLA_SWRST;

	DMAC->CHID.reg = DMAC_CHID_ID(0);
	DMAC->SWTRIGCTRL.reg &= (uint32_t)(~(1 <<0));

	DMAC->CHCTRLB.reg = temp_CHCTRLB_reg;
	
	DMAC->CHID.reg = DMAC_CHID_ID(0);
	DMAC->CHINTENSET.reg = DMAC_CHINTENSET_TERR | DMAC_CHINTENSET_TCMPL | DMAC_CHINTENSET_SUSP;
	DMAC->CHCTRLA.reg |= DMAC_CHCTRLA_ENABLE;
	NVIC_SetPriority(DMAC_IRQn, 3);
	NVIC_EnableIRQ(DMAC_IRQn);
	
	GCLK->PCHCTRL[7].reg = GCLK_PCHCTRL_GEN_GCLK0 | GCLK_PCHCTRL_CHEN;
	while (0 == GCLK->PCHCTRL[7].bit.CHEN);
	EVSYS->USER[5].reg = EVSYS_USER_CHANNEL(1);
	EVSYS->CHANNEL[1].reg = EVSYS_CHANNEL_PATH(EVSYS_CHANNEL_PATH_SYNCHRONOUS_Val) | EVSYS_CHANNEL_EVGEN(EVSYS_ID_GEN_ADC0_RESRDY) | EVSYS_CHANNEL_EDGSEL(EVSYS_CHANNEL_EDGSEL_RISING_EDGE_Val);

Не вызывается вектор прерывания dma. 

Может кто подскажет в чем проблема?

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


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

Если есть инкремент в назначении или источнике, то нужно модифицировать адрес, 

dmadescr.BTCNT.reg = DMAC_BTCNT_BTCNT(4);

будет недостаточно, нужно еще сделать:

dmadescr.DSTADDR.reg =	(uint32_t) &adcresult;
descriptor.DSTADDR.reg += 4 * sizeof(uint16_t);

В даташите стоит:

DSTADDR[31:0] Transfer Destination Address
This bit group holds the destination address corresponding to the last beat transfer address in the block transfer.

 

Уж не знаю, зачем они это сделали, но у меня работает.

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


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

Да, и чтобы два раза тему не открывать, у меня тут тоже проблемка нарисовалась с ADC.

Раньше я всегда использовал только ADC0, теперь стало необходимо опрашивать несколько каналов с ADC0, а ADC1 запускать на конвертацию сразу целого блока по DMA. Все вроде бы хорошо, но выяснилось, что теперь при обращении к ADC0, когда я меняю канал измерения, код виснет на ранее совершенно безопасной строчке.

  /**< Disable ADC */
  channel->CTRLA.bit.ENABLE = 0;
  while (channel->SYNCBUSY.reg & ADC_SYNCBUSY_ENABLE);
  /**< Set channel */
  channel->INPUTCTRL.bit.MUXPOS = input;
  /**< Enable ADC */
  channel->CTRLA.bit.ENABLE = 1;
  while (channel->SYNCBUSY.reg & ADC_SYNCBUSY_ENABLE);
  /**< Reset ready flag */
  channel->INTFLAG.reg |= ADC_INTFLAG_RESRDY;
  /**< Start conversion */
  channel->SWTRIG.bit.START = 1;

Строчка эта: 

Quote

while (channel->SYNCBUSY.reg & ADC_SYNCBUSY_ENABLE)

Отладчик показывает, что в SYNCBUSY бит ENABLE больше не сбрасывается. Если отключить ADC1, то все работает нормально.

Очень странно, что одна инстанция так влияет на другую. Вроде бы в эррате ничего про подобные коллизии нет. Если вдруг кто имеет объяснение этому поведению - буду рад послушать.

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


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

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

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

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

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

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

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

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

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

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