2017-10-15 47 views
2

我有一个简单的Python代码,不会initalize MFRC522设备正常:Golang和SPI - 试图初始化RF522驱动

import spidev 

    mode_reset = 0x0F 

    def spi_transfer(data): 
     r = spi.xfer2(data) 
     return r 

    def dev_write(address, value): 
     r = spi_transfer([(address << 1) & 0x7E, value]) 
     print(">>",[(address << 1) & 0x7E, value], r) 
     return r 

    def reset(): 
     dev_write(0x01, mode_reset) 

    spi = spidev.SpiDev() 
    spi.open(0, 0) 
    spi.max_speed_hz = 1000000 
    print(spi.mode, spi.bits_per_word, spi.lsbfirst) 
    reset() 

完美的作品很好 - 它返回的命令代码后面15,但同样的初始化程序在Go中实现并不实际:

package main 

    import (
     "fmt" 
     "golang.org/x/exp/io/spi" 
     "log" 
    ) 

    func main() { 

     spiDev, err := spi.Open(&spi.Devfs{ 
      Dev:  "/dev/spidev0.0", 
      Mode:  spi.Mode(spi.Mode0), 
      MaxSpeed: int64(1000000), 
     }) 

     spiDev.SetMode(spi.Mode0) 
     spiDev.SetBitOrder(spi.MSBFirst) 
     spiDev.SetBitsPerWord(8) 

     if err != nil { 
      log.Fatal(err) 
     } 

     writeSpiData := func(dataIn []byte) (out []byte, err error) { 
      out = make([]byte, len(dataIn)) 
      err = spiDev.Tx(dataIn, out) 
      return 
     } 

     devWrite := func(address int, data byte) (err error) { 
      newData := [2]byte{(byte(address) << 1) & 0x7E, data} 
      readBuf, err := writeSpiData(newData[0:]) 
      fmt.Println(">>", newData, readBuf) 
      return 
     } 

     if err != nil { 
      log.Fatal(err) 
     } 

     devWrite(0x01, 0x0F) 

     fmt.Println("Done") 

    } 

这一个返回[0 0]这是错误的。有人知道那里可能有什么错吗?

+0

'打印(spi.mode,spi.bits_per_word,'** ** spi.lsbfirst')''主场迎战spiDev.SetBitOrder('** ** spi.MSBFirst')'莫非这是吗? – Gavin

+0

这只是一个调试,看看每个字的MSB标志位数是多少。从Python返回的'lsbfirst'是'false' – jdevelop

回答

1

它看起来像Go分配的SPI模块不能按预期工作。我使用一些逻辑分析器做了一些研究,并意识到来自exp/io/spi的SPI命令层不会生成适当的命令。

的源代码:

package main 

import (
    "fmt" 
    "golang.org/x/exp/io/spi" 
    "log" 
) 

func main() { 

    spiDev, err := spi.Open(&spi.Devfs{ 
     Dev:  "/dev/spidev0.0", 
     MaxSpeed: int64(1000000), 
    }) 

    spiDev.SetMode(spi.Mode0) 
    spiDev.SetBitOrder(spi.MSBFirst) 
    spiDev.SetBitsPerWord(8) 

    if err != nil { 
     log.Fatal(err) 
    } 

    writeSpiData := func(dataIn []byte) (out []byte, err error) { 
     out = make([]byte, len(dataIn)) 
     err = spiDev.Tx(dataIn, out) 
     return 
    } 

    devWrite := func(address int, data byte) (err error) { 
     newData := [2]byte{(byte(address) << 1) & 0x7E, data} 
     readBuf, err := writeSpiData(newData[0:]) 
     fmt.Println(">>", newData, readBuf) 
     return 
    } 

    if err != nil { 
     log.Fatal(err) 
    } 

    devWrite(0x01, 0x0F) 

    fmt.Println("Done") 

} 

产生的数据日志:

enter image description here

与另一司机

现在,https://github.com/ecc1/spi代码如下:

package main 

import (
    "fmt" 
    "log" 
    "github.com/ecc1/spi" 
) 

func main() { 

    spiDev, err := spi.Open("/dev/spidev0.0", 1000000, 0) 

    spiDev.SetMode(0) 
    spiDev.SetBitsPerWord(8) 
    spiDev.SetLSBFirst(false) 
    spiDev.SetMaxSpeed(1000000) 

    if err != nil { 
     log.Fatal(err) 
    } 

    writeSpiData := func(dataIn []byte) (err error) { 
     err = spiDev.Transfer(dataIn) 
     return 
    } 

    devWrite := func(address int, data byte) (err error) { 
     newData := [2]byte{(byte(address) << 1) & 0x7E, data} 
     fmt.Print("<< ", newData, " ") 
     err = writeSpiData(newData[0:]) 
     fmt.Println(">>", newData) 
     return 
    } 

    if err != nil { 
     log.Fatal(err) 
    } 

    devWrite(0x01, 0x0F) 

    if err != nil { 
     log.Fatal(err) 
    } 

} 

,所得协议转储是否正确:

enter image description here