TWI enable bei AT91SAM7S

OP #460363
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
OP #460516
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);*/
}
#460551
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);
OP #460557
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);*/
}



OP #460590
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
OP #471337
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

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