Hi,
ich bastler hier gerade mit einem SiliconLabsl 4713 RDS Radio Transmitter IC rum. Habe von Ladyada zwei bereits aufgelötete Exemplare aus USA geordert.
Jetzt versuche ich den Arduino-Beispiel-Code nach Python zu portieren. Leider alles nicht so einfach...
Ich habe bereits in einem Projekt mit den ICs gearbeitet, seiner Zeit ohne Library. Diesen Code habe ich zumindest so auf dem Raspberry am Laufen, dass der Transmitter für einige Sekunden sendet, dann aber wieder Rauschen auf dem Kanal kommt.
Ich vermute irgendwie ist etwas noch nicht richtig konfiguriert, bzw. halbgar. Einige der Arduino/C Funktionen lassen sich nämlich nur bedingt nach Python holen:
z.B.
Hier kann man dem Programm sagen, wieviele Bytes man an Antwort auf ein Kommando erwartet. Das habe ich bei SMBus in Python nicht gefunden...
Wie auch immer — vielleicht hat schon mal jemand von euch mit dem Chip gearbeitet und kann mir sagen, wo es hängt. Momentan versuche ich den "Example Workflow" lauf Datenblatt, S. 259 zu realisieren. Application Guide
#!/usr/bin/python
from Si4713 import *
import smbus
import time
import sys; sys.stdout = sys.stderr
import RPi.GPIO as GPIO
GPIO.setmode(GPIO.BCM)
bus = smbus.SMBus(1)
address = 0x63
resetpin = 4
def waitForCTS():
listenByte = 0x80
print "Wait for", hex(listenByte)
while True:
if (bus.read_byte(address) & listenByte) == listenByte:
print "Got it!"
break
time.sleep(0.01)
print >>sys.stderr, ".",
def waitForSTC():
listenByte = 0x81
print "Wait for", hex(listenByte)
while True:
bus.write_byte(address, CMD_GET_INT_STATUS)
if (bus.read_byte(address) & listenByte) == listenByte:
print "Got it!"
break
time.sleep(0.01)
print >>sys.stderr, ".",
def clearSTC():
bus.write_byte_data(address, CMD_TX_TUNE_STATUS, 1)
for i in range(0,8):
bus.read_byte(address)
print "Cleared STC"
def si47_powerup():
bus.write_i2c_block_data(address,CMD_POWER_UP,[0xD2, 0x50, 0x22, 0xAd])
waitForCTS()
#setProperty(PROP_REFCLK_FREQ, 32768) # crystal is 32.768
#setProperty(PROP_TX_PREEMPHASIS, 1) # 74uS pre-emph (USA std)
#setProperty(PROP_TX_ACOMP_GAIN, 10) # max gain?
#setProperty(PROP_TX_ACOMP_ENABLE, 0x0002) # turn on limiter and AGC
# stuff
def si47_reset():
GPIO.setup(resetpin, GPIO.OUT)
# toggle pin
GPIO.output(resetpin, GPIO.HIGH)
time.sleep(0.01)
GPIO.output(resetpin, GPIO.LOW)
time.sleep(0.01)
GPIO.output(resetpin, GPIO.HIGH)
def setProperty(prop, value):
bus.write_i2c_block_data(address,CMD_SET_PROPERTY, [prop>>8, prop, value>>8, value])
waitForCTS()
def setFreq(freq):
bus.write_i2c_block_data(address,CMD_TX_TUNE_FREQ,[0, freq>>8, freq])
waitForCTS()
waitForSTC()
clearSTC()
waitForCTS()
def setPower(power):
bus.write_i2c_block_data(address,CMD_TX_TUNE_POWER, [0, 0, power, 0])
waitForCTS()
waitForSTC()
clearSTC()
waitForCTS()
def beginRDS(programID):
# 66.25KHz (default is 68.25)
setProperty(PROP_TX_AUDIO_DEVIATION, 6825);
# 2KHz (default)
setProperty(PROP_TX_RDS_DEVIATION, 200);
# RDS IRQ
#setProperty(PROP_TX_RDS_INTERRUPT_SOURCE, 0x0000);
# program identifier
#setProperty(PROP_TX_RDS_PI, 0x40A7);
# 50% mix (default)
#setProperty(PROP_TX_RDS_PS_MIX, 0x03);
# RDSD0 & RDSMS (default)
#setProperty(PROP_TX_RDS_PS_MISC, 0x1808);
# 3 repeats (default)
#setProperty(PROP_TX_RDS_PS_REPEAT_COUNT, 3);
#setProperty(PROP_TX_RDS_PS_MESSAGE_COUNT, 1);
#setProperty(PROP_TX_RDS_PS_AF, 0xE0E0); # no AF
#setProperty(PROP_TX_RDS_FIFO_SIZE, 0);
setProperty(PROP_TX_COMPONENT_ENABLE, 0x0007);
def readTuneStatus():
bus.write_i2c_block_data(address,CMD_TX_TUNE_STATUS,[0x1])
waitForCTS()
for i in range(8):
print hex(bus.read_byte(address))
print """
-------------------------
LADYADA RASPBERRY RADIO
TUNE TUNE TUNE
-------------------------
"""
print "Reset"
si47_reset()
print "Power up without patch 0x01, GPIO enabled"
si47_powerup()
print "Set TX_LINE_INPUT_LEVEL"
bus.write_i2c_block_data(address,0x12,[0x00, 0x21, 0x04, 0x21, 0x5E])
waitForCTS()
print "GET_REV"
bus.write_i2c_block_data(address,0x10,[0x00])
while (bus.read_byte(address) & 0x80) == 0x80:
time.sleep(0.01)
print >>sys.stderr, ".",
# ich habe zeit...
# 8 more bytes after 0x80
for i in range(8):
byte = bus.read_byte(address)
print hex(byte)
Alles anzeigen
Ein Problem ist schon, dass es z.B. ziemlich egal ist, ob ich den Reset drin lasse, oder rausnehme — "angeblich" funktioniert alles und ich bekomme den richtigen ClearToSend response code, 0x80.
Offensichtlich spinnt aber etwas, denn mein GET_REV kommando spuckt mir NUR 0x80 antworten aus...
Sorry — ist ein bisschen unstrukturiert... es hängt eben noch an so vielen Stellen...
Danke schon mal für jeden Gedanken. Manchmal muss man ja auch nur drüber sprechen...
Hans