SAM4E TWI läuft nicht

Gast #3963087
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
#3969522
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.
Gast #3973482
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;
Gast #3974231
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren