Disable interrupts before sending ws2812 data

This commit is contained in:
Daniel Bridges
2021-05-30 12:48:08 -07:00
committed by Ron Evans
parent 5645eb3f91
commit 7b565e8cb0
6 changed files with 21 additions and 0 deletions
+4
View File
@@ -7,6 +7,7 @@ package ws2812
import ( import (
"device/avr" "device/avr"
"machine" "machine"
"runtime/interrupt"
) )
// Send a single byte using the WS2812 protocol. // Send a single byte using the WS2812 protocol.
@@ -17,6 +18,7 @@ func (d Device) WriteByte(c byte) error {
// Probably this is about pointer registers, which are very limited on AVR. // Probably this is about pointer registers, which are very limited on AVR.
port, maskSet := d.Pin.PortMaskSet() port, maskSet := d.Pin.PortMaskSet()
_, maskClear := d.Pin.PortMaskClear() _, maskClear := d.Pin.PortMaskClear()
mask := interrupt.Disable()
switch machine.CPUFrequency() { switch machine.CPUFrequency() {
case 16e6: // 16MHz case 16e6: // 16MHz
@@ -51,8 +53,10 @@ func (d Device) WriteByte(c byte) error {
"maskClear": maskClear, "maskClear": maskClear,
"portClear": port, "portClear": port,
}) })
interrupt.Restore(mask)
return nil return nil
default: default:
interrupt.Restore(mask)
return errUnknownClockSpeed return errUnknownClockSpeed
} }
} }
+3
View File
@@ -7,6 +7,7 @@ package ws2812
import ( import (
"device/arm" "device/arm"
"runtime/interrupt"
) )
// Send a single byte using the WS2812 protocol. // Send a single byte using the WS2812 protocol.
@@ -14,6 +15,7 @@ func (d Device) WriteByte(c byte) error {
// For the Cortex-M0 at 16MHz // For the Cortex-M0 at 16MHz
portSet, maskSet := d.Pin.PortMaskSet() portSet, maskSet := d.Pin.PortMaskSet()
portClear, maskClear := d.Pin.PortMaskClear() portClear, maskClear := d.Pin.PortMaskClear()
mask := interrupt.Disable()
// See: // See:
// https://wp.josh.com/2014/05/13/ws2812-neopixels-are-not-so-finicky-once-you-get-to-know-them/ // https://wp.josh.com/2014/05/13/ws2812-neopixels-are-not-so-finicky-once-you-get-to-know-them/
@@ -48,5 +50,6 @@ func (d Device) WriteByte(c byte) error {
"maskClear": maskClear, "maskClear": maskClear,
"portClear": portClear, "portClear": portClear,
}) })
interrupt.Restore(mask)
return nil return nil
} }
+3
View File
@@ -7,6 +7,7 @@ package ws2812
import ( import (
"device/arm" "device/arm"
"runtime/interrupt"
) )
// Send a single byte using the WS2812 protocol. // Send a single byte using the WS2812 protocol.
@@ -14,6 +15,7 @@ func (d Device) WriteByte(c byte) error {
// For the Cortex-M0 at 48MHz // For the Cortex-M0 at 48MHz
portSet, maskSet := d.Pin.PortMaskSet() portSet, maskSet := d.Pin.PortMaskSet()
portClear, maskClear := d.Pin.PortMaskClear() portClear, maskClear := d.Pin.PortMaskClear()
mask := interrupt.Disable()
// See: // See:
// https://wp.josh.com/2014/05/13/ws2812-neopixels-are-not-so-finicky-once-you-get-to-know-them/ // https://wp.josh.com/2014/05/13/ws2812-neopixels-are-not-so-finicky-once-you-get-to-know-them/
@@ -77,5 +79,6 @@ func (d Device) WriteByte(c byte) error {
"maskClear": maskClear, "maskClear": maskClear,
"portClear": portClear, "portClear": portClear,
}) })
interrupt.Restore(mask)
return nil return nil
} }
+3
View File
@@ -8,6 +8,7 @@ package ws2812
import ( import (
"device/arm" "device/arm"
"runtime/interrupt"
) )
// Send a single byte using the WS2812 protocol. // Send a single byte using the WS2812 protocol.
@@ -15,6 +16,7 @@ func (d Device) WriteByte(c byte) error {
// For the Cortex-M4 at 120MHz // For the Cortex-M4 at 120MHz
portSet, maskSet := d.Pin.PortMaskSet() portSet, maskSet := d.Pin.PortMaskSet()
portClear, maskClear := d.Pin.PortMaskClear() portClear, maskClear := d.Pin.PortMaskClear()
mask := interrupt.Disable()
// See: // See:
// https://wp.josh.com/2014/05/13/ws2812-neopixels-are-not-so-finicky-once-you-get-to-know-them/ // https://wp.josh.com/2014/05/13/ws2812-neopixels-are-not-so-finicky-once-you-get-to-know-them/
@@ -169,5 +171,6 @@ func (d Device) WriteByte(c byte) error {
"maskClear": maskClear, "maskClear": maskClear,
"portClear": portClear, "portClear": portClear,
}) })
interrupt.Restore(mask)
return nil return nil
} }
+3
View File
@@ -7,6 +7,7 @@ package ws2812
import ( import (
"device/arm" "device/arm"
"runtime/interrupt"
) )
// Send a single byte using the WS2812 protocol. // Send a single byte using the WS2812 protocol.
@@ -14,6 +15,7 @@ func (d Device) WriteByte(c byte) error {
// For the Cortex-M4 at 64MHz // For the Cortex-M4 at 64MHz
portSet, maskSet := d.Pin.PortMaskSet() portSet, maskSet := d.Pin.PortMaskSet()
portClear, maskClear := d.Pin.PortMaskClear() portClear, maskClear := d.Pin.PortMaskClear()
mask := interrupt.Disable()
// See: // See:
// https://wp.josh.com/2014/05/13/ws2812-neopixels-are-not-so-finicky-once-you-get-to-know-them/ // https://wp.josh.com/2014/05/13/ws2812-neopixels-are-not-so-finicky-once-you-get-to-know-them/
@@ -106,5 +108,6 @@ func (d Device) WriteByte(c byte) error {
"maskClear": maskClear, "maskClear": maskClear,
"portClear": portClear, "portClear": portClear,
}) })
interrupt.Restore(mask)
return nil return nil
} }
+5
View File
@@ -5,12 +5,14 @@ package ws2812
import ( import (
"device" "device"
"machine" "machine"
"runtime/interrupt"
"unsafe" "unsafe"
) )
func (d Device) WriteByte(c byte) error { func (d Device) WriteByte(c byte) error {
portSet, maskSet := d.Pin.PortMaskSet() portSet, maskSet := d.Pin.PortMaskSet()
portClear, maskClear := d.Pin.PortMaskClear() portClear, maskClear := d.Pin.PortMaskClear()
mask := interrupt.Disable()
switch machine.CPUFrequency() { switch machine.CPUFrequency() {
case 160e6: // 160MHz case 160e6: // 160MHz
@@ -220,6 +222,7 @@ func (d Device) WriteByte(c byte) error {
"maskClear": maskClear, "maskClear": maskClear,
"portClear": uintptr(unsafe.Pointer(portClear)), "portClear": uintptr(unsafe.Pointer(portClear)),
}) })
interrupt.Restore(mask)
return nil return nil
case 80e6: // 80MHz case 80e6: // 80MHz
// See docs for 160MHz. // See docs for 160MHz.
@@ -336,8 +339,10 @@ func (d Device) WriteByte(c byte) error {
"maskClear": maskClear, "maskClear": maskClear,
"portClear": uintptr(unsafe.Pointer(portClear)), "portClear": uintptr(unsafe.Pointer(portClear)),
}) })
interrupt.Restore(mask)
return nil return nil
default: default:
interrupt.Restore(mask)
return errUnknownClockSpeed return errUnknownClockSpeed
} }
} }