mirror of
https://github.com/kidoman/embd
synced 2024-12-22 12:50:19 +01:00
spi: finishing touches
This commit is contained in:
parent
0f23150374
commit
67d316851a
@ -3,11 +3,10 @@ package mcp3008
|
|||||||
import (
|
import (
|
||||||
"github.com/golang/glog"
|
"github.com/golang/glog"
|
||||||
"github.com/kidoman/embd"
|
"github.com/kidoman/embd"
|
||||||
|
|
||||||
_ "github.com/kidoman/embd/host/all"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
type mcp3008 struct {
|
// MCP3008 represents a mcp3008 8bit DAC
|
||||||
|
type MCP3008 struct {
|
||||||
mode byte
|
mode byte
|
||||||
|
|
||||||
bus embd.SPIBus
|
bus embd.SPIBus
|
||||||
@ -16,18 +15,22 @@ type mcp3008 struct {
|
|||||||
var SingleMode byte = 1
|
var SingleMode byte = 1
|
||||||
var DifferenceMode byte = 0
|
var DifferenceMode byte = 0
|
||||||
|
|
||||||
func New(mode byte, bus embd.SPIBus) *mcp3008 {
|
func New(mode byte, bus embd.SPIBus) *MCP3008 {
|
||||||
return &mcp3008{mode, bus}
|
return &MCP3008{mode, bus}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (m *mcp3008) AnalogValueAt(chanNum int) (int, error) {
|
const (
|
||||||
data := make([]uint8, 3)
|
startBit = 1
|
||||||
data[0] = 1
|
)
|
||||||
|
|
||||||
|
func (m *MCP3008) AnalogValueAt(chanNum int) (int, error) {
|
||||||
|
var data [3]uint8
|
||||||
|
data[0] = startBit
|
||||||
data[1] = uint8(m.mode)<<7 | uint8(chanNum)<<4
|
data[1] = uint8(m.mode)<<7 | uint8(chanNum)<<4
|
||||||
data[2] = 0
|
data[2] = 0
|
||||||
|
|
||||||
glog.V(2).Infof("mcp3008: sendingdata buffer %v", data)
|
glog.V(2).Infof("mcp3008: sendingdata buffer %v", data)
|
||||||
if err := m.bus.TransferAndRecieveData(data); err != nil {
|
if err := m.bus.TransferAndRecieveData(data[:]); err != nil {
|
||||||
return 0, err
|
return 0, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -16,7 +16,6 @@ import (
|
|||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"github.com/golang/glog"
|
"github.com/golang/glog"
|
||||||
|
|
||||||
"github.com/kidoman/embd"
|
"github.com/kidoman/embd"
|
||||||
"github.com/kidoman/embd/host/generic"
|
"github.com/kidoman/embd/host/generic"
|
||||||
)
|
)
|
||||||
|
@ -129,11 +129,9 @@ func (b *spiBus) setMode() error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (b *spiBus) setSpeed() error {
|
func (b *spiBus) setSpeed() error {
|
||||||
var speed uint32
|
speed := defaultSPISpeed
|
||||||
if b.speed > 0 {
|
if b.speed > 0 {
|
||||||
speed = uint32(b.speed)
|
speed = uint32(b.speed)
|
||||||
} else {
|
|
||||||
speed = defaultSPISpeed
|
|
||||||
}
|
}
|
||||||
|
|
||||||
glog.V(3).Infof("spi: setting spi speedMax to %v", speed)
|
glog.V(3).Infof("spi: setting spi speedMax to %v", speed)
|
||||||
@ -150,12 +148,9 @@ func (b *spiBus) setSpeed() error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (b *spiBus) setBPW() error {
|
func (b *spiBus) setBPW() error {
|
||||||
var bpw uint8
|
bpw := defaultSPIBPW
|
||||||
|
|
||||||
if b.bpw > 0 {
|
if b.bpw > 0 {
|
||||||
bpw = uint8(b.bpw)
|
bpw = uint8(b.bpw)
|
||||||
} else {
|
|
||||||
bpw = defaultSPIBPW
|
|
||||||
}
|
}
|
||||||
|
|
||||||
glog.V(3).Infof("spi: setting spi bpw to %v", bpw)
|
glog.V(3).Infof("spi: setting spi bpw to %v", bpw)
|
||||||
@ -171,13 +166,11 @@ func (b *spiBus) setBPW() error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (b *spiBus) setDelay() {
|
func (b *spiBus) setDelay() {
|
||||||
var delay uint16
|
delay := defaultDelayms
|
||||||
|
|
||||||
if b.delayms > 0 {
|
if b.delayms > 0 {
|
||||||
delay = uint16(b.delayms)
|
delay = uint16(b.delayms)
|
||||||
} else {
|
|
||||||
delay = defaultDelayms
|
|
||||||
}
|
}
|
||||||
|
|
||||||
glog.V(3).Infof("spi: delayms set to %v", delay)
|
glog.V(3).Infof("spi: delayms set to %v", delay)
|
||||||
b.spiTransferData.delayus = delay
|
b.spiTransferData.delayus = delay
|
||||||
}
|
}
|
||||||
@ -210,11 +203,11 @@ func (b *spiBus) ReceiveData(len int) ([]uint8, error) {
|
|||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
data := make([]uint8, len)
|
var data [len]uint8
|
||||||
if err := b.TransferAndRecieveData(data); err != nil {
|
if err := b.TransferAndRecieveData(data[:]); err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
return data, nil
|
return data[:], nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (b *spiBus) TransferAndReceiveByte(data byte) (byte, error) {
|
func (b *spiBus) TransferAndReceiveByte(data byte) (byte, error) {
|
||||||
@ -222,9 +215,8 @@ func (b *spiBus) TransferAndReceiveByte(data byte) (byte, error) {
|
|||||||
return 0, err
|
return 0, err
|
||||||
}
|
}
|
||||||
|
|
||||||
d := make([]uint8, 1)
|
d := [1]uint8{uint8(data)}
|
||||||
d[0] = uint8(data)
|
if err := b.TransferAndRecieveData(d[:]); err != nil {
|
||||||
if err := b.TransferAndRecieveData(d); err != nil {
|
|
||||||
return 0, err
|
return 0, err
|
||||||
}
|
}
|
||||||
return d[0], nil
|
return d[0], nil
|
||||||
@ -235,9 +227,8 @@ func (b *spiBus) ReceiveByte() (byte, error) {
|
|||||||
return 0, err
|
return 0, err
|
||||||
}
|
}
|
||||||
|
|
||||||
d := make([]uint8, 1)
|
var d [1]uint8
|
||||||
err := b.TransferAndRecieveData(d)
|
if err := b.TransferAndRecieveData(d[:]); err != nil {
|
||||||
if err != nil {
|
|
||||||
return 0, err
|
return 0, err
|
||||||
}
|
}
|
||||||
return byte(d[0]), nil
|
return byte(d[0]), nil
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
// +build ignore
|
// +build ignore
|
||||||
|
|
||||||
|
// this sample uses the mcp3008 package to interface with the 8-bit ADC and works without code change on bbb and rpi
|
||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
@ -7,9 +8,9 @@ import (
|
|||||||
"fmt"
|
"fmt"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/kidoman/embd/convertors/mcp3008"
|
|
||||||
|
|
||||||
"github.com/kidoman/embd"
|
"github.com/kidoman/embd"
|
||||||
|
"github.com/kidoman/embd/convertors/mcp3008"
|
||||||
|
_ "github.com/kidoman/embd/host/all"
|
||||||
)
|
)
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
@ -21,7 +22,11 @@ func main() {
|
|||||||
}
|
}
|
||||||
defer embd.CloseSPI()
|
defer embd.CloseSPI()
|
||||||
|
|
||||||
spiBus := embd.NewSPIBus(embd.SpiMode0, 0, 1000000, 8, 0)
|
channel := 0
|
||||||
|
speed := 1000000
|
||||||
|
bpw := 8
|
||||||
|
delay := 0
|
||||||
|
spiBus := embd.NewSPIBus(embd.SPIMode0, channel, speed, bpw, delay)
|
||||||
defer spiBus.Close()
|
defer spiBus.Close()
|
||||||
|
|
||||||
adc := mcp3008.New(mcp3008.SingleMode, spiBus)
|
adc := mcp3008.New(mcp3008.SingleMode, spiBus)
|
||||||
|
@ -6,7 +6,6 @@ import (
|
|||||||
"fmt"
|
"fmt"
|
||||||
|
|
||||||
"github.com/kidoman/embd"
|
"github.com/kidoman/embd"
|
||||||
|
|
||||||
_ "github.com/kidoman/embd/host/all"
|
_ "github.com/kidoman/embd/host/all"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -16,7 +15,7 @@ func main() {
|
|||||||
}
|
}
|
||||||
defer embd.CloseSPI()
|
defer embd.CloseSPI()
|
||||||
|
|
||||||
spiBus := embd.NewSPIBus(embd.SpiMode0, 0, 1000000, 8, 0)
|
spiBus := embd.NewSPIBus(embd.SPIMode0, 0, 1000000, 8, 0)
|
||||||
defer spiBus.Close()
|
defer spiBus.Close()
|
||||||
|
|
||||||
dataBuf := []uint8{1, 2, 3}
|
dataBuf := []uint8{1, 2, 3}
|
||||||
|
@ -18,12 +18,19 @@ func main() {
|
|||||||
}
|
}
|
||||||
defer embd.CloseSPI()
|
defer embd.CloseSPI()
|
||||||
|
|
||||||
bus := embd.NewSPIBus(embd.SpiMode0, 0, 1000000, 8, 0)
|
channel := 0
|
||||||
|
speed := 1000000
|
||||||
|
bpw := 8
|
||||||
|
delay := 0
|
||||||
|
bus := embd.NewSPIBus(embd.SPIMode0, channel, speed, bpw, delay)
|
||||||
defer bus.Close()
|
defer bus.Close()
|
||||||
|
|
||||||
for i := 0; i < 30; i++ {
|
for i := 0; i < 30; i++ {
|
||||||
time.Sleep(1 * time.Second)
|
time.Sleep(1 * time.Second)
|
||||||
val, _ := getSensorValue(bus)
|
val, err := getSensorValue(bus)
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
fmt.Printf("value is: %v\n", val)
|
fmt.Printf("value is: %v\n", val)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
16
spi.go
16
spi.go
@ -6,17 +6,17 @@ const (
|
|||||||
spiCpha = 0x01
|
spiCpha = 0x01
|
||||||
spiCpol = 0x02
|
spiCpol = 0x02
|
||||||
|
|
||||||
// SpiMode0 represents the mode0 operation (CPOL=0 CPHA=0) of spi.
|
// SPIMode0 represents the mode0 operation (CPOL=0 CPHA=0) of spi.
|
||||||
SpiMode0 = (0 | 0)
|
SPIMode0 = (0 | 0)
|
||||||
|
|
||||||
// SpiMode0 represents the mode0 operation (CPOL=0 CPHA=1) of spi.
|
// SPIMode1 represents the mode0 operation (CPOL=0 CPHA=1) of spi.
|
||||||
SpiMode1 = (0 | spiCpha)
|
SPIMode1 = (0 | spiCpha)
|
||||||
|
|
||||||
// SpiMode0 represents the mode0 operation (CPOL=1 CPHA=0) of spi.
|
// SPIMode2 represents the mode0 operation (CPOL=1 CPHA=0) of spi.
|
||||||
SpiMode2 = (spiCpol | 0)
|
SPIMode2 = (spiCpol | 0)
|
||||||
|
|
||||||
// SpiMode0 represents the mode0 operation (CPOL=1 CPHA=1) of spi.
|
// SPIMode3 represents the mode0 operation (CPOL=1 CPHA=1) of spi.
|
||||||
SpiMode3 = (spiCpol | spiCpha)
|
SPIMode3 = (spiCpol | spiCpha)
|
||||||
)
|
)
|
||||||
|
|
||||||
// SPI interface allows interaction with the SPI bus.
|
// SPI interface allows interaction with the SPI bus.
|
||||||
|
Loading…
x
Reference in New Issue
Block a user