gobot.io/x/gobot/v2@v2.1.0/drivers/spi/mfrc522_driver.go (about) 1 package spi 2 3 import ( 4 "gobot.io/x/gobot/v2/drivers/common/mfrc522" 5 ) 6 7 // MFRC522Driver is a wrapper for SPI bus usage. Please refer to the mfrc522.MFRC522Common package 8 // for implementation details. 9 type MFRC522Driver struct { 10 *Driver 11 *mfrc522.MFRC522Common 12 } 13 14 // NewMFRC522Driver creates a new Gobot Driver for MFRC522 RFID with SPI connection 15 // 16 // Params: 17 // 18 // a *Adaptor - the Adaptor to use with this Driver 19 // 20 // Optional params: 21 // 22 // spi.WithBusNumber(int): bus to use with this driver 23 // spi.WithChipNumber(int): chip to use with this driver 24 // spi.WithMode(int): mode to use with this driver 25 // spi.WithBitCount(int): number of bits to use with this driver 26 // spi.WithSpeed(int64): speed in Hz to use with this driver 27 func NewMFRC522Driver(a Connector, options ...func(Config)) *MFRC522Driver { 28 d := &MFRC522Driver{ 29 Driver: NewDriver(a, "MFRC522"), 30 } 31 d.MFRC522Common = mfrc522.NewMFRC522Common() 32 d.afterStart = d.initialize 33 for _, option := range options { 34 option(d) 35 } 36 return d 37 } 38 39 func (d *MFRC522Driver) initialize() error { 40 wrapper := &conWrapper{origCon: d.connection} 41 return d.MFRC522Common.Initialize(wrapper) 42 } 43 44 // this is necessary due to special behavior of shift bytes and set first bit 45 type conWrapper struct { 46 origCon Connection 47 } 48 49 func (w *conWrapper) ReadByteData(reg uint8) (uint8, error) { 50 // MSBit=1 for reading, LSBit not used for first byte (address/register) 51 return w.origCon.ReadByteData(0x80 | (reg << 1)) 52 } 53 54 func (w *conWrapper) WriteByteData(reg uint8, val uint8) error { 55 // LSBit not used for first byte (address/register) 56 return w.origCon.WriteByteData(reg<<1, val) 57 }