I2C Kommunikation mit Si4713 Radio-Chip

Heute ist Stammtischzeit:
Jeden Donnerstag 20:30 Uhr hier im Chat.
Wer Lust hat, kann sich gerne beteiligen. ;)
  • 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.

    Code
    Wire.requestFrom(i2caddress, length);


    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

    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

  • Nice wåre genial wenn das auch auf dem Raspberry Pi funktioniert.
    Für mein Radio Projekt.

    Mathias
    10. Juli 2014 um 21:25
  • Noch ein paar Nachträge:
    Der Chip sendet schon direkt zu beginn jeder Kommunikation mit I2C diesen CTS (Clear to Send) 0x80. Den sollte er eigentlich nur senden, wenn er ein Kommando erfolgreich verarbeitet hat und bereit für das nächste ist.

    Lustigerweise bekomme ich auch CTS 0x80 wenn ich irgendeinen Bullshit an den Chip sende. Keine Fehlermeldung (ist eigentlich vorgesehen: es gibt ein Error-Byte)

    Wo hängts — ich blick nicht mehr durch...

  • Habe noch weiter gemacht, ich bekomme jetzt zumindest die richtigen Responses (wenngleich bei den richtigen Aktionen...).

    Leider bin ich nach wie vor nur 1s auf Sendung, dann fährt der Sender wieder runter :(

    [code=php]def setPropertyCommand(inputBytes, expectByte):

    cmd = inputBytes[0]
    args = inputBytes[1:len(inputBytes)]

    print >>sys.stderr, "Set Property %s" % hex(cmd), " with Arguments: ",
    for i in args:
    print hex(i), " ",

    bus.write_i2c_block_data(address, cmd, args)
    time.sleep(0.1) # small delay

    response = bus.read_i2c_block_data(address,0,1)

    if response[0] != expectByte:
    print >>sys.stderr, "ERROR: ", hex(response[0])
    exit()
    else:
    print >>sys.stderr, "Success!"

    time.sleep(0.1) # another delay just to make sure


    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 >>sys.stderr, """
    -------------------------
    LADYADA RASPBERRY RADIO
    TUNE TUNE TUNE
    -------------------------
    """

    print >>sys.stderr, "\n\nReset"
    si47_reset()


    print >>sys.stderr, "\nPower up in Analog Mode"
    setPropertyCommand([0x01, 0x12, 0x50], 0x80)

    time.sleep(.24)

    print >>sys.stderr, "\nSet Property: Line Input Level"
    setPropertyCommand([0x12, 0, 0x21, 0x04, 0x21, 0x5E], 0x80)


    print >>sys.stderr, "\nGET_REV"
    bus.write_byte(address,0x10)
    response = bus.read_i2c_block_data(address,0,9)

    for e in response:
    True
    #print hex(e)

    if response[1] == 13:
    print >>sys.stderr, "Found Si4713 chip! Cool"
    time.sleep(1)


    # print >>sys.stderr, "\nSet Property: REFCLK_FREQ"
    # setPropertyCommand([0x12, 0, 0x02, 0x01, 0x7E, 0xF4], 0x80)

    #print >>sys.stderr, "\nSet Property: REFCLK_PRESCALE"
    # setPropertyCommand([0x12, 0, 0x02, 0x02, 0x01, 0x90], 0x80)

    print >>sys.stderr, "\nSet Property: TX_LINE_INPUT_LEVEL_MUTE"
    setPropertyCommand([0x12, 0, 0x21, 0x05, 0x00, 0x00], 0x80)

    print >>sys.stderr, "\nSet Property: TX_PREEMPHASIS 50us"
    setPropertyCommand([0x12, 0, 0x21, 0x06, 0x00, 0x01], 0x80)

    print >>sys.stderr, "\nSet Property: TX_PILOT_FREQUENCY"
    setPropertyCommand([0x12, 0, 0x21, 0x07, 0x4A, 0x38], 0x80)

    print >>sys.stderr, "\nSet Property: TX_AUDIO_DEVIATION"
    setPropertyCommand([0x12, 0, 0x21, 0x01, 0x1A, 0xA9], 0x80)

    print >>sys.stderr, "\nSet Property: TX_PILOT_DEVIATION"
    setPropertyCommand([0x12, 0, 0x21, 0x02, 0x02, 0xA3], 0x80)


    print >>sys.stderr, "\nTX_TUNE_POWER"
    setPropertyCommand([0x31, 0, 0, 0x73, 0], 0x80)

    print >>sys.stderr, "\nTX_TUNE_FREQ"
    freq = 10350
    setPropertyCommand([0x30, 0, freq>>8, freq & 0xff], 0x80)


    print >>sys.stderr, "\nGET_INT_STATUS"
    timeout = 200
    while response != 0x81 and timeout!=0:
    read = bus.read_i2c_block_data(address,0x14,1); response = read[0]
    print >>sys.stderr, ".",
    time.sleep(0.01)
    timeout -= 1
    if timeout == 0:
    print "Error! Timed out..."

    if timeout > 0:
    print >>sys.stderr, "Success, got ", hex(response)


    print >>sys.stderr, "\nTX_TUNE_STATUS"
    bus.write_i2c_block_data(address,0x33, [0x01])
    #bus.write_byte(address,0x33)
    response = bus.read_i2c_block_data(address,0x00,8)

    for i in range(len(response)):
    print hex( response[i] ),


    print >>sys.stderr, "\nTX_CONPONENT_ENABLE"
    setPropertyCommand([0x12, 0, 0x21, 0, 0, 0x03], 0x80)[/php]

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!