Forum: Mikrocontroller und Digitale Elektronik TWI enable bei AT91SAM7S


von Philip K. (praktikant)


Lesenswert?

Hallo zusammen!

Bin bei meinem Projekt einen Schritt weitergekommen.

Es handelt sich immer noch um den AT91SAM7S256.

Ich bekomm aber den TWI nicht zum Laufen. Habe alle Register so gesetzt, 
wie es im Flussdiagramm im Handbuch angegeben ist. Das blöde Ding tut 
aber trotzdem keinen Mucks. Nicht mal die TWI-Clock wird ausgegeben. ist 
vielleicht mein oszi hinüber gg?
Habe im Verdacht, dass ich da noch was in den Registern des PMCs 
rumpfuschen muss.

Ist das richtig und wenn ja, welche Bits muss ich setzten?!

Danke schonmal für eure Antworten.


Gruß

Der Praktikant

von Philip K. (praktikant)


Lesenswert?

weiß dazu wirklich niemand was, oder weigert ihr euch nur zu antworten? 
g

von Dirk D. (dirkd)


Lesenswert?

> oder weigert ihr euch nur zu antworten?

Ja.

Sollen wir alle raten was Du machst?

Wie wäre es mal mit dem Source-Code?

Und nach 3,5 Stunden schon zu jammern ist auch nicht die feine Art

von Philip K. (praktikant)


Lesenswert?

So sieht mein Code bisher aus. In der while(1)-Schleife sollte er 
einfach beliebige Zahlen auf die TWI-Schnittstelle ausgeben, die ich mit 
dem oszi messen kann.... Das war mein Plan.
Funktioniert das so oder bin ich auf dem Holzweg?!





#include <AT91SAM7S256.H>                 /* AT91SAM7S definitions 
*/
#include <STDIO.H>                        /* standard I/O .h-file 
*/
//#include "Board.h"


AT91S_TWI * pTWI = AT91C_BASE_TWI;       /* Global Pointer to TWI 
*/
AT91S_PIO * pPIO = AT91C_BASE_PIOA;
AT91S_PMC * pPMC = AT91C_BASE_PMC;

/* Main Program */
int main (void)  {                      /* main entry for program*/


unsigned int i;
/* Enable peripheral clocks */
//  *AT91C_PMC_PCER =   AT91C_TWI_CLDIV;


//setup the PMC

  pPMC->PMC_SCER = (AT91C_PMC_PCK & AT91C_PMC_UDP);
//  pPMC->PMC_SCER = AT91C_PMC_CSS_MAIN_CLK;
  pPMC->PMC_PCER = 0x10;
  pPMC->PMC_MCKR = 0x5;

//enable PIO-Controller for PIN 3+4

  pPIO->PIO_PER = 0x18;
  pPIO->PIO_OER = 0x18;
  pPIO->PIO_ASR = 0x18;
  pPIO->PIO_PPUER = 0x18;

/* Transmit hex-code to the Transmit Holding Register */

  pTWI->TWI_CWGR = AT91C_TWI_CLDIV;
  pTWI->TWI_CR = AT91C_TWI_MSEN;
  pTWI->TWI_MMR = (AT91C_TWI_DADR | AT91C_TWI_IADRSZ_1_BYTE);
  pTWI->TWI_MMR &= ((unsigned int) 0x0 << 12);
  pTWI->TWI_CR = AT91C_TWI_START;
  while(1) {
    for (i=200000; (pTWI->TWI_SR & AT91C_TWI_TXRDY) != 0; i--) {
      pTWI->TWI_THR = i;
      //__volatile("NOP");
      //pTWI->TWI_CR = AT91C_TWI_STOP;
    }
  }
  /*pTWI->TWI_CR = AT91C_TWI_STOP;
  while ((pTWI->TWI_SR & AT91C_TWI_TXCOMP) == 0);*/
}

von Dirk D. (dirkd)


Lesenswert?

Auf den ersten Blick würde ich mal sagen, daß Du im PowerManager das TWI 
nicht aktiviert hast

Du hast zwar ein

pPMC->PMC_PCER = 0x10;


gemacht. Das setzt aber nicht das richtige Bit für TWI.

Passende Konstanten findest Du in

AT91SAM7S64.h

oder im Datenblatt

pPMC->PMC_PCER = (1 << AT91C_ID_TWI);

von Philip K. (praktikant)


Lesenswert?

Hallo Dirk!

Mein Quelltext sieht mittlerweile aus wie unten!
Mir geht aber auch nicht in den Kopf, wieso nicht mal an PIN4 das 
Clock-Signal ausgegeben wird?!?!?! Was versteh ich denn daran nicht? 
Eigentlich ist es im Datenblatt ja (fast) idiotensicher aufgelsitet, was 
man machen muss.....




#include <AT91SAM7S256.H>                 /* AT91SAM7S definitions 
*/
#include <STDIO.H>                        /* standard I/O .h-file 
*/
//#include "Board.h"

//#define VREF  3                          /* number of records 
*/
//#define AT91C_ADC_PRESCAL_SHIFT 8        /* ADC Prescaler bit offset 
*/

AT91S_TWI * pTWI = AT91C_BASE_TWI;       /* Global Pointer to TWI 
*/
AT91S_PIO * pPIO = AT91C_BASE_PIOA;
AT91S_PMC * pPMC = AT91C_BASE_PMC;
//AT91S_ADC * pADC = AT91C_BASE_ADC;       /* Global Pointer to ADC 
*/
//extern void init_serial (void);          /* Initialize Serial 
Interface           */

/* Main Program */
int main (void)  {                      /* main entry for program 
*/

//unsigned int adval;
unsigned int i;
/* Enable peripheral clocks */
//  *AT91C_PMC_PCER =   AT91C_TWI_CLDIV;

  //(1<<AT91C_ID_ADC) |  /* enable ADC,                           */
             //(1<<AT91C_ID_US0);   /* enable USART0 
*/

  //init_serial();                         /* Initialize Serial 
Interface           */

//setup the PMC

  pPMC->PMC_SCER = (AT91C_PMC_PCK & AT91C_PMC_UDP);
//  pPMC->PMC_SCER = AT91C_PMC_CSS_MAIN_CLK;
  pPMC->PMC_PCER = (1 << AT91C_ID_TWI);
  pPMC->PMC_MCKR = 0x5;

//enable PIO-Controller for PIN 3+4

  pPIO->PIO_PER = 0x18;
  pPIO->PIO_PDR = 0x0;
  pPIO->PIO_MDER = 0x18;
  pPIO->PIO_MDDR = 0x0;
  pPIO->PIO_OER = 0x18;
  pPIO->PIO_ODR = 0x0;
  pPIO->PIO_PPUER = 0x18;
  pPIO->PIO_PPUDR = 0x0;
  pPIO->PIO_ASR = 0x18;
  pPIO->PIO_BSR = 0x0;
  pPIO->PIO_OWER = 0x18;
  pPIO->PIO_OWDR = 0x0;

/* Transmit hex-code to the Transmit Holding Register */

  pTWI->TWI_CWGR = AT91C_TWI_CLDIV;
  pTWI->TWI_CR = AT91C_TWI_MSEN;
  pTWI->TWI_MMR = (AT91C_TWI_DADR | AT91C_TWI_IADRSZ_1_BYTE);
  pTWI->TWI_MMR &= ((unsigned int) 0x0 << 12);
  pTWI->TWI_CR = AT91C_TWI_START;
  while(1) {
    for (i=200000; (pTWI->TWI_SR & AT91C_TWI_TXRDY) != 0; i--) {
      pTWI->TWI_THR = i;
      //__volatile("NOP");
      //pTWI->TWI_CR = AT91C_TWI_STOP;
    }
  }
  /*pTWI->TWI_CR = AT91C_TWI_STOP;
  while ((pTWI->TWI_SR & AT91C_TWI_TXCOMP) == 0);*/
}




von Dirk D. (dirkd)


Lesenswert?

Was um alles in der Welt soll denn das machen??

//enable PIO-Controller for PIN 3+4

  pPIO->PIO_PER = 0x18;

  [...]

0x18 wäre bei mir P7 und P8

Du mußt das TWI Interface im PIO-Controller aktivieren.

Dazu mußt Du P3 und P4 im PIO_ASR setzen.


von Philip K. (praktikant)


Lesenswert?

Ich dachte mir dabei, dass ich in PIO_ASR und PIO_PER die Bits 
folgendermaßen setzen muss, damit PIN 3+4 angesprochen werden:

...0001 1000 , was ja hexadezimal zweifellos 0x18 entspricht.

also so:

//enable PIO-Controller for PIN 3+4

  pPIO->PIO_PER = 0x18;
  pPIO->PIO_PDR = 0x0;
  pPIO->PIO_MDER = 0x18;
  pPIO->PIO_MDDR = 0x0;
  pPIO->PIO_OER = 0x18;
  pPIO->PIO_ODR = 0x0;
  pPIO->PIO_PPUER = 0x18;
  pPIO->PIO_PPUDR = 0x0;
  pPIO->PIO_ASR = 0x18;
  pPIO->PIO_BSR = 0x0;
  pPIO->PIO_OWER = 0x18;
  pPIO->PIO_OWDR = 0x0;

PIO_ASR war vorher ebenfalls schon gesetzt. Daran scheints also nicht zu 
liegen. Ich hab schon sicherheitshalber die ganzen "disable"-Register 
auf 0 gesetzt um ganz sicher zu gehen. Aber nix tut sich :-(

Gruß der Praktikant

von Dirk D. (dirkd)


Lesenswert?

Oops sorry, was habe ich mir dabei gedacht??

Vielleicht helfen Dir Code-Beispiele

Geh mal auf www.at91.com

Dann auf KIT -> AT91SAM7S64-IAR Kit

Am Ende der Seite findest Du ein Zip mit Code für den IAR Compiler. 
Darunter ist auch TWI Beispiel.

von Philip K. (praktikant)


Lesenswert?

Kann ich mich eigentlich nicht einfach am Manual entlanghangeln?! Das 
erscheint mir recht gut aufgeschlüsselt, aber da keine Veränderung in 
meinem Quelltext auch nur die kleinste Reaktion im µC auslöst bin ich 
langsam echt etwas gefrustet!

Gruß
Der Praktikant

von Philip K. (praktikant)


Lesenswert?

Hat denn schon einer von euch eine Idee, warum mein obiger Quelltext 
rein gar nichts tut?!

Vielen Dank für eure Antworten.

Gruß

der Praktikant

von constantin (Gast)


Lesenswert?

hi philip,

mit TWI hab ich mich, zum glück, noch nicht beschäftigt :-)) und kann 
dir nur so ungefähr helfen...
schau mal unter : http://www.at91.com/ ins forum und dort nach "TWI 
working" suchen. dort findest du ein beispiel code über TWI... vllt. 
hilft es dir.

gruß
constantin

von constantin (Gast)


Lesenswert?

oder schau in die yahoo tech group:
http://tech.groups.yahoo.com/group/AT91SAM/message/1644

von Philip K. (praktikant)


Lesenswert?

Okay, dankeschön für eure Antworten.
Nur brauche ich jetzt zur Ansteuerung eines LCDs über TWI überhaupt 
Interrupts?! Wenn ja, WOFÜR?!?!?!

Gruüße

der Praktikant

von Dirk D. (dirkd)


Lesenswert?

Vermutlich brauchst Du keine Interrupts, aber ohne den Typ des LCDs zu 
kennen kann das niemand beantworten. (Würde aber nur Sinn machen wenn 
das Display Daten senden will z. B. bei einem Touchdisplay)

Und wer hat überhaupt etwas von Interrupts erzählt?

von Philip K. (praktikant)


Lesenswert?

Das mit den Interrupts war eine allgemeine Frage. Habe das öfters im 
Bezug auf TWI gelesen und konnte mir eben auch nicht erklären, welches 
Erignis überhaupt einen Interrupt auslösen könnte....

Die Erläuterungen im Forum auf www.at91.com unter dem Stichwort "TWI 
working" versuche ich gerade noch zu verstehen......huihuihui.....

Gruß

der Praktikant

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.