SPI Problem Atmega328P

Gast #3430257
Lesenswert?

Hallo Controllergurus,

ich hab seit einigen Wochen ein und das selbe Problem:
Ich versuche mit einem 328P einen Drucksensor via SPI aus zu lesen.
Leider liefert dieser immer nur 0b11111111 zurück und das sollte er 
nicht.
Vielleicht könnt ihr mir sagen ob ich im Code irgend was übersehen habe?

Beste Grüße

Merkus


Datenblatt Sensor

http://www.meas-spec.com/product/t_product.aspx?id=5035#

Programm
1
#include <avr/io.h>
2
#include <asf.h>
3
#include <math.h>
4
#include <stdio.h>
5
#include <stdlib.h>
6
#ifndef F_CPU
7
#define F_CPU 20000000UL
8
#endif
9
#include <util/delay.h>
10
#include <avr/interrupt.h>
11

12

13
int main (void)
14
{
15
  
16
  //PB2 SS //PB3 MOSI //PB5 SCK
17
  DDRB|=((1<<2)|(1<<3)|(1<<5));
18
  //PB4 MISO
19
  DDRB&=~(1<<4);
20
  //SPI Enable // Master enable // prescaler 128
21
  SPCR|=((1<<SPE)|(1<<MSTR)|(1<<SPR1)|(1<<SPR0));
22
  //SCK 0 when IDLE //MSB first
23
  SPCR&=~((1<<CPOL)&(1<<DORD));
24
  //Slave select
25
  PORTB|=(1<<2);
26
  
27
  
28
  DDRD|=(1<<1);
29
  int data1 =0;
30
  int data = 0;
31
  uint16_t result = 0;
32
  uint16_t result1 =0 ;
33
  int L;
34
  
35
  while(1)
36
  {
37
      
38
    PORTD|=(1<<1);
39
    _delay_ms(500);
40
    PORTD&=~(1<<1);
41
    _delay_ms(500);
42
  
43
    
44
    //schicken auf erste flanke
45
    SPCR&=~(1<<CPHA);
46
    //send reset
47
    SPDR = 0b00010101;
48
    // Wait for transmission complete 
49
    while(!(SPSR & (1<<SPIF)));
50
    SPDR = 0b01010101;  
51
    while(!(SPSR & (1<<SPIF)));
52
    SPDR = 0b01000000;
53
    while(!(SPSR & (1<<SPIF)));
54
      
55
    //Send w1 sequence
56
    SPDR = 0b00001111;
57
    while(!(SPSR & (1<<SPIF)));
58
    SPDR = 0b01000000;
59
    while(!(SPSR & (1<<SPIF)));
60
    
61
    //read w1
62
    //lesen auf zweite flanke
63
    SPCR|=(1<<CPHA);
64
    SPDR = 0;
65
    while(!(SPSR & (1<<SPIF)));
66
    data=SPDR;    
67
    SPDR = 0;
68
    while(!(SPSR & (1<<SPIF)));
69
    data1=SPDR;
70
    
71
    //calculate w1
72
    result|=data;
73
    result1|=result<<8;
74
    result=result1|data1;
75
    
76
    if ((result==0)|(result==0xFFFF))    //get error LED if the bytes of the sensor are just zero or just FFFF
77
    {
78
      
79
      for(L=0;L<5;L++)
80
      {
81
        
82
        PORTD|=(1<<1);
83
        _delay_ms(100);
84
        PORTD&=~(1<<1);
85
        _delay_ms(100);
86
      }
87
      
88
    }
89
    
90
    
91
    
92
  }
93
  
94
  
95
}
Gast #3430274
Lesenswert?

Das ist ein digitaler Drucksensor. Ich finds auch nicht prickelnd, aber 
ich muss genau den zum laufen bringen. Vielleicht hat ja jemand ne idee? 
Muss ich den SS irgendwann wieder abschalten? Oder sonst einen Port?

Beste Grüße

Markus
#3430390
Lesenswert?

Hier ist der Link zum Datenblatt
http://www.meas-spec.com/downloads/MS5541C.pdf

Auf Seite 14 ist der interessante Teil: wie funktioniert der technische 
Teil der Datenübertragung. WEnn ich den lese und auch wenn ich die 
Diagramme dazu mir ansehe, dann komme ich zu dem Schluss, dass man da 
mit der Hardware SPI sowieso nicht weiter kommt. Ich denke, das muss in 
Software realisiert werden. Schon alleine deshalb, weil das komplette 
Protokoll nicht auf 8-Bit Einheiten aufbaut.
#3430397
Lesenswert?

Bei SCLK ist keine untere Grenze angegeben. Das heisst für mich, man 
kann den Transfer beliebig langsam machen.
Und genau das würde ich benutzen: Transfer in Software und nicht SPI, 
ein paar LED an die Daten und Clock-Leitungen und dann den ganzen 
Transfer mal soweit verzögert ablaufen lassen, dass man an den LED 
mitverfolgen kann, was sich tut.

Das wäre mein Vorgehen.
Gast #3430567
Lesenswert?

Ich hatte das glück zugriff auf ein speicher oszi zu haben und hab 
gesehen, dass alles perfekt funktionniert, solange ich nichts anderes 
mache als zu senden und zu empfangen. Sobald ich eine LED blinken lasse 
(PORTD1) macht der sensor nix mehr, obwohl ich das nicht in der sequenz 
tue. Außerdem hab ich wohl starke induktionen an den Kabeln oder der 
Steckplatine, da sobald ich mit der Hand an den MOSI gehe der Sensor 
total verrückt spielt. Kann das sein?

Beste Grüße

Markus
Gast #3430838
Lesenswert?

Karl Heinz schrieb:
> Hier ist der Link zum Datenblatt
> http://www.meas-spec.com/downloads/MS5541C.pdf
>
> Auf Seite 14 ist der interessante Teil: wie funktioniert der technische
> Teil der Datenübertragung. WEnn ich den lese und auch wenn ich die
> Diagramme dazu mir ansehe, dann komme ich zu dem Schluss, dass man da
> mit der Hardware SPI sowieso nicht weiter kommt. Ich denke, das muss in
> Software realisiert werden. Schon alleine deshalb, weil das komplette
> Protokoll nicht auf 8-Bit Einheiten aufbaut.

Entschuldigung, den Text habe ich vorher nciht gesehen. Laut einiger 
Internetquellen und einem Typen auf den Phillipinen, der das ding 
schonmal verbaut hat kann man vor den Startsewuenzen machen was man 
will... also kann man einfach nullen vor die sequenz schreiben, ohne 
dass diese einfluss nehmen. Allerdings, seit ich das so durchgemessen 
habe kommen mir da auch zweifel. Zur not mach ichs doch "zu Fuß".
Vielen dank schonmal

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren