普通网友 2017-10-15 02:34
浏览 340
已采纳

Golang和SPI-尝试初始化RF522驱动器

I have a simple Python code that does initalize MFRC522 device properly:

    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()

that works perfectly fine - it returns the command code back 15, but the same initialization routine implemented in Go doesn't really work:

    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")

    }

This one returns [0 0] which is wrong. Does anyone know what might be wrong there?

  • 写回答

1条回答 默认 最新

  • dongmo20030416 2017-10-16 04:06
    关注

    It looks like the SPI module from Go distribution doesn't work as expected. I did some research using some logic analyzer and realized that the SPI command layer from exp/io/spi does not generate the appropriate commands.

    The source code:

    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")
    
    }
    

    The resulting data log:

    enter image description here

    Now with another driver, https://github.com/ecc1/spi the code looks like:

    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)
        }
    
    }
    

    And the resulting protocol dump is correct:

    enter image description here

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥30 酬劳2w元求合作写文章
  • ¥15 在现有系统基础上增加功能
  • ¥15 远程桌面文档内容复制粘贴,格式会变化
  • ¥15 关于#java#的问题:找一份能快速看完mooc视频的代码
  • ¥15 这种微信登录授权 谁可以做啊
  • ¥15 请问我该如何添加自己的数据去运行蚁群算法代码
  • ¥20 用HslCommunication 连接欧姆龙 plc有时会连接失败。报异常为“未知错误”
  • ¥15 网络设备配置与管理这个该怎么弄
  • ¥20 机器学习能否像多层线性模型一样处理嵌套数据
  • ¥20 西门子S7-Graph,S7-300,梯形图