83 строки
1,7 КиБ
Go
83 строки
1,7 КиБ
Go
package main
|
|
|
|
import (
|
|
"device/sam"
|
|
"fmt"
|
|
"machine"
|
|
"time"
|
|
)
|
|
|
|
var (
|
|
can0 = machine.CAN0
|
|
can1 = machine.CAN1
|
|
ch = make(chan canMsg, 10)
|
|
)
|
|
|
|
type canMsg struct {
|
|
bus byte
|
|
can machine.CANRxBufferElement
|
|
}
|
|
|
|
func main() {
|
|
go print(ch)
|
|
|
|
can1.Configure(machine.CANConfig{
|
|
TransferRate: machine.CANTransferRate500kbps,
|
|
TransferRateFD: machine.CANTransferRate1000kbps,
|
|
Rx: machine.CAN1_RX,
|
|
Tx: machine.CAN1_TX,
|
|
Standby: machine.CAN1_STANDBY,
|
|
})
|
|
// RF0NE : Rx FIFO 0 New Message Interrupt Enable
|
|
can1.SetInterrupt(sam.CAN_IE_RF0NE, func(can *machine.CAN) {
|
|
rxMsg := machine.CANRxBufferElement{}
|
|
can.RxRaw(&rxMsg)
|
|
msg := canMsg{
|
|
bus: 1,
|
|
can: rxMsg,
|
|
}
|
|
select {
|
|
case ch <- msg:
|
|
}
|
|
})
|
|
|
|
can0.Configure(machine.CANConfig{
|
|
TransferRate: machine.CANTransferRate500kbps,
|
|
TransferRateFD: machine.CANTransferRate1000kbps,
|
|
Rx: machine.CAN0_RX,
|
|
Tx: machine.CAN0_TX,
|
|
Standby: machine.NoPin,
|
|
})
|
|
// RF0NE : Rx FIFO 0 New Message Interrupt Enable
|
|
can0.SetInterrupt(sam.CAN_IE_RF0NE, func(can *machine.CAN) {
|
|
rxMsg := machine.CANRxBufferElement{}
|
|
can.RxRaw(&rxMsg)
|
|
msg := canMsg{
|
|
bus: 1,
|
|
can: rxMsg,
|
|
}
|
|
select {
|
|
case ch <- msg:
|
|
}
|
|
})
|
|
|
|
for {
|
|
can0.Tx(0x123, []byte{0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF}, false, false)
|
|
time.Sleep(time.Millisecond * 500)
|
|
can1.Tx(0x456, []byte{0xAA, 0xBB, 0xCC}, false, false)
|
|
time.Sleep(time.Millisecond * 1000)
|
|
}
|
|
}
|
|
|
|
func print(ch <-chan canMsg) {
|
|
for {
|
|
select {
|
|
case m := <-ch:
|
|
fmt.Printf("%d %03X %X ", m.bus, m.can.ID, m.can.DLC)
|
|
for _, d := range m.can.DB[:m.can.Length()] {
|
|
fmt.Printf("%02X ", d)
|
|
}
|
|
fmt.Printf("\r\n")
|
|
}
|
|
}
|
|
}
|