草庐IT

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

coder 2023-06-27 原文

我有一个简单的 Python 代码可以初始化 MFRC522设备正确:

    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] 这是错误的。有谁知道那里可能出了什么问题?

最佳答案

看起来 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")

}

结果数据日志:

现在有了另一个司机,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)
    }

}

并且生成的协议(protocol)转储是正确的:

关于python - Golang 和 SPI - 尝试初始化 RF522 驱动器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46751154/

有关python - Golang 和 SPI - 尝试初始化 RF522 驱动器的更多相关文章

  1. python - 如何使用 Ruby 或 Python 创建一系列高音调和低音调的蜂鸣声? - 2

    关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。

  2. ruby-on-rails - 未初始化的常量 Psych::Syck (NameError) - 2

    在我的gem中,我需要yaml并且在我的本地计算机上运行良好。但是在将我的gem推送到ruby​​gems.org之后,当我尝试使用我的gem时,我收到一条错误消息=>"uninitializedconstantPsych::Syck(NameError)"谁能帮我解决这个问题?附言RubyVersion=>ruby1.9.2,GemVersion=>1.6.2,Bundlerversion=>1.0.15 最佳答案 经过几个小时的研究,我发现=>“YAML使用未维护的Syck库,而Psych使用现代的LibYAML”因此,为了解决

  3. ruby-on-rails - 未在 Ruby 中初始化的对象 - 2

    我在Rails工作并有以下类(class):classPlayer当我运行时bundleexecrailsconsole然后尝试:a=Player.new("me",5.0,"UCLA")我回来了:=>#我不知道为什么Player对象不会在这里初始化。关于可能导致此问题的操作/解释的任何建议?谢谢,马里奥格 最佳答案 havenoideawhythePlayerobjectwouldn'tbeinitializedhere它没有初始化很简单,因为你还没有初始化它!您已经覆盖了ActiveRecord::Base初始化方法,但您没有调

  4. ruby-on-rails - ActionController::RoutingError: 未初始化常量 Api::V1::ApiController - 2

    我有用于控制用户任务的Rails5API项目,我有以下错误,但并非总是针对相同的Controller和路由。ActionController::RoutingError:uninitializedconstantApi::V1::ApiController我向您描述了一些我的项目,以更详细地解释错误。应用结构路线scopemodule:'api'donamespace:v1do#=>Loginroutesscopemodule:'login'domatch'login',to:'sessions#login',as:'login',via::postend#=>Teamroutessc

  5. ruby - 这两个 Ruby 类初始化定义有什么区别? - 2

    我正在阅读一本关于Ruby的书,作者在编写类初始化定义时使用的形式与他在本书前几节中使用的形式略有不同。它看起来像这样:classTicketattr_accessor:venue,:datedefinitialize(venue,date)self.venue=venueself.date=dateendend在本书的前几节中,它的定义如下:classTicketattr_accessor:venue,:datedefinitialize(venue,date)@venue=venue@date=dateendend在第一个示例中使用setter方法与在第二个示例中使用实例变量之间是

  6. Python 相当于 Perl/Ruby ||= - 2

    这个问题在这里已经有了答案:关闭10年前。PossibleDuplicate:Pythonconditionalassignmentoperator对于这样一个简单的问题表示歉意,但是谷歌搜索||=并不是很有帮助;)Python中是否有与Ruby和Perl中的||=语句等效的语句?例如:foo="hey"foo||="what"#assignfooifit'sundefined#fooisstill"hey"bar||="yeah"#baris"yeah"另外,类似这样的东西的通用术语是什么?条件分配是我的第一个猜测,但Wikipediapage跟我想的不太一样。

  7. ruby-on-rails - 如何在 Ruby on Rails 中实现由 JSF 2.0 (Primefaces) 驱动的 UI 魔法 - 2

    按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visitthehelpcenter指导。关闭10年前。问题1)我想知道ruby​​onrails是否有功能类似于primefaces的gem。我问的原因是如果您使用primefaces(http://www.primefaces.org/showcase-labs/ui/home.jsf),开发人员无需担心javascript或jquery的东西。据我所知,JSF是一个规范,基于规范的各种可用实现,prim

  8. java - 什么相当于 ruby​​ 的 rack 或 python 的 Java wsgi? - 2

    什么是ruby​​的rack或python的Java的wsgi?还有一个路由库。 最佳答案 来自Python标准PEP333:Bycontrast,althoughJavahasjustasmanywebapplicationframeworksavailable,Java's"servlet"APImakesitpossibleforapplicationswrittenwithanyJavawebapplicationframeworktoruninanywebserverthatsupportstheservletAPI.ht

  9. 华为OD机试用Python实现 -【明明的随机数】 2023Q1A - 2

    华为OD机试题本篇题目:明明的随机数题目输入描述输出描述:示例1输入输出说明代码编写思路最近更新的博客华为od2023|什么是华为od,od薪资待遇,od机试题清单华为OD机试真题大全,用Python解华为机试题|机试宝典【华为OD机试】全流程解析+经验分享,题型分享,防作弊指南华为o

  10. FOHEART H1数据手套驱动Optitrack光学动捕双手运动(Unity3D) - 2

    本教程将在Unity3D中混合Optitrack与数据手套的数据流,在人体运动的基础上,添加双手手指部分的运动。双手手背的角度仍由Optitrack提供,数据手套提供双手手指的角度。 01  客户端软件分别安装MotiveBody与MotionVenus并校准人体与数据手套。MotiveBodyMotionVenus数据手套使用、校准流程参照:https://gitee.com/foheart_1/foheart-h1-data-summary.git02  数据转发打开MotiveBody软件的Streaming,开始向Unity3D广播数据;MotionVenus中设置->选项选择Unit

随机推荐