mirror of
https://github.com/tinygo-org/drivers.git
synced 2026-08-17 21:23:58 +00:00
add PCA9685 driver
This commit is contained in:
@@ -0,0 +1,69 @@
|
||||
package pca9685
|
||||
|
||||
// Software reset addresses for generic i2c implementation
|
||||
// and PCA specific SWRST. See section 7.6
|
||||
const (
|
||||
I2CSWRSTADR = 0x0
|
||||
PCA9685SWRSTBYTE = 0b0000_0110 // 0x06
|
||||
)
|
||||
|
||||
// Registries with nomenclature as seen in manual
|
||||
const (
|
||||
SUBADR1 uint8 = 0x2
|
||||
SUBADR2 uint8 = 0x3
|
||||
SUBADR3 uint8 = 0x4
|
||||
|
||||
MODE1 uint8 = 0x0
|
||||
MODE2 uint8 = 0x1
|
||||
ALLCALLADR uint8 = 0x05
|
||||
|
||||
SWRESET uint8 = 0b0000_0011
|
||||
|
||||
// Start of LED registries. corresponds to LED0_ON_L register.
|
||||
// Use LED function to get registries of a specific PWM channel register.
|
||||
LEDSTART = 0x06
|
||||
)
|
||||
|
||||
// MODE1
|
||||
const (
|
||||
RESET byte = 0b1000_0000
|
||||
EXTCLK byte = 0b0100_0000
|
||||
AI byte = 0b0010_0000
|
||||
SLEEP byte = 0b0001_0000
|
||||
defaultMODE1Value byte = 0b0001_0001
|
||||
)
|
||||
|
||||
// MODE2
|
||||
const (
|
||||
OUTDRV = 1 << 2
|
||||
INVRT = 1 << 4
|
||||
)
|
||||
|
||||
// LED channels from 0-15. Returns 4 registries associated with
|
||||
// the channel PWM signal. Channel 250 (0xFA) gives ALL_LED registers.
|
||||
// The L suffix represents the 8 LSB of 12 bit timing, the H suffix represents
|
||||
// the 4 MSB of the timing. This way you have 0-4095 timing options. ON or OFF
|
||||
// will be a number between these two or will be simply ON or OFF (fifth bit of H registry).
|
||||
//
|
||||
// The SetPWM implementation in this library does not do phase-shifting so OFF will always
|
||||
// happen at time stamp 0. ON will solely decide duty cycle.
|
||||
func LED(ch uint8) (ONL, ONH, OFFL, OFFH uint8) {
|
||||
switch {
|
||||
case ch == ALLLED:
|
||||
return ALLLED, ALLLED + 1, ALLLED + 2, ALLLED + 3
|
||||
|
||||
case ch > 15:
|
||||
panic("PWM channel out of range [0-15]")
|
||||
default:
|
||||
}
|
||||
// 4 registries per channel. Starts at 6
|
||||
onLReg := LEDSTART + 4*ch
|
||||
return onLReg, onLReg + 1, onLReg + 2, onLReg + 3
|
||||
}
|
||||
|
||||
const (
|
||||
// ALLLED is channel that selects registries to control all leds. Use with function LED
|
||||
ALLLED = 0xfa
|
||||
// PRESCALE Prescaling byte
|
||||
PRESCALE byte = 0xFE
|
||||
)
|
||||
Reference in New Issue
Block a user