Bascom I2C write mit gesetztem R/W Bit

fofi1

Mitglied
09. Jan. 2010
116
1
18
Sprachen
Hallo Jungs (und Mädels evtl.),

ich spiele gerade mit dem INA260 von TI und habe ein Problem mit der I2C Abfrage. Wenn ich das Datenblatt richtig verstehe muss ich erst den Adresspointer setzen und dann mit GESETZTEM R/W Bit die Slave-Adresse schicken um die 2 Datenbytes abzuholen.

I2C_1.PNG
i2c_2.PNG


Nun ist mir nicht bekannt das Bascom sowas unterstützen würde. Bei I2CRECEIVE wird anscheinend kein R/W Bit gesetzt wenn die Adresse geschickt wird.


CodeBox BascomAVR
i2creceive &B10000000,i2c_amp(1),1,2,#4 

I2c_3.PNG
Der Kauderwelsch nach dem Adressbyte ist für mich auch nicht wirklich erklärbar. Eigentlich sollte Bascom 1 Byte senden (die Adresse) und 2 Byte empfangen (die Daten). Selbst mit dem gesetzten R/W Bit sollte nicht sowas passieren. Aber naja...ist nebensächlich.



Ich habe euch mal den Code zusammengestutzt mit dem ich das teste:


CodeBox BascomAVR
$regfile = "xm128a4udef.dat"
$hwstack = 128
$swstack = 128
$framesize = 64
Config Submode = New

'### Externe Dateien Einbinden
$lib "xmega.lib"
$external _xmegafix_clear
$external _xmegafix_rol_r1014

'### Quartz definieren
$crystal = 32000000
Config Osc = Enabled , 32mhzosc = Enabled
Config Sysclock = 32mhz , Prescalea = 1 , Prescalebc = 1_1

'### interrupt Priorität
Config Priority = Roundrobin , Vector = Application , Hi = Enabled , Med = Enabled , Lo = Enabled


'### I2C HW Init
Open "twic" For Binary As #4
Config Twic = 100000
I2cinit #4
Dim Twi_start As Byte

'### VAR
dim i2c_amp(2) as Byte
dim I2C_AMP_1 as Byte at i2c_amp(1) overlay
dim I2C_AMP_2 as Byte at i2c_amp(2) overlay


'### I2C Init ###
i2cstart #4
i2cwbyte &B10000000,#4
i2cwbyte &H00,#4
i2cwbyte &B01100111,#4
i2cwbyte &B00100111,#4
i2cstop #4

'Reg auf Current
i2cstart #4
i2cwbyte &B10000000,#4
i2cwbyte &b00000001, #4
i2cstop  #4

'#################
'### MAIN-Loop ###
'#################
Do

Waitms 300

'Reg lesen
i2cstart #4
i2creceive &B10000000,i2c_amp(1),1,2,#4
i2cstop #4

loop



Wäre super wenn jemand einen Lösungsansatz oder eine Idee hätte mit der man beim Senden das R/W gesetzt bekommt.


Gruß,
Florian
 
Hi,

ohne Start und Stop sieht es dann so aus:
i2c_4.PNG

Immer noch nicht so recht logisch, aber das stört mich derzeit nichtmal. Ich kann das ganze ja auch manuell mit start->write->read->read->stop machen.

Die Frage ist nur wie ich das R/W Bit gesetzt bekomme.....

EDIT:
Ohje....es war so einfach. Ich bin davon ausgegangen dass ich Bascom 1 Byte senden lassen muss, wenn der Befehl die Adresse übertragen soll. Das war aber falsch. Der Befehl:


CodeBox BascomAVR
i2creceive &B10000000,i2c_amp(1),0,2,#4 

resultiert in folgender richtiger Sequenz
i2c_5.PNG


Damit hat sich das Problem von selbst gelöst. Manchmal steht man einfach aufm Schlauch......
 
Zuletzt bearbeitet:
Hi,

ich habs jetzt nicht so ganz gelesen. Es scheint aber mal wieder das alte Verständlichkeitsproblem bei I2C-Adressen zu sein ;)

Die I2C-Adresse (8Bit also 1 Byte) besteht aus 7 Adressbits (Bit 7-1) mit dem R/W-Bit als Bit 0.
Das ergibt dann zusammen die 8 Adressbits der I2C-Adresse.

Write-Adressen sind also alle gerade (mit Bit0 als 0) und
Read-Adressen sind alle ungerade (mit Bit0 als 1)

Manche Hersteller geben die 2 Adressen einzeln im Datenblatt an und
manche Hersteller geben nur die obersten 7Bit als Adresse an. Dann
muß man sich das Bit0 als R/W selber im Kopf dazubasteln und die angegebene Adresse mal 2 nehmen.

Beispiel:

Hersteller A:
I2C-Adresse ist 25 + R/W-Bit => Also Write ist dann 50 und Read ist 51

Hersteller B:
I2C-Adresse ist Write 86 (R/W=0) und Read 87 (R/W=1)

Man muß die Datenblätter also sehr genau lesen :D und ein wenig interpretieren :eek: :rolleyes:

Gruß
Dino
 
Hallo Dino,
ich habs jetzt nicht so ganz gelesen. Es scheint aber mal wieder das alte Verständlichkeitsproblem bei I2C-Adressen zu sein ;) ...
Man muß die Datenblätter also sehr genau lesen :D und ein wenig interpretieren :eek: :rolleyes:

nein ich denke nicht, dass es hier an der I2C-Adressierung lag, Adresse und R/W bit sind richtig. :)

Da das richtige Register zuvor im Code adressiert wird, kann man danach mit


CodeBox BascomAVR
i2creceive &B10000000,i2c_amp(1),0,2,#4


2 Byte aus dem adressierten Register lesen.

"b2W" muss dann hier Null sein (kein Byte schreiben), dies war ganz oben nicht der Fall.

I2CRECEIVE slave, var , b2W, b2R , #const
b2W = The number of bytes to write.


Dirk :ciao:
 
War ich wohl nicht deutlich genug - aber letztlich hast Du es ja doch herausbekommen (was ich meinte).
Nur noch der Vollständigkeit halber: Für Bascom gelten die linksorientierten acht-Bit-Adressen, wobei der "Weg zu Fuß" (i2cwbyte, i2crbyte) sich selbst gar nicht im die Adressen kümmert. Du mußt die Adresse senden (klar, mit i2cwbyte), und dort, wenn dann gelesen werden soll eben das read-Bit setzen.
i2creceive hingegen benutzt die genannten subroutinen automatisch. Ich bin mir jetzt nicht sicher, aber wahrscheinlich werden die ersten b2w-vielen Bytes aus dem var-array an die Adresse geschrieben, und dann b2r-viele in das Array gelesen. Also wenn man zB aus irgendeinem Speicher/Sensor mit mehreren Registern/Adressen lesen will ganz nützlich.
i2creceive sollte dann also die Startkondition, in Abhängigkeit von b2w das Schreiben der I2C-Adresse ohne R-Bit, gefolgt von ggf mehreren i2cwrites, ggf 'ne neue (repeated) Startkondition, gefolgt von einem write der Adresse mit R-Bit, gefolgt von ggf mehreren i2crbytes und 'ner Stopkondition erzeugen.
Alles natürlich unter Berücksichtigung/Erzeugung eventueller ACKs/NACKs...
 

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)