golang.org/x/exp@v0.0.0-20240506185415-9bf2ced13842/io/spi/spi.go (about) 1 // Copyright 2016 The Go Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 // Package spi allows users to read from and write to an SPI device. 6 // 7 // # Deprecated 8 // 9 // This package is not maintained anymore. An actively supported cross-platform 10 // alternative is https://periph.io/. 11 package spi // import "golang.org/x/exp/io/spi" 12 13 import ( 14 "time" 15 16 "golang.org/x/exp/io/spi/driver" 17 ) 18 19 // Mode represents the SPI mode number where clock parity (CPOL) 20 // is the high order and clock edge (CPHA) is the low order bit. 21 type Mode int 22 23 const ( 24 Mode0 = Mode(0) 25 Mode1 = Mode(1) 26 Mode2 = Mode(2) 27 Mode3 = Mode(3) 28 ) 29 30 // Order is the bit justification to be used while transferring 31 // words to the SPI device. MSB-first encoding is more popular 32 // than LSB-first. 33 type Order int 34 35 const ( 36 MSBFirst = Order(0) 37 LSBFirst = Order(1) 38 ) 39 40 type Device struct { 41 conn driver.Conn 42 } 43 44 // SetMode sets the SPI mode. SPI mode is a combination of polarity and phases. 45 // CPOL is the high order bit, CPHA is the low order. Pre-computed mode 46 // values are Mode0, Mode1, Mode2 and Mode3. 47 // The value can be changed by SPI device's driver. 48 func (d *Device) SetMode(mode Mode) error { 49 return d.conn.Configure(driver.Mode, int(mode)) 50 } 51 52 // SetMaxSpeed sets the maximum clock speed in Hz. 53 // The value can be overridden by SPI device's driver. 54 func (d *Device) SetMaxSpeed(speed int) error { 55 return d.conn.Configure(driver.MaxSpeed, speed) 56 } 57 58 // SetBitsPerWord sets how many bits it takes to represent a word, e.g. 8 represents 8-bit words. 59 // The default is 8 bits per word. 60 func (d *Device) SetBitsPerWord(bits int) error { 61 return d.conn.Configure(driver.Bits, bits) 62 } 63 64 // SetBitOrder sets the bit justification used to transfer SPI words. 65 // Valid values are MSBFirst and LSBFirst. 66 func (d *Device) SetBitOrder(o Order) error { 67 return d.conn.Configure(driver.Order, int(o)) 68 } 69 70 // SetDelay sets the amount of pause will be added after each frame write. 71 func (d *Device) SetDelay(t time.Duration) error { 72 return d.conn.Configure(driver.Delay, int(t.Nanoseconds()/1000)) 73 } 74 75 // SetCSChange sets whether to leave the chipselect enabled after a Tx. 76 func (d *Device) SetCSChange(leaveEnabled bool) error { 77 v := 0 78 if leaveEnabled { 79 v = 1 80 } 81 return d.conn.Configure(driver.CSChange, v) 82 } 83 84 // Tx performs a duplex transmission to write w to the SPI device 85 // and read len(r) bytes to r. 86 // User should not mutate the w and r until this call returns. 87 func (d *Device) Tx(w, r []byte) error { 88 // TODO(jbd): Allow nil w. 89 return d.conn.Tx(w, r) 90 } 91 92 // Open opens a device with the specified bus and chip select 93 // by using the given driver. If a nil driver is provided, 94 // the default driver (devfs) is used. 95 96 func Open(o driver.Opener) (*Device, error) { 97 conn, err := o.Open() 98 if err != nil { 99 return nil, err 100 } 101 return &Device{conn: conn}, nil 102 } 103 104 // Close closes the SPI device and releases the related resources. 105 func (d *Device) Close() error { 106 return d.conn.Close() 107 }