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?
_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.
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 ........
@_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
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
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; }
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
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;-)
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
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
>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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.