Forum: Mikrocontroller und Digitale Elektronik SAM4E TWI läuft nicht


von Max (Gast)


Lesenswert?

Hallo mikrocontroller Community,
Ich versuche seit einiger Zeit den TWI Bus in gang zu bekommen.
Der Controller ist ein SAM4E.

Mein erstes Ziel ist einfach mal eine start condition im Oszi zu sehen.
Mein Code sieht so aus:

void i2c_init (void)
{
  MATRIX->CCFG_SYSIO |= (1 << 4) | (1 << 5);    //PB4 und PB5 aktivieren 
= 0x30
  pio_set_peripheral (PIOB, PIO_PERIPH_A, (PIO_PB4A_TWD1 | 
PIO_PB5A_TWCK1));    //TWD1 PB4 zuweisen
  //pio_set_peripheral (PIOB, PIO_PERIPH_A, PIO_PB5A_TWCK1);  //TWCK1 
PB5 zuweisen

  pmc_enable_periph_clk ( ID_TWI1 );  //TWI1 mit Takt versorgen

  TWI1->TWI_CR = (TWI_CR_SVDIS | TWI_CR_MSEN);  //Slave Mode Disable | 
Master Mode Enable
  TWI1->TWI_MMR = (TWI_MMR_DADR(0x48) | TWI_MMR_MREAD);        //Adresse 
die angesprochen werden soll (TempSensor) + Master soll lesen
}

Die i2c_init wird einmal beim start ausgeführt.
Ist dies soweit korrekt oder habe ich schon hier einen Fehler gemacht.

In der Main wird dann der Startbefehl gesendet

TWI1->TWI_CR = TWI_CR_START;

Vielleicht kann mir ja jemand behlflich sein.
Schonmal im Vorraus vielen Dank.

PS. beide Signale sind nach dem i2c_init auf high

von El_Doktorante (Gast)


Lesenswert?

Hey,
ich habe leider das gleiche Problem, hat niemand zufälligerweise ein 
Beispiel wo es funktioniert?

Gruß
El_Doktorante

von Jim M. (turboj)


Lesenswert?

Gibt es keine Appnote vom Hersteller für TWI? Das kann ich mir kaum 
vorstellen.

Außerdem ist das total mieser Stil:
1
MATRIX->CCFG_SYSIO |= (1 << 4) | (1 << 5);

weil man praktisch immer im dicken Manual nachschlagen muss, was diese 
Bits zu bedeuten haben. Dafür gibt es bestimmt auch "sprechende" 
Konstandendefinitionen, das ist dann deutlich besser zu lesen und 
weniger anfällig für Fehler.

von Max (Gast)


Lesenswert?

> Außerdem ist das total mieser Stil:MATRIX->CCFG_SYSIO |= (1 << 4) | (1
> << 5);


@Jim
da geb ich dir recht. hab diese zeile auch hier im forum gefunden. 
Leider finde ich sont keine holfreiche note :(

Versuche im moment TWI0 in gang zu bekommen.

Ein Beispiel ist sicher hilfreich.

Danke.
Gruß Max

von Michael (Gast)


Lesenswert?

Hi.. habe auch bereits meine ersten Erfahrungen mit dem TWI gemacht. 
Also prinzipiell würde ich dir auch erstmal zu den ASF funktionen 
(driver + Service) raten (die auch erstmal funktionieren, nicht 
interrupt basiert sind und bei denen man sich auch etwas abgucken kann).

Bist du jetzt beim TWI0 oder 1 ? Der TWI1 hängt ja an den SYSIOS, 
richtig?

Prinzipiell schaut das schon ganz gut aus. Ich sende allerdings kein 
expliziten Start sondern schreibe das MMR, das IADR, und dann das THR. 
Nach dem Schreiben des THR beginnt die Transaktion. Mit Start sequenz, 
slaveaddr, interne slaveaddr, datenbyte etc.

etwa in der Form:
1
p_twi->TWI_MMR = TWI_MMR_DADR(buffer_out)| ((1 << TWI_MMR_IADRSZ_Pos) & TWI_MMR_IADRSZ_Msk);
2
    
3
      
4
p_twi->TWI_IADR = 0;
5
p_twi->TWI_IADR = buffer_out;
6
7
//write first Byte to start transmission
8
p_twi->TWI_THR = 0xff;

von Max (Gast)


Lesenswert?

Hi erstmal danke für die Hilfe.

Im moment versuch ichs am TWI0.
Allerdings wollt ich eigentlich ohne das asf zurecht kommen.
Aber falls ichs nicht hinbekomme werde ich wohl umsatteln müssen.

pmc_enable_periph_clk ( ID_TWI0 );  //TWI0 mit Takt versorgen
pio_set_peripheral(PIOA, PIO_PERIPH_A,(PIO_PA3A_TWD0|PIO_PA4A_TWCK0)); 
//TWD0 PA3 zuweisen | TWCK0 PA4 zuweisen

TWI0->TWI_CR = (TWI_CR_SVDIS | TWI_CR_MSEN);//Slave Mode Disable | 
Master Mode Enable
TWI0->TWI_MMR = (TWI_MMR_DADR(0x48) | TWI_MMR_MREAD);//Adresse die 
angesprochen werden soll (TempSensor) + Master soll lesen TWI_MMR_MREAD

TWI0->TWI_CR = (TWI_CR_START);

Ist eigentlich genau das gleiche wie bei TWI1 außer das ich im 
CCFG_SYSIO Register nichts machen muss.

Die Frage nun wieso sendet der uC keinen Start.
Ich Messe zurzeit beide Pins. Beide Pins sind auf high.
Wenn ich eine Startbedigung sende sollte doch der TWD Pin auf low 
gezogen werden.
Selbst wenn der Clock nicht korrekt konfiguriert ist sollte dies doch 
eigentlich passieren, oder was ist der Fehler.

Ich hoffe jemand kann mir helfen.
Nebenbei werde ich versuchen das ganze über den asf zu realisieren.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.