Forum: Mikrocontroller und Digitale Elektronik SPI Arduino hängt sich auf


von Alex A. (alextbg)


Lesenswert?

Hallo, ich habe - absichtlich- SPI für Arduino selber programmiert. Wenn 
ich allerdings bei MOSI was reinbekommen sollte, zeigt mir mein Programm 
an, dass ich in der Schleife mit while(go) der Methode ReadBit() 
feststeckt. Hat jemand eine Ahnung warum das so ist, ich komme auf 
meinen Fehler einach nicht drauf...
Die Serial.println habe ich nur zum Testen verwendet, damit ich sehe, wo 
er sich aufhängt
Vielen Dank
1
#include "pins_arduino.h"
2
#include <ESP8266WiFi.h>
3
#include <ESP8266HTTPClient.h>
4
#include <WiFiClient.h>
5
#include <SPI.h>
6
#include <ESP8266WiFiMulti.h>
7
#include "SPISlave.h"
8
9
#define SS 15
10
#define MOSI 13
11
#define MISO 12
12
#define SCK 15
13
14
int8_t Temperatur;
15
16
bool isAvailable(){
17
  if(digitalRead(SS)==LOW)return true;
18
  return false;
19
}
20
21
int readBit(){
22
  bool go=true;
23
  while(go){
24
    Serial.println("clk2");
25
  if(digitalRead(SCK)==HIGH){
26
    go=false;
27
    if(digitalRead(MOSI) == HIGH){
28
      return 1;
29
    }else {
30
      return 0;
31
    }
32
  }
33
  }
34
35
}
36
37
int readByte(){
38
  int received = 0;
39
  for(int i=0;i<8;i++){
40
    if(readBit()){
41
      Serial.println("read 1");
42
      received = received * 2+1;
43
  }else{
44
    Serial.println("read 0");
45
    received = received * 2;
46
  }
47
  if(i<8-1){
48
    while(digitalRead(SCK)==HIGH){
49
      Serial.println("waiting for clk"); 
50
  } 
51
  }
52
}
53
}
54
55
void writeBit(int data){
56
  
57
}
58
59
void writeByte(int data){
60
61
}
62
63
void readData(){
64
  Serial.println("reading...");
65
  Serial.println(readByte());
66
}
67
68
void setup(){
69
  // PINMODE zb
70
71
  pinMode(SCK,INPUT);
72
  pinMode(SS,INPUT);
73
  pinMode(MOSI,INPUT);
74
  Serial.begin(115200);
75
  Serial.println("started");
76
  
77
}
78
79
80
void loop() {
81
  if(isAvailable()){
82
    readData();
83
  }
84
  
85
  }

von Jim M. (turboj)


Lesenswert?

Vermutung: Serial.println() blockiert und Du verlierst die restlichen 
SCK Takte.

Der SPI Slave ist verdammt schlecht in Software zu behandeln - Stichwort 
Interrupts. Schau mal ob der ESP nicht einen SPI Slave in Hardware hat.

von Thomas W. (diddl)


Lesenswert?

Du willst Daten per SPI empfangen, also ein SPI Client.

Woher kommen die SPI Signale?
Welches Gerät sendet dir was?

Ich nehme an die SPI Signale sind einfach zu schnell für deinen Arduino.


Insbesondere DigitalRead() ist ja bekannt dafür dass extrem langsam ist.

Etwas besser geht es mit der LIB FastIO ...

von Veit D. (devil-elec)


Lesenswert?

Hallo,

am 'MOSI' wirst du keine Bits einlesen können.
'Master Out Slave In' immer aus Sicht des einzelnen Device betrachten!
Serial.print stört da nur.
Zudem solltest du die Bits mittels Interrupt einlesen.

: Bearbeitet durch User
von Stefan F. (Gast)


Lesenswert?

Veit D. schrieb:
> am 'MOSI' wirst du keine Bits einlesen können.

Im Slave Modus schon

von Veit D. (devil-elec)


Lesenswert?

ja stimmt, er will am Slave einlesen

von Wolfgang (Gast)


Lesenswert?

Veit D. schrieb:
> am 'MOSI' wirst du keine Bits einlesen können.
> 'Master Out Slave In' immer aus Sicht des einzelnen Device betrachten!

Das ist das Schöne an den Signalbezeichnungen bei SPI, es gibt gar keine 
Diskussionen über die Sichtweise. Bei MOSI wird genau der Slave Bits 
einlesen.

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.