为什么AT86RF231不发送我的数据?

2024-04-26 17:34:14 发布

您现在位置:Python中文网/ 问答频道 /正文

我已经在网上搜索了好几天了,网络和手册都帮不了我。你知道吗

实际上,我想要一个简单的Python发送和接收例程,用于AT86RF231。两台收音机都插在树莓皮上。 我认为所有的寄存器都设置得很好,但是当试图发送一个数据包时,在接收端没有接收到任何东西,并且IRQ TRX_END也没有被触发。 实现的“test mode”对我也不起作用,我不知道为什么。你知道吗

数据表可用here。你知道吗

# -*- coding: utf-8 -*-

import spidev
import time
import RPi.GPIO as GPIO
import binascii
import string
import random


#Definitions        
dont_care = 0
nRST = 27
#Abkürzung
spi=spidev.SpiDev()

#make sure /RST is high
GPIO.setwarnings(False)
GPIO.setmode(GPIO.BCM)
#GPIO 27 als Output konfigurieren
GPIO.setup(nRST, GPIO.OUT)
GPIO.output(nRST,GPIO.HIGH)


#Reset
def reset():
    GPIO.output(nRST,GPIO.LOW)
    time.sleep(0.001)
    GPIO.output(nRST,GPIO.HIGH)
    while (read(0x01,0)[1]!= 0 | read(0x01,0)[1]!= 8):
        time.sleep(0.001)
    print "Reset complete"

# get Device ID 
def DevID():
    ID = spi.xfer2([0x9C,0])
    print "ID:"
    print ID

#write data
def write(addr, value):
    spi.xfer2([addr | 0xC0, value])

#read data
def read(addr, value):
    data = spi.xfer2([addr | 0x80, value])
    return data

#read framebuffer
def frameread():
    output = spi.xfer2([0x20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0])
    return output

#read transmissionstatus 
def transstatus():
    status = read(0x01,0)[1]
    print status
    if (status == 0):
        print "P_ON"
    elif (status == 1):
        print "Busy_RX"
    elif (status== 2):
        print "Busy_TX"
    elif (status == 6):
        print "RX_ON"
    elif (status==8):
        print "TRX_Off"
    else :
        print "Kontrolle des Status nötwendig"
#?
def status():
    status = spi.xfer2([0x81, 0])
    if (status[1]==0):
        print "Status: default"
    elif (status[1]==1):
        print "Status: monitor TRX_Status"
    elif (status[1]==2):
        print "Status: monitor PHY_RSSI"
    elif (status[1]==3):
        print "Status: monitor IRQ_Statis"
    return status[1]

#Continuous Transmission Test Mode
#Register werden in der Anleitung beschrieben
def testmode():
    reset()
    DevID()
    write(0x0E, 0x01)
    write(0x04, 0x00)
    write(0x02, 0x03)
    write(0x03, 0x01)
    write(0x08, 0x33)
    write(0x05, 0x00)
    status()
    while(read(0x01, 0x00) == 8):
        time.sleep(0.1)
        print "Transmission in progress - waiting"
    write(0x036, 0x0F)
    # hier muss der Inhalt beschrieben werden
    #0x60 Frame write Acess,10 Frames, Inhalt
    spi.xfer2([0x60,0x0A,1,2,6,4,5,6,7,8,9,10])
    write(0x1C, 0x54)
    write(0x1C, 0x46)
    write(0x02, 0x09)
    print read(0x0F, 0x01)
    while(read(0x0F, 0x01)[1]!=0):
        time.sleep(0.1)
        print "Waiting for PLL_Lock"
    write(0x02, 0x02)
    #Messung
    transstatus()
    print "Messung durchführen"
    time.sleep(10)
    write(0x1C, 0x00)
    #Reset machen
    reset()

#enable receiver
def receiver_enable():
    write(0x02,0x08)    
    write(0x02,0x06)

# make randomisierte Pakete 
def id_generator(size,chars=string.digits):
    return ''.join(random.choice(chars) for _ in range(size))

#generate Frame
def make_frame(length, power, transmission_type):
    data = id_generator(length)
    dataframe = []
    dataframe.append(length + 2)
    dataframe.append(power)
    dataframe.append(transmission_type)
    for i in range(0,len(data),1):
         dataframe.append(data[i])
    return dataframe

# send frame
def send_frame(frame):
    write(0x0E, 0x01)
    write(0x04, 0x00)
    write(0x02, 0x03)
    write(0x08, 0x33)
    write(0x05, 0x00)
    write_frame(frame)
    while (read(0x01,0)[1] != 8):
        time.sleep(0.1)
        print "Waiting for TRX_OFF"
    write(0x02, 0x09)
    time.sleep(.1)
    while(read(0x01,0)[1] != 9):
        time.sleep(0.1)
        print "Waiting for PLL_Lock"
    #TX start
    write(0x02, 0x02)
    while(read(0x01, 0)[1] == 2):
        time.sleep(0.1)
        print "Busy TX"

#set transmit power 1-16
def set_power(power):
    write(0x05, power)

# Framebuffer write
def write_frame(data):
    if isinstance(data, basestring):
        spi.xfer2([0x60,len(data)] + [int(ord(i)) for i in list(data)])
    else:
        print "bin heir"
        dataframe = []
        dataframe.append(0x60)
        dataframe.append(len(data))
        for i in range(0,len(data),1):
            dataframe.append(int(data[i]))
        print dataframe
        spi.xfer2(dataframe)

发送器例程

spi.open(0,0)
reset()
while(1):
    testmode()
    time.sleep(1)

spi.close()

接收机程序

spi.open(0,0)
reset()
receiver_enable()
while(1):
    print frameread()

spi.close()

Tags: spidataframeforreaddatagpiotimedef
1条回答
网友
1楼 · 发布于 2024-04-26 17:34:14

我自己找到了解决办法。所选频道实际上是错误的。0x33在给定的手册中,但此通道不存在。在发射机和接收机寄存器中更改此项,一切都将正常工作。你知道吗

相关问题 更多 >