2017-10-15 75 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