|
|
|
|
@ -30,23 +30,14 @@ import (
|
|
|
|
|
//
|
|
|
|
|
// cs can be nil.
|
|
|
|
|
func NewSPI(clk, mosi gpio.PinOut, miso gpio.PinIn, cs gpio.PinOut) (*SPI, error) {
|
|
|
|
|
if cs != nil {
|
|
|
|
|
if err := cs.Out(gpio.High); err != nil {
|
|
|
|
|
return nil, err
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
if err := clk.Out(gpio.High); err != nil {
|
|
|
|
|
return nil, err
|
|
|
|
|
}
|
|
|
|
|
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
|
|
|
|
|
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
|
|
|
|
|
@ -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)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if err := s.spiConn.initializePins(); err != nil {
|
|
|
|
|
return nil, fmt.Errorf("bitbang-spi: failed to initialize pins: %v", err)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return &s.spiConn, nil
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@ -278,5 +273,27 @@ func (s *spiConn) unassertCS() error {
|
|
|
|
|
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.PortCloser = &SPI{}
|
|
|
|
|
|