samd51: add support for DAC1
Этот коммит содержится в:
		
							родитель
							
								
									610e7fd16a
								
							
						
					
					
						коммит
						740134197e
					
				
					 1 изменённых файлов: 42 добавлений и 19 удалений
				
			
		|  | @ -1988,10 +1988,12 @@ func EnterBootloader() { | |||
| 
 | ||||
| // DAC on the SAMD51. | ||||
| type DAC struct { | ||||
| 	Channel uint8 | ||||
| } | ||||
| 
 | ||||
| var ( | ||||
| 	DAC0 = DAC{} | ||||
| 	DAC0 = DAC{Channel: 0} | ||||
| 	DAC1 = DAC{Channel: 1} | ||||
| ) | ||||
| 
 | ||||
| // DACConfig placeholder for future expansion. | ||||
|  | @ -2004,43 +2006,64 @@ func (dac DAC) Configure(config DACConfig) { | |||
| 	// Turn on clock for DAC | ||||
| 	sam.MCLK.APBDMASK.SetBits(sam.MCLK_APBDMASK_DAC_) | ||||
| 
 | ||||
| 	// Use Generic Clock Generator 4 as source for DAC. | ||||
| 	sam.GCLK.PCHCTRL[42].Set((sam.GCLK_PCHCTRL_GEN_GCLK4 << sam.GCLK_PCHCTRL_GEN_Pos) | sam.GCLK_PCHCTRL_CHEN) | ||||
| 	for sam.GCLK.SYNCBUSY.HasBits(sam.GCLK_SYNCBUSY_GENCTRL_GCLK4 << sam.GCLK_SYNCBUSY_GENCTRL_Pos) { | ||||
| 	if !sam.GCLK.PCHCTRL[42].HasBits(sam.GCLK_PCHCTRL_CHEN) { | ||||
| 		// Use Generic Clock Generator 4 as source for DAC. | ||||
| 		sam.GCLK.PCHCTRL[42].Set((sam.GCLK_PCHCTRL_GEN_GCLK4 << sam.GCLK_PCHCTRL_GEN_Pos) | sam.GCLK_PCHCTRL_CHEN) | ||||
| 		for sam.GCLK.SYNCBUSY.HasBits(sam.GCLK_SYNCBUSY_GENCTRL_GCLK4 << sam.GCLK_SYNCBUSY_GENCTRL_Pos) { | ||||
| 		} | ||||
| 
 | ||||
| 		// reset DAC | ||||
| 		sam.DAC.CTRLA.Set(sam.DAC_CTRLA_SWRST) | ||||
| 
 | ||||
| 		// wait for reset complete | ||||
| 		for sam.DAC.CTRLA.HasBits(sam.DAC_CTRLA_SWRST) { | ||||
| 		} | ||||
| 		for sam.DAC.SYNCBUSY.HasBits(sam.DAC_SYNCBUSY_SWRST) { | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	// reset DAC | ||||
| 	sam.DAC.CTRLA.Set(sam.DAC_CTRLA_SWRST) | ||||
| 
 | ||||
| 	// wait for reset complete | ||||
| 	for sam.DAC.CTRLA.HasBits(sam.DAC_CTRLA_SWRST) { | ||||
| 	} | ||||
| 	for sam.DAC.SYNCBUSY.HasBits(sam.DAC_SYNCBUSY_SWRST) { | ||||
| 	sam.DAC.CTRLA.ClearBits(sam.DAC_CTRLA_ENABLE) | ||||
| 	for sam.DAC.SYNCBUSY.HasBits(sam.DAC_SYNCBUSY_ENABLE) { | ||||
| 	} | ||||
| 
 | ||||
| 	// enable | ||||
| 	sam.DAC.CTRLB.Set(sam.DAC_CTRLB_REFSEL_VREFPU << sam.DAC_CTRLB_REFSEL_Pos) | ||||
| 	sam.DAC.DACCTRL[0].SetBits((sam.DAC_DACCTRL_CCTRL_CC12M << sam.DAC_DACCTRL_CCTRL_Pos) | sam.DAC_DACCTRL_ENABLE) | ||||
| 	sam.DAC.DACCTRL[dac.Channel].SetBits((sam.DAC_DACCTRL_CCTRL_CC12M << sam.DAC_DACCTRL_CCTRL_Pos) | sam.DAC_DACCTRL_ENABLE) | ||||
| 	sam.DAC.CTRLA.Set(sam.DAC_CTRLA_ENABLE) | ||||
| 
 | ||||
| 	for sam.DAC.SYNCBUSY.HasBits(sam.DAC_SYNCBUSY_ENABLE) { | ||||
| 	} | ||||
| 	for !sam.DAC.STATUS.HasBits(sam.DAC_STATUS_READY0) { | ||||
| 
 | ||||
| 	switch dac.Channel { | ||||
| 	case 0: | ||||
| 		for !sam.DAC.STATUS.HasBits(sam.DAC_STATUS_READY0) { | ||||
| 		} | ||||
| 	default: | ||||
| 		for !sam.DAC.STATUS.HasBits(sam.DAC_STATUS_READY1) { | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| // Set writes a single 16-bit value to the DAC. | ||||
| // Since the ATSAMD51 only has a 12-bit DAC, the passed-in value will be scaled down. | ||||
| func (dac DAC) Set(value uint16) error { | ||||
| 	sam.DAC.DATA[0].Set(value >> 4) | ||||
| 	syncDAC() | ||||
| 	sam.DAC.DATA[dac.Channel].Set(value >> 4) | ||||
| 	dac.syncDAC() | ||||
| 	return nil | ||||
| } | ||||
| 
 | ||||
| func syncDAC() { | ||||
| 	for !sam.DAC.STATUS.HasBits(sam.DAC_STATUS_EOC0) { | ||||
| 	} | ||||
| 	for sam.DAC.SYNCBUSY.HasBits(sam.DAC_SYNCBUSY_DATA0) { | ||||
| func (dac DAC) syncDAC() { | ||||
| 	switch dac.Channel { | ||||
| 	case 0: | ||||
| 		for !sam.DAC.STATUS.HasBits(sam.DAC_STATUS_EOC0) { | ||||
| 		} | ||||
| 		for sam.DAC.SYNCBUSY.HasBits(sam.DAC_SYNCBUSY_DATA0) { | ||||
| 		} | ||||
| 	default: | ||||
| 		for !sam.DAC.STATUS.HasBits(sam.DAC_STATUS_EOC1) { | ||||
| 		} | ||||
| 		for sam.DAC.SYNCBUSY.HasBits(sam.DAC_SYNCBUSY_DATA1) { | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
|  |  | |||
		Загрузка…
	
	Создание таблицы
		
		Сослаться в новой задаче
	
	 sago35
						sago35