Golang 和 SPI - 尝试初始化 RF522 驱动器
Golang and SPI - trying to init RF522 drive
我有一个简单的 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()
工作得很好 - 它 returns 命令代码返回 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")
}
这个returns[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)
}
}
并且生成的协议转储是正确的:
我有一个简单的 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()
工作得很好 - 它 returns 命令代码返回 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")
}
这个returns[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)
}
}
并且生成的协议转储是正确的: