Go Down

Topic: Arduino und SPI (Read 569 times) previous topic - next topic

milito

Hallo nochmal und zwar habe ich einer SPI kommunikation über den Arduino laufen der über die GUI parameter erhält und diese an dem Serial EEPROM via SPi sendet um dies anzusteuern.

Nun zb wenn ich auf dem EEPROM schreiben möchte ist es wie folgt aufgebaut:

|Instruction(8-bit)| Adresse (8-bit)| Value(8-bit)|

wenn ich etwas auslesen möchte dann wie folgt: | Instruction (8-Bit) | Adresse (8-Bit)   so und auf der MISO-Leitung sollte ich als Input die 8-Bit Value haben.

Nun habe ich das mit dem Oszilloskop gemessen also die MOSI und MISO leitung doch da sehe ich das gleiche und zwar folgendes:
|Instruction(8-bit)| Adresse (8-bit)| Value(8-bit)|

Habe ich da was falsch gemacht, weil normalerweise sollte ich doch auf der MISO leitung den Value (8-Bit) sehen oder täusche ich mich?

der habe ich falsch programmiert?

Kann mir da bitte jemand helfen?

uwefed

Quote
der habe ich falsch programmiert?

Ohne Sketch ist das unmöglich zu beantworten.
Grüße Uwe

milito

Stimmt hast recht, weil ich habe das problem, dass ich auch nciht den richtigen Wert auslesen kann, bekomme den falschen wert raus.
Hier der Code:

Code: [Select]

void single_control_spi()
{
  Serial.println("single control vor einlesen der Werte");
  if (Serial.available() > 0 )
  {
   
    byte indication = byte(Serial.parseInt());
    byte address = byte(Serial.parseInt());
    byte data = byte(Serial.parseInt());
   
    //falls indication=1, dann schrieben, d.h. WREN aktivieren
    if (indication==1)   
    {
      //WREN_eeprom();
     
      //Serial.println("WREN-ENALBLED");
      digitalWrite(chipselect_mc,LOW);
      //SPI.transfer(WREN);
      //digitalWrite(chipselect_mc,HIGH);
      //delay(10);
     
      //digitalWrite(chipselect_mc,LOW);
      SPI.transfer(WRITE);
      SPI.transfer(address);
      //Serial.println("Adresse :");
      SPI.transfer(data);
      //Serial.println(data);
      digitalWrite(chipselect_mc,HIGH);
      delay(10);
      digitalWrite(chipselect_mc,LOW);
      SPI.transfer(READ);
      SPI.transfer(address);
      byte data1 = SPI.transfer(0xff); //dumy byte damit das gesendete Data eingetragen in miso geshiftet wird
      Serial.println("inhalt von Adresse: ");
      Serial.print(address);
      Serial.println(data1);
      digitalWrite(chipselect_mc, HIGH);
    }//end if indication 1
  }//end if serial
}//end if fu 


Anbei hänge ich auch das Datenblatt zum EEPROM.

uwefed

den ganzen Sketch Danke

milito

Code: [Select]

#include <SPI.h> //SPI- library

#define WREN 6//write enable latch
#define READ 3
#define WRITE 2

//########SPI-microchip#########//
const int chipselect_mc = 49;
byte instruction;
byte adresse;
byte data;
int output;
//##############################//

/*###########################taster für Device- COntrol###############################*/
const int kipp_left = 30;//Pin digital 30
const int kipp_right = 31;//pin digital 31
int left = 0;
int right = 0;

byte value;
//int tasterState = 0; //initialiesern der Statusabfrage-Variable des Tasters
/*####################################################################################*/




void setup()
{
  SPI.begin(); //SPI- initialisieren
  //Taktrate von 16MHz vom Arduino für SPI ansteuerung runtersetzen auf minimale,
  //damit Pegel sauber sind bzw Übertragung sauber abläuft
  //16MHz / 128 = 0,125MHz->125KHz
  SPI.setClockDivider(SPI_CLOCK_DIV128);
  SPI.setDataMode(SPI_MODE0);
 
  /*#######ENABLE-PIN########*/
  pinMode(EN, OUTPUT);
  //digitalWrite(EN,LOW); //Standard Enablepin auf low->0V
 
  /*###########################*/
  pinMode(49, OUTPUT); //Microchip-Board
  digitalWrite(49,HIGH); //disable device mc
  SPI.setBitOrder(MSBFIRST);
/*######################################################################*/


}

void loop()
{
  //wird ein zeichen über Serialport empfangen?
  if (Serial.available() > 0)
  {
    //falls ja, schreibe diesen in inByte
    inByte = Serial.read();
         
        //falls "=" empfangen wird//
        else if (inByte==61)
        {
          Serial.println("bin in loop fuer single spi control");
         
          single_control_spi();
        }//end if
       
       
   }//endif Serial available

   
}//end loop

/*############################################################################################################################################*/   

/*#######################################Funktionen#################################################################*/

/*##########################################Funktion, um SPI-devices anzusteuern########################################*/

//Sendet einzelnen Befehl an EEPROM d.h. anklickbar und anhand von button wird befehl gesendet//
void single_control_spi()
{
  Serial.println("single control vor einlesen der Werte");
  if (Serial.available() > 0 )
  {
   
    byte indication = byte(Serial.parseInt());
    byte address = byte(Serial.parseInt());
    byte data = byte(Serial.parseInt());
   
    //falls indication=1, dann schrieben, d.h. WREN aktivieren
    if (indication==1)   
    {
      //WREN_eeprom();
     
      //Serial.println("WREN-ENALBLED");
      digitalWrite(chipselect_mc,LOW);
      //SPI.transfer(WREN);
      //digitalWrite(chipselect_mc,HIGH);
      //delay(10);
     
      //digitalWrite(chipselect_mc,LOW);
      SPI.transfer(WRITE);
      SPI.transfer(address);
      //Serial.println("Adresse :");
      SPI.transfer(data);
      //Serial.println(data);
      digitalWrite(chipselect_mc,HIGH);
      delay(10);
      digitalWrite(chipselect_mc,LOW);
      SPI.transfer(READ);
      SPI.transfer(address);
      byte data1 = SPI.transfer(0xff); //dumy byte damit das gesendete Data eingetragen in miso geshiftet wird
      Serial.println("inhalt von Adresse: ");
      Serial.print(address);
      Serial.println(data1);
      digitalWrite(chipselect_mc, HIGH);
    }//end if indication 1
   
    /*if(indication==0)//
    {
      digitalWrite(chipselect_mc,LOW);
      SPI.transfer(READ);
      SPI.transfer(address);
      byte data = SPI.transfer(0);
      Serial.println("inhalt von Adresse: ");
      //Serial.print(address);
      Serial.println(data);
      digitalWrite(chipselect_mc, HIGH);
    }//end if indication 0*/
  }//end if serial
}//end if fu 

  void WREN_eeprom()
  {
    Serial.println("WREN-ENALBLED");
    digitalWrite(chipselect_mc,LOW);
    SPI.transfer(WREN);
    digitalWrite(chipselect_mc,HIGH);
    delay(10);
   
}//end fu


uwefed

Du machst viele Fehler.
Serial.begin(); fehlt
EM und inByte ist nirgens definiert
#define WREN 6 ersetzt alle "WREN" mit 6 auch in Funktionsnamen. Das darf nicht sein.
Code: [Select]
if (Serial.available() > 0)
  {
     inByte = Serial.read();           
        else if (inByte==61)
        {
          Serial.println("bin in loop fuer single spi control");         
          single_control_spi();
        }
    }

Das "else if (inByte==61)" ist falsch. entweder fehlt die geschwungene Klammer vorher aber dann wird inbyte nicht gelesen oder das else ist falsch.

Bitte gib uns den lauffähigen Sketch. Und nicht etwas was sicher nicht die Hardwarefehler produziert die Du bschreibst.

Grüße Uwe

milito

Ou sorry Uwe werd mal den sketch mal als txt-file anhängen.


Go Up