Raspberry Pi GPIO和IRQ处理

时间:2017-06-14 10:51:49

标签: go raspberry-pi3 gpio

我正在尝试为433 mhz收发器实施manchester协议。所以我写了一个简单的程序,使用2个引脚 - 一个用于发送,另一个用于接收信号。接收器部分使用IRQ截取引脚上的边沿变化,并读取其值以传递给曼彻斯特解码器。到目前为止它在理论和测试中看起来都不错,但实际上,一旦我开始将一些数据写入发送器引脚 - 接收器引脚上的中断观察器就会停止工作。我使用相同的板连接发射器和接收器部件。

我创建了一些简单的程序来简单地观察边缘变化 - 除非你使用mem(wirespi gpio)或sysfs将值写入另一个引脚,否则它会截获这些变化。此时中断停止发生。

我错过了什么吗?

以下是使用GPIO 17读取和观察边沿变化的原始样本,以及用于传输信号的GPIO 21。

package main

import (
    "github.com/jdevelop/go-manchester/manchester"
    "github.com/davecheney/gpio"
    "fmt"
    "os"
    "strconv"
    "time"
)

func receive(bps int) {
    pin, err := gpio.OpenPin(17, gpio.ModeInput)
    if err != nil {
        panic(err)
    }

    frame := manchester.NewDataFrame()
    driver := manchester.NewManchesterDriver(int64(bps), 1000000)



    if err = pin.BeginWatch(gpio.EdgeBoth, func() {
        driver.ReadBit(manchester.Up, time.Now().UnixNano(), func(bool) {
            val := pin.Get()
            println(val)
            if frame.ReadBit(val) {
                println("DONE")
            }
        })
    }); err != nil {
        panic(err)
    }

    defer pin.EndWatch()
    defer pin.Close()

    time.Sleep(10 * time.Second)

    fmt.Println(frame)

}

func main() {

    text := os.Args[2]
    bps, _ := strconv.Atoi(os.Args[1])

    driver := manchester.NewManchesterDriver(int64(bps), 100)
    frame := manchester.BuildDataFrame([]byte(text))

    pin, _ := gpio.OpenPin(21, gpio.ModeOutput)
    pin.Clear()

    defer pin.Close()

    logger := make(chan bool, 100)

    loggerF := func() {
        for {
            select {
            case lvl := <-logger:
                if lvl {
                    fmt.Print(1)
                } else {
                    fmt.Print(0)
                }
            }
        }
    }

    signal := func(level bool) {
        if level {
            pin.Set()
        } else {
            pin.Clear()
        }
    }

    go loggerF()
    go receive(bps)

    frame.WriteFrame(func(bit bool) {
        logger <- bit
        driver.WriteBit(bit, signal)
    })

    pin.Clear()

    fmt.Println()
    fmt.Println("Done")

}

0 个答案:

没有答案