bitbang/spi: move pin init to Connect() from NewSPI() (#278)

Move pin init to Connect() from NewSPI()

Fixes #277
pull/1/head
Seán C. McCord 8 years ago committed by M-A
parent cd27930fe4
commit 97f5f4fe5d

@ -30,23 +30,14 @@ import (
// //
// cs can be nil. // cs can be nil.
func NewSPI(clk, mosi gpio.PinOut, miso gpio.PinIn, cs gpio.PinOut) (*SPI, error) { func NewSPI(clk, mosi gpio.PinOut, miso gpio.PinIn, cs gpio.PinOut) (*SPI, error) {
if cs != nil { return &SPI{
if err := cs.Out(gpio.High); err != nil { spiConn: spiConn{
return nil, err sck: clk,
} sdi: miso,
} sdo: mosi,
if err := clk.Out(gpio.High); err != nil { csn: cs,
return nil, err },
} }, nil
if err := mosi.Out(gpio.High); err != nil {
return nil, err
}
if miso != nil {
if err := miso.In(gpio.PullUp, gpio.NoEdge); err != nil {
return nil, err
}
}
return &SPI{spiConn: spiConn{sck: clk, sdi: miso, sdo: mosi, csn: cs}}, nil
} }
// SPI represents a SPI master port implemented as bit-banging on 3 or 4 GPIO // SPI represents a SPI master port implemented as bit-banging on 3 or 4 GPIO
@ -94,6 +85,10 @@ func (s *SPI) Connect(f physic.Frequency, mode spi.Mode, bits int) (spi.Conn, er
return nil, fmt.Errorf("bitbang-spi: failed to idle clock: %v", err) return nil, fmt.Errorf("bitbang-spi: failed to idle clock: %v", err)
} }
if err := s.spiConn.initializePins(); err != nil {
return nil, fmt.Errorf("bitbang-spi: failed to initialize pins: %v", err)
}
return &s.spiConn, nil return &s.spiConn, nil
} }
@ -278,5 +273,27 @@ func (s *spiConn) unassertCS() error {
return nil return nil
} }
func (s *spiConn) initializePins() error {
if err := s.unassertCS(); err != nil {
return fmt.Errorf("failed to unassert CS: %v", err)
}
if s.sck != nil {
if err := s.sck.Out(s.clockIdle); err != nil {
return fmt.Errorf("failed to idle clock: %v", err)
}
}
if s.sdo != nil {
if err := s.sdo.Out(gpio.Low); err != nil {
return fmt.Errorf("failed to zero MOSI: %v", err)
}
}
if s.sdi != nil {
if err := s.sdi.In(gpio.PullUp, gpio.NoEdge); err != nil {
return fmt.Errorf("failed to initialize MISO: %v", err)
}
}
return nil
}
var _ spi.Conn = &spiConn{} var _ spi.Conn = &spiConn{}
var _ spi.PortCloser = &SPI{} var _ spi.PortCloser = &SPI{}

Loading…
Cancel
Save