-         

Ergebnis 1 bis 5 von 5

Thema: SPI-SRAM Pointer zum Auslesen übergeben

  1. #1
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    21.04.2005
    Ort
    Hannover
    Beiträge
    190

    SPI-SRAM Pointer zum Auslesen übergeben

    Anzeige

    Hallo,

    ich habe noch ein Problem....
    Ich habe ein Routine für den SPI Bus (Interruptgesteuert) geschrieben uns stehe vor dem Problem, dass ich einen Pointer eines Arrays, in das dieDaten aus dem SRAM geschrieben werden sollen, übergeben möchte.
    Was mache ich falsch?

    Hier die betreffenden Routinen:
    SPI
    Code:
    void
    SPI_master_read (char **data_ptr, uint8_t data_bytes)
    {
    	if (data_bytes > 0)
    	{
    		while (SPI_busy == 1);
    
    		DataToRead = data_bytes;
    		PtrToData  = *data_ptr;
    
    		SPI_dir = READ;
    
    		SPDR = 0xff;
    
    		SPI_busy = 1;
    	}
    }
    
    ISR (SPI_STC_vect)
    { 		                					// Point to next Char in String
    	switch (SPI_dir)
    	{       
    		case WRITE:	
    				if (DataToSend != 0)         	// if end not reached
    	        	{
    					DataToSend--;
    					PtrToData++;
    					SPDR  = *PtrToData;  	// send Character
    	        	}
    	        	else 
    				{
    					if (SPI_hold == 0)
    					{
    						SPI_busy = 0;           // if end reached enable transmission of next String
    						Disable_SPI_Device;
    					}
    					else
    					{
    						SPI_busy = 0;
    						SPI_hold--;
    					}
    				}
    			break;
    
    		case READ:
    			
    			if (DataToRead != 0)
    			{
    				DataToRead--;
    				*PtrToData = SPDR;
    				char glu[2];
    				glu[0] = *PtrToData;
    				glu[1] = '\0';
    				PtrToData++;
    				SPDR = 0xff;
    			}
    			else
    			{
    				*PtrToData = SPDR;
    				SPI_busy = 0;
    				Disable_SPI_Device;
    			}
    			break;
    	}
    }
    und SRAM
    Code:
    void
    SRAM_read (uint16_t adress, char **sram_ptr, uint8_t sram_bytes)
    {
    	char send [3];
    
    	//send read instruction and start adress
    	send [0] = 0x03;
    	send [1] = adress >> 8;
    	send [2] = adress & 0xff;
    
    	SPI_master_send (&send [0], 3, 1);
    
    	SPI_master_read (sram_ptr, sram_bytes);	
    }
    mit dem Aufruf
    Code:
    char tempbuf [13];
    		SRAM_read (0x0001, tempbuf, 12);
    Die Datenübertragung funktioniert (einzelne Bytes werden übertragen).

    Vielen Dank!

    MfG, Marten83

  2. #2
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.836
    Eins fällt mir auf.
    send [1] = adress >> 8;
    send [2] = adress & 0xff;
    Auf diese Art sendest du zuerst das LSB

    Wenn das der Reader die Adresse nicht ebenfalls umdreht, steht er im Wald
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  3. #3
    Erfahrener Benutzer Roboter Experte Avatar von sternst
    Registriert seit
    07.07.2008
    Beiträge
    672
    Du definierst (gleich mehrfach) in den Funktionsparametern Pointer auf Pointer auf char, übergibst dann aber beim Aufruf (auch gleich mehrfach) nur einen Pointer auf char.
    MfG
    Stefan

  4. #4
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    21.04.2005
    Ort
    Hannover
    Beiträge
    190
    @PicNick:
    Ich meine das wäre so richtig, also MSB wird an Stelle 1 also zuerst gesendet.

    @sternst:
    Ich habe versucht die Adresse auf die der Pointer zeigt einfach an eine darunterliegende Funktion zu übergeben.
    Dabei dachte ich, dass ich damit genau das mache (Adresse an Funktion übergeben, welche Diese als Pointer weitergeben kann.
    Leider habe ich, wie man sieht, dass anscheinend noch nicht ganz durchschaut.

  5. #5
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    21.04.2005
    Ort
    Hannover
    Beiträge
    190
    Habe das Problem jetzt gefunden....
    Bis f/32Hz (~500kHz) klappt die Übertragung Problemlos, aber ab f/16 (~1MHz) will der SRAM einfach keine Daten mehr ausgeben.
    (Keine Ahnung ob er sie denn annimmt)

    Jetzt frage ich mich warum?
    Laut Oszi kommen Daten am Pin an, Taktflanken sehen gut aus und !CS wird auch zum passenden Zeitpunkt auf 'low' gezogen.

    Versorgungsspannung ist auch ok.
    Der !HOLD Pin ist auch abgeschaltet.

    Hat dazu vielleicht noch jemand eine Idee?

    Marten83

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •