spi: finishing touches

This commit is contained in:
kunalpowar 2014-05-22 02:19:01 +05:30
parent 0f23150374
commit 67d316851a
7 changed files with 49 additions and 45 deletions

View File

@ -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
} }

View File

@ -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"
) )

View File

@ -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

View File

@ -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)

View File

@ -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}

View File

@ -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
View File

@ -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.