mirror of
https://github.com/tinygo-org/drivers.git
synced 2026-08-12 19:03:42 +00:00
70 lines
1.8 KiB
Go
70 lines
1.8 KiB
Go
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
|
|
)
|