machine/rp2040: add basic support for ADC
Signed-off-by: deadprogram <ron@hybridgroup.com>
Этот коммит содержится в:
родитель
42ec3e2469
коммит
9912dd6db1
3 изменённых файлов: 80 добавлений и 4 удалений
|
@ -38,6 +38,12 @@ const (
|
||||||
// Onboard LED
|
// Onboard LED
|
||||||
LED Pin = GP25
|
LED Pin = GP25
|
||||||
|
|
||||||
|
// Analog pins
|
||||||
|
ADC0 = GP26
|
||||||
|
ADC1 = GP27
|
||||||
|
ADC2 = GP28
|
||||||
|
ADC3 = GP29
|
||||||
|
|
||||||
// Onboard crystal oscillator frequency, in MHz.
|
// Onboard crystal oscillator frequency, in MHz.
|
||||||
xoscFreq = 12 // MHz
|
xoscFreq = 12 // MHz
|
||||||
)
|
)
|
||||||
|
|
61
src/machine/machine_rp2040_adc.go
Обычный файл
61
src/machine/machine_rp2040_adc.go
Обычный файл
|
@ -0,0 +1,61 @@
|
||||||
|
// +build rp2040
|
||||||
|
|
||||||
|
package machine
|
||||||
|
|
||||||
|
import (
|
||||||
|
"device/rp"
|
||||||
|
)
|
||||||
|
|
||||||
|
func InitADC() {
|
||||||
|
// reset ADC
|
||||||
|
rp.RESETS.RESET.SetBits(rp.RESETS_RESET_ADC)
|
||||||
|
rp.RESETS.RESET.ClearBits(rp.RESETS_RESET_ADC)
|
||||||
|
for !rp.RESETS.RESET_DONE.HasBits(rp.RESETS_RESET_ADC) {
|
||||||
|
}
|
||||||
|
|
||||||
|
// enable ADC
|
||||||
|
rp.ADC.CS.Set(rp.ADC_CS_EN)
|
||||||
|
|
||||||
|
waitForReady()
|
||||||
|
}
|
||||||
|
|
||||||
|
// Configure configures a ADC pin to be able to be used to read data.
|
||||||
|
func (a ADC) Configure(config ADCConfig) {
|
||||||
|
switch a.Pin {
|
||||||
|
case GP26, GP27, GP28, GP29:
|
||||||
|
a.Pin.Configure(PinConfig{Mode: PinAnalog})
|
||||||
|
default:
|
||||||
|
// invalid ADC
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (a ADC) Get() uint16 {
|
||||||
|
rp.ADC.CS.SetBits(uint32(a.getADCChannel()) << rp.ADC_CS_AINSEL_Pos)
|
||||||
|
rp.ADC.CS.SetBits(rp.ADC_CS_START_ONCE)
|
||||||
|
|
||||||
|
waitForReady()
|
||||||
|
|
||||||
|
// rp2040 uses 12-bit sampling, so scale to 16-bit
|
||||||
|
return uint16(rp.ADC.RESULT.Get() << 4)
|
||||||
|
}
|
||||||
|
|
||||||
|
func waitForReady() {
|
||||||
|
for !rp.ADC.CS.HasBits(rp.ADC_CS_READY) {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (a ADC) getADCChannel() uint8 {
|
||||||
|
switch a.Pin {
|
||||||
|
case GP26:
|
||||||
|
return 0
|
||||||
|
case GP27:
|
||||||
|
return 1
|
||||||
|
case GP28:
|
||||||
|
return 2
|
||||||
|
case GP29:
|
||||||
|
return 3
|
||||||
|
default:
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
}
|
|
@ -66,6 +66,7 @@ const (
|
||||||
PinInput
|
PinInput
|
||||||
PinInputPulldown
|
PinInputPulldown
|
||||||
PinInputPullup
|
PinInputPullup
|
||||||
|
PinAnalog
|
||||||
)
|
)
|
||||||
|
|
||||||
// set drives the pin high
|
// set drives the pin high
|
||||||
|
@ -109,6 +110,11 @@ func (p Pin) pulldown() {
|
||||||
p.padCtrl().ClearBits(rp.PADS_BANK0_GPIO0_PUE)
|
p.padCtrl().ClearBits(rp.PADS_BANK0_GPIO0_PUE)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (p Pin) pulloff() {
|
||||||
|
p.padCtrl().ClearBits(rp.PADS_BANK0_GPIO0_PDE)
|
||||||
|
p.padCtrl().ClearBits(rp.PADS_BANK0_GPIO0_PUE)
|
||||||
|
}
|
||||||
|
|
||||||
// setFunc will set pin function to fn.
|
// setFunc will set pin function to fn.
|
||||||
func (p Pin) setFunc(fn pinFunc) {
|
func (p Pin) setFunc(fn pinFunc) {
|
||||||
// Set input enable, Clear output disable
|
// Set input enable, Clear output disable
|
||||||
|
@ -125,7 +131,6 @@ func (p Pin) init() {
|
||||||
mask := uint32(1) << p
|
mask := uint32(1) << p
|
||||||
rp.SIO.GPIO_OE_CLR.Set(mask)
|
rp.SIO.GPIO_OE_CLR.Set(mask)
|
||||||
p.clr()
|
p.clr()
|
||||||
p.setFunc(fnSIO)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Configure configures the gpio pin as per mode.
|
// Configure configures the gpio pin as per mode.
|
||||||
|
@ -134,15 +139,19 @@ func (p Pin) Configure(config PinConfig) {
|
||||||
mask := uint32(1) << p
|
mask := uint32(1) << p
|
||||||
switch config.Mode {
|
switch config.Mode {
|
||||||
case PinOutput:
|
case PinOutput:
|
||||||
|
p.setFunc(fnSIO)
|
||||||
rp.SIO.GPIO_OE_SET.Set(mask)
|
rp.SIO.GPIO_OE_SET.Set(mask)
|
||||||
case PinInput:
|
case PinInput:
|
||||||
rp.SIO.GPIO_OE_CLR.Set(mask)
|
p.setFunc(fnSIO)
|
||||||
case PinInputPulldown:
|
case PinInputPulldown:
|
||||||
rp.SIO.GPIO_OE_CLR.Set(mask)
|
p.setFunc(fnSIO)
|
||||||
p.pulldown()
|
p.pulldown()
|
||||||
case PinInputPullup:
|
case PinInputPullup:
|
||||||
rp.SIO.GPIO_OE_CLR.Set(mask)
|
p.setFunc(fnSIO)
|
||||||
p.pullup()
|
p.pullup()
|
||||||
|
case PinAnalog:
|
||||||
|
p.setFunc(fnNULL)
|
||||||
|
p.pulloff()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Загрузка…
Создание таблицы
Сослаться в новой задаче