2017-10-15 13 views
2

초기화 RF522 드라이브에 시도 : - 그것은 다시 15 명령 코드를 반환하지만 같은 초기화 루틴Golang 및 SPI - 나는 initalize <a href="https://www.nxp.com/docs/en/data-sheet/MFRC522.pdf" rel="nofollow noreferrer">MFRC522</a> 장치를 제대로 수행하는 간단한 파이썬 코드가

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

완벽하게 잘 작동 이동에 구현 정말 작동하지 않습니다

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 플래그/워드 당 비트 수를 확인하는 것은 디버그 일뿐입니다. 파이썬에서 반환 된'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") 

} 

결과 데이터 로그 :

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

https://github.com/ecc1/spi 코드의 모습 프로토콜 덤프가 정확합니다 :

enter image description here