UNO R2 en SPI

Hoi,

Ik zit met een probleempje. Wil van een SPI EEPROM wat data uitlezen en daarna veranderen.
Heb even een klein proef programma gemaakt, en getest via UNOARDUSIM. Dit zou werken. Daarna getest met de UNO R2, en het werkt dus totaal niet.

Waar het fout gaat is dat bijvoorbeeld poort 10 (Slaveselect) dus totaal niet reageerd op de commando’s "digitalWrite(SLAVESELECT,HIGH) of … LOW of teminste niet zoals het zou moeten.

Ik gebruik dus onderandere deze code:

#define DATAOUT 11
#define DATAIN 12
#define SPICLOCK 13
#define SLAVESELECT 10

#include <SPI.h>;

void setup() {

pinMode(SLAVESELECT,OUTPUT);
pinMode(DATAOUT,OUTPUT);
pinMode(SPICLOCK,OUTPUT);
pinMode(DATAIN,INPUT);
digitalWrite(SLAVESELECT,HIGH);  // eeprom niet geselecteerd

SPI.begin();
SPI.setDataMode(SPI_MODE1);
SPI.setBitOrder(MSBFIRST);

BLA BLA BLA 
}

byte read_eeprom(int EEPROM_address)
{
//READ EEPROM inhoud van address
int data;
digitalWrite(SLAVESELECT,LOW); // Maak cs laag zet eeprom aan
delay(10);        // ff de kans geven
SPI.transfer(READ); //transmit read opcode
SPI.transfer((char)(EEPROM_address>>8)); //send MSByte address first
SPI.transfer((char)(EEPROM_address)); //send LSByte address
data = SPI.transfer(0xFF); //shift out a data byte
digitalWrite(SLAVESELECT,HIGH);        //release chip, signal end transfer
return data;
}

Is dit soms een bekend probleem met SPI op de UNO R2 ???

mvg

Rene

Edit by jantje:added code tags

Een goede reden om eerst eens te testen of die pin 10 niet defect is. Dus gewoon een testprogramma maken.
Die chip is gewoon hetzelfde dus daar zal het niet liggen lijkt mij.
En weet je zeker dat de SPI functies wel goed afgewikkeld worden? Maw. Een serial print na elke SPI en je weet dat je voorbij die aanroep komt.

Hoi,

In de test situatie met UNOARDUSIM had ik er inderdaad hier en daar wat serial.print regels in zitten. En toen werkte het programma zoals ik konden zien netjes de volgorde af.
In de "geuploade" versie had ik die regels verwijderd voor wat rust in de output.

Ga zeker morgen weer ff wat print regels toevoegen.
Zal morgen ook de poort eens testen en desnoods een andere poort eens pakken (maar verwacht niet dat de poort defect is).

In ieder geval bedankt vast voor de reaktie, en wordt vervolgt :wink:

Rene

Zo even de poorten getest…

Eerst had ik ff snel een voltmeter gepakt en daarmee de poort status bekeken…

Aiii…
HIGH was 5 volt (oke)
LOW (in uitvoering van programma gemeten !!) werd geen 0 Volt maar werd MEER als 5 volt !

Toen de scoop maar ff aangesloten…
HIGH bleef netjes 5 volt
LOW (in uitvoering van het programma gemeten) werd toch netjes naar onderen gehaald naar 0 Volt.

Conclusie poort werkt toch netjes…
Toen de andere poorten maar gemeten met de scoop.
Het CLOCK poortje geeft geen clockpulsjes !
MOSI poort zwijgt ook !
MISO poort ontvangt wel… (Eeprom aangesloten 255, Eeprom niet aangesloten 0 op alle adressen die ik probeer)

Kortom… het lijkt erop of SPI niet aktief is.

In principe zijn de volgende regels toch al voldoende om SPI te aktiveren:

Void(setup){
SPI.begin();
SPI.setBitOrder(MSBFIRST);
SPI.setDataMode(SPI.mode1);

}

Rene

En je weet zeker dat die EEProm goed is? Als die de clock naar GND trekt doet ie ook weinig. Of was die eeprom niet aangesloten.?

Ik weet niet of dit helpt? :http://arduino.cc/en/Tutorial/SPIEEPROM

Hoi Nico,

Eeprom is goed, en werkt ook normaal. Wel moet ik zeggen dat de eeprom zich in een schakeling bevind. Echter ik weet dat die via een "bus pirat interface" en via bijvoorbeeld ponny-prog ook in de schakeling kan worden uitgelezen en worden veranderd. Dan zou het toch ook via de arduino moeten lukken dacht ik :slight_smile: .

Maar ff buiten dit om. als de eeprom nog niet is aan gesloten dan werkt de clock poort ook niet. (wel bij het "initaliseren" van een programma maar daarna onder het "runnen" niet meer).

Heb inderdaad dat programma wat je ook aangaf geprobeerd (eeprom daar gebruikt en die ik heb een Amtel 95256 worden hetzelfde aangestuurd).. resultaat idem.

We blijven proberen :wink: , vind het op dit ogenblik een steeds grotere uitdaging worden.

mvg
Rene

welke EEPROM gebruik je?

Een AMTEL 95256 of gelijkwaardige ( http://www.farnell.com/datasheets/7846.pdf )

Maar ik las ergens in het Engelstalige gedeelte dat iemand die met SPI bezig was ongeveer hetzelfde probleem had. Namelijk geen clock..
Op het laast heeft die de CLOCK_DIVIDER op 128 gezet (tewijl zijn chip ook een hogere snelheid aankon), en toen werkte het.
Er werd verteld dat daar inderdaad een foutje stond in de lib. file. Zal dat straks/vanavond ook eens proberen.

Rene

Alles kan :slight_smile: volgens mij had ik dat artikel ook voorbij zien flitsen :slight_smile:

En een R3 heb je niet liggen?

Na nog wat expirimenteren met de software ben ik nu zover:

De SS lijn werkt, als die naar LOW wordt gebracht en ik verstuur de data via MOSI gaat de clock netjes werken. Alles zien werken via de scoop.

Dit alles wel zonder de Externe EEprom. Ga morgen (denk ik) het interface tussen ARDUINO en EEPROM wat veranderen. En daarna het programma (weer) maken zoals ik het in gedachten had.

// werkt op scoop met clock en data out line //

#define DATA_OUT 11      // MOSI (Master Out / Slave In)
#define DATA_IN  12        // MISO (Master In / Slave Out)
#define SPI_CLOCK  13     // SCK (Serial Clock) 
#define SLAVE_SELECT 10 // SS (Slave Select)

//opcodes
#define WREN  6
#define WRDI  4
#define RDSR  5
#define WRSR  1
#define READ  3
#define WRITE 2


void setup () {
  Serial.begin(9600);
  Serial.println("Setup enter...");

  Serial.print("SPCR: "); Serial.println(SPCR, BIN);

  // Configure SPI
  //   Configure I/O pins
  pinMode(DATA_OUT, OUTPUT);
  pinMode(DATA_IN, INPUT);
  pinMode(SPI_CLOCK, OUTPUT);
  pinMode(SLAVE_SELECT, OUTPUT);
  
  digitalWrite(SLAVE_SELECT, HIGH); // Disable slave
  
  //    Configure SPI Control Register (SPCR) (All values initially 0)
  //     Bit  Description
  //       7  SPI Interrupt Enable     -- disable      (SPIE --> 0)
  //       6  SPI Enable                  -- enable      (SPE  --> 1)
  //       5  Data Order                  -- MSB 1st   (DORD --> 0) (Slave specific)
  //       4  Master/Slave Select      -- master    (MSTR --> 1)
  //       3  Clock Polarity               --               (CPOL --> 0) (Slave specific) ("Mode")
  //       2  Clock Phase                 --               (CPHA --> 0) (Slave specific)
  //       1  SPI Clock Rate Select 1 --}fosc/128  (SPR1 --> 1) 125 kHz
  //       0  SPI Clock Rate Select 1 --}fOSC/128 (SPR0 --> 1) 
  
  SPCR = (1<<SPE)| (1<<MSTR)| (1<<SPR1)| (1<<SPR0);

  Serial.print("SPCR: "); Serial.println(SPCR, BIN);
  byte dummy;
  dummy = SPSR;
  dummy = SPDR;
  delay(10);
  
  
}
  
// From Playground
char spi_transfer(volatile char data)
{
  SPDR = data;                         // Start de clock
  while (!(SPSR & (1<<SPIF)))     // Wacht tot SPIF weer 0 is
  {
  };
  return SPDR;                          // kom met opgehaalde waarde terug
}


void loop(){
  
// LETOP  spi_transfer(blabla)  
        byte data = 0;
	digitalWrite(SLAVE_SELECT, LOW);
        delay(200);
	
        // Read the byte at address 0x2010 ( 00100000 00001010 )
	spi_transfer(READ); 
        delay(200);
	spi_transfer(0x20);         // MSB
        delay(200);
	spi_transfer(0x10);         // LSB
	delay(200);
        data = spi_transfer(0xFF);   //  shift 8 bits in data is 8 bits output
	digitalWrite(SLAVE_SELECT, HIGH);
	 
	Serial.print("read data:");
	Serial.print( data, BIN );
	Serial.print("\n");
}