Forum: Mikrocontroller und Digitale Elektronik at91sam7x PIO


von _Gast_ (Gast)


Lesenswert?

Hallo Zusammen,


ich arbeite mit (zum ersten Mal) einem Atmel  AT91SAM7x Board in
Verbindung mit einem ADC ADCS7476AIMF.

Jetzt hab ich gewisse Probleme den PIO Controller richtig anzusprechen.

Mein Problem ist, dass ich das System, wie man mit den einzelnen
Funktionen der I/O Ports umgeht etc. nicht verstehe. Gibt es dazu eine
gut verständliche Dokumentation? Ideal wäre natürlich deutsch, aber ich
möchte nicht anmaßend sein ;)
Ich mein aber nicht die 670 Seiten Boardbeschreibung mit den einzelnen
Funktionen, die versteh ich schon. Mein Problem liegt wiegesagt beim
Programmieren
Ich möchte die Pins als Input und Output benutzen.

Kann Man den Clock von irgendeinem Pin schicken?

von Oliver J. (skriptkiddy)


Lesenswert?

_Gast_ schrieb:
> Mein Problem ist, dass ich das System, wie man mit den einzelnen
> Funktionen der I/O Ports umgeht etc.

Man sagt dem PIO-Controller, dass er die jeweiligen Pins der gewünschten 
Hardwarekomponente zuordnet. In deinem Fall wird es das SPI-Modul sein. 
Das Ganze geht über die Register PIO_ASR / PIO_BSR. Man muss lediglich 
schauen, an welchen Pins die entsprechenden SPI-Signale hängen und 
welcher Periphial-Block (A/B) dafür verantwortlich ist. Dann kann man 
über die entsprechenden PIO_xSR-Register (x=Block; A oder B) der 
Peripherie die Kontrolle über die Pins geben.

Gruß Oliver


PS.
Kleine Hilfestellung: schau dir mal PA11..PA14 an.

von _Gast_ (Gast)


Lesenswert?

Danke erst mal für die Antwort aber!

wir haben uns nicht richtig verstanden Oliver.

Dass mein µC ein paar SPI Schnittstellen hat, kann ich noch erkennen.
ich möchte die Pins als Input oder Output definieren, unabhängig von den 
schon konfigurierten Schnittstellen. Wenn du mein ADC siehst, kannst du 
erkennen, dass er mit einem Takt die einzelnen Bits Schickt. und wenn 
ich den normalen Clock benutze, dann kann ich keinen Einfluss auf meinen 
Takt. Oder verstehe ich das falsch?
ich möchte irgend ein Pin nehmen und als Clock Ausgang definieren, und 
ein Pin für Data und ich brauche noch ein paar Pins für andere 
Funktionen z.B. EN_Pin, Adressen_Pin ........

von gerhard (Gast)


Lesenswert?

@_Gast_:
wozu machst du einen neuen thread auf und verwendest einen neuen nick?

hier hast du doch schon ähnliche fragen gestellt:
Beitrag "Mac71xx zu at91sam7x256"

wenn du dich tatsächlich ernsthaft mit dem thema befassen möchtest, dann 
solltest du dir die div. beispiel-projekte, die atmel zur verfügung 
stellt, mal näher ansehen und aus denen lernen wie man auf dioe 
peripherie des sam7x zugreist:
http://www.atmel.com/tools/AT91SAMSOFTWAREPACKAGE.aspx

gruss
gerhard

von _Gast_ (Gast)


Lesenswert?

du hast meine Frage aber nicht beantwotet?

von Ulrich P. (uprinz)


Lesenswert?

Hi!

Also ich verstehe auch nicht so ganz, was Du erreichen willst. Zum einen 
könnte man meinen Du möchtest den ADC via SPI ansteuern und weiss nicht, 
wie Du die GPIO Pinne des SAM umschaltest auf die SPI Einheit. Dann 
wiederum kommst DU mit was völlig anderem, Du willst den ADC mit GPIO 
ansteuern... was absolut sinnfrei ist.
Im Unterton Deiner Antwort könnte man vielleicht heraushören, dass Du 
den ADC zu einer genz bestimmten Geschwindigkeit, resp. Samplerate 
verführen möchtest... Dafür GPIO zu nehmen dürfte aber in einer 
mittleren Kathastrophe enden, denn für das Successive Approximation 
Verfahren ist es sinnvoll eine möglichst gleichmäßige Bit-Clock an den 
Chip zu liefern. Das per GPIO sicher zu stellen ist ein enormer Aufwand.
Wenn Du dann die Specs weiter liest, wirst Du verstehen, dass der ADC 
mit dem Start einer Sample-Sequenz die Werte in die Track & Hold Stufe 
lädt und dann eine der Sample-Auflösung entsprechende Anzahl Takte 
benötigt.
Es ist also egal, wie schnell die Pulse für die Bits aufeinander folgen, 
die Samplerate wird vorgegeben, in dem Du überhaupt eine Sequenz 
startetst.

Vereinfacht ausgedrückt:
Wenn Du mit 1kHz Sampeln willst, dann kannst Du den SPI ruhig mit 10MHz 
Baudrate einstellen, aber Du startest nur mit 1kHz die SPI Übertragung.

Im Übrigen, wenn Du Wert auf eine möglichst automatische und konstante 
Samplerate legst, dann suchst Du mit dem SPI eh am falschen Interface. 
Du solltest mal nach dem I2S Interface sehen, dass bei einigen SAM 
vorhanden ist. Nur weil da Audio drann steht, muss man es nicht 
unbedingt dafür nutzen.

Mfg
Ulrich

von _Gast_ (Gast)


Lesenswert?

So habe ich das gemacht mit dem Mac7111:

int adcs7476_read_raw( unsigned char channel )
{

    int read = 0;

    PORTDATA_B |= (1 << ADCS_CLK);
    adcs7476_wait();
    PORTDATA_B &= ~(1 << ADCS_CS);
    adcs7476_wait();

  adcs7476_read_bit(channel);
  adcs7476_read_bit(channel);
  adcs7476_read_bit(channel);

    for(int i=0;i<12;i++)
   {
    read |= (adcs7476_read_bit(channel) & 0x1) << (11-i);
   }

    PORTDATA_B |= (1 << ADCS_CS);
    adcs7476_wait();
    PORTDATA_B &= ~(1 << ADCS_CLK);
    return read;
}

unsigned char adcs7476_read_bit( unsigned char channel )
{
  unsigned char bit = 0;

   PORTDATA_B &= ~(1 << ADCS_CLK);
    adcs7476_wait();
    PORTDATA_B |= (1 << ADCS_CLK);
    if( PORTIR_B & (1 << ADCS_IN) ){
      bit = 1;
    }

  adcs7476_wait();
  return bit;
}

von _Gast_ (Gast)


Lesenswert?

???

von Ulrich P. (uprinz)


Lesenswert?

Nochmal:

Hier versteht niemand, warum Du nicht einfach 16-Bit SPI verwendest, 
obwohl der ADC als auch der SAM7 dieses Protokoll sprechen und absolut 
kompatibel zueinander sind.

Es macht keinen Sinn das über GPIO Bitbanging anzugehen, im Gegenteil, 
es kann Deine Messergebnisse verschlechtern.

Mfg. Ulrich

von _Gast_ (Gast)


Lesenswert?

ok meister ich werde mal das probieren.
und melde mich später mal.



Das ist schon mal die initialisierung ich möchte zwei Per. ansprechen
int Spi_Init()
{



    // Init SPI1
    //set functionality to pins:
    //portA.21 -> SPI1_NPCS0
                //portA.25 -> SPI1_NPCS1
    //portA.22 -> SPCK
    //portA.23 -> MOSI
    //portA.24 -> MISO


    s_pPio->PIO_PDR = BIT21 | BIT22 | BIT23 | BIT24 | BIT25;
    s_pPio->PIO_ASR = BIT21 | BIT22 | BIT23 | BIT24 | BIT25;
    s_pPio->PIO_BSR = 0;


    //enable the clock of SPI
    s_pPMC->PMC_PCER = 1 << AT91C_ID_SPI1;



    // Fixed mode
         s_pSpi->SPI_CR      = 0x81;       //SPI Enable, Software reset
   s_pSpi->SPI_CR      = 0x01;               //SPI Enable


    s_pSpi->SPI_MR      = 0x0013; //Master mode, variable select, 
disable decoder, FDIV=1 (MCK), PCS=1101

    s_pSpi->SPI_CSR[1]  = 0x00001F02;  //8bit, CPOL=0, ClockPhase=1, 
SCLK = 18Mhz/32*31 = 18kHz

    s_pPDC->PDC_PTCR = AT91C_PDC_TXTEN | AT91C_PDC_RXTEN;
    s_pSpi->SPI_PTCR = AT91C_PDC_TXTEN | AT91C_PDC_RXTEN;
}
Falls ich etwas falsches gemacht hab, sagt bitte Bescheid.
Danke euch;-)

von _Gast_ (Gast)


Lesenswert?

Hallo zusammen,

ich möchte die Daten, die ich von einer  SPI Schnittstelle bekomme, mit 
meinem CAN-Bus rausschicken. Hat jemand da ein bisschen Erfahrung wie 
das geht.
Ich möchte die Mail-Boxen Initialisieren aber ich weiß nicht wie das 
geht oder viele ich brauche. Hat jemand vielleicht ein C-Code Beispiel 
für mich?

Danke im Voraus

von _Gast_ (Gast)


Lesenswert?

????

von _Gast_ (Gast)


Lesenswert?

kann ich die Daten, die ich mit der SPI Schnittstelle lese direkt mit 
der CAN Schnittstelle senden?
 Mailbox initialisieren? CAN-Schnittstelle initialisieren?

Danke im Voraus

von _Gast_ (Gast)


Lesenswert?

keiner weißt was?:-(

von gerhard (Gast)


Lesenswert?

>kann ich die Daten, die ich mit der SPI Schnittstelle lese direkt mit
>der CAN Schnittstelle senden?
ja

>Mailbox initialisieren? CAN-Schnittstelle initialisieren?
siehe examples aus Atmel software package:
http://www.atmel.com/Images/at91sam7xc-ek.zip

mfg
gerhard

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.