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