ISD1700 mit ATmega8 via SPI

OP (Firma: HTBLuVA St.Pölten) #1598348
Hallo!
Wir würden gerne mit einem ATmega8 den ISD1700 via SPI-Schnittstelle 
steuern. Leider scheint irgendetwas am Code nicht zu stimmen, denn der 
ISD gibt einfach keinen Mucks von sich. Wenn wir den Play-Pin mit einem 
Drahtstück gegen Masse ziehen spielt der Chip.

Wir sind schon seit einigen Wochen verzweifelt am Fehlersuchen, kommen 
aber einfach nicht drauf, was wir falsch machen bzw wo der Fehler im 
Programm sein könnte.

Wir wären sehr dankbar für Hilfestellungen!


1
/*******************FUNKTIONEN*********************/
2
//Chip in SPI Mode versetzen
3
void PowerUp()        
4
{
5
PORTB&=~(1<<PB2);
6
SPDR = 0x01;
7
while(!(SPSR & (1<<SPIF)));
8
SPDR = 0x00;
9
while(!(SPSR & (1<<SPIF)));
10
PORTB|=(1<<PB2);
11
}
12

13
//Wiedergabe oder Aufnahme stoppen
14
void Stop()          
15
{
16
PORTB&=~(1<<PB2);
17
SPDR = 0x02;
18
while(!(SPSR & (1<<SPIF)));
19
SPDR = 0x00;
20
while(!(SPSR & (1<<SPIF)));
21
PORTB|=(1<<PB2);
22
}
23

24
//Alle Pointer zuruecksetzen und SPI Mode beenden
25
void Reset()        
26
{
27
PORTB&=~(1<<PB2);
28
SPDR = 0x03;
29
while(!(SPSR & (1<<SPIF)));
30
SPDR = 0x00;
31
while(!(SPSR & (1<<SPIF)));
32
PORTB|=(1<<PB2);
33
}
34

35
//Von aktueller Position wiedergeben bis Stop oder EOM
36
void Play()          
37
{
38
PORTB&=~(1<<PB2);
39
SPDR = 0x40;
40
while(!(SPSR & (1<<SPIF)));
41
SPDR = 0x00;
42
while(!(SPSR & (1<<SPIF)));
43
PORTB|=(1<<PB2);
44
}
45

46
//APC-Register uebertragen
47
void WriteAPC2(unsigned char data1, unsigned char data2)
48
{
49
PORTB&=~(1<<PB2);
50
SPDR = 0x65;
51
while(!(SPSR & (1<<SPIF)));
52
SPDR = data1;
53
while(!(SPSR & (1<<SPIF)));
54
SPDR = data2;
55
while(!(SPSR & (1<<SPIF)));
56
PORTB|=(1<<PB2);
57
}
58

59
/*******************HAUPTPROGRAMM******************/
60
int main(void)
61
{
62
  //MOSI, SCK und SS als Ausgaenge setzen
63
  DDRB |= (1<<PB2)|(1<<PB3)|(1<<PB5);
64
  //SPI init:
65
  SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR0)|(1<<SPR1)|(1<<CPHA)|(1<<DORD)|(1<<CPOL);
66
  //ISD in SPI-Mode versetzen:
67
  Reset();
68
  PowerUp();
69
  Stop();
70

71
  //          76543210    76543210
72
  WriteAPC2(0b00001010, 0b01000000);
73
  while(1)
74
  {
75
    Play();
76
    _delay_ms(1000);
77
    Stop();
78
    _delay_ms(500);
79
  }
80
  
81
}
(Firma: HTL St.Pölten)
Der ist über den µC auf H geschaltet. Das haben wir der einfachheit 
halber aus dem Code genommen weil wir uns sicher sind das der Chip 
funktioniert, nur der SPI-Mode nicht. Über den Play-Taster lässt sich 
die Musik ohne Probleme abspielen.

Der RES_ISD ist nur zwischen dem Reset Pin des ISD und dem PB6.

Hier der ungekürzte Code:
1
int main(void)
2
{
3
  //DDRC 3,4,5 als Ausgaenge setzen (Relais):
4
  DDRC |= (1<<PC3)|(1<<PC4)|(1<<PC5);
5
  //DDRB 2,3,5 als Ausgaenge setzen (SPI)
6
  //ISD-Reset
7
  DDRB |= (1<<PB6);
8
  //MOSI und SCK
9
  DDRB |= (1<<PB2)|(1<<PB3)|(1<<PB5);
10
  //SPI init:
11
  sei();
12
  SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR0)|(1<<SPR1)|(1<<CPHA)|(1<<DORD)|(1<<CPOL);
13
  //Sounchip init:
14
  PORTB |= (1<<PB6);
15
  Reset();
16
  PowerUp();
17
  Stop();
18
  WriteAPC2(0b00001010, 0b01000000);
19
  while(1)
20
  {
21
    Play();
22
    _delay_ms(1000);
23
    Stop();
24
    _delay_ms(500);
25
  }
26
  
27
}
Okay, also 1MHz...dann könntet ihr den Vorteiler für die SPI auf 1 
setzen, aber das sollte nicht das Problem sein!
Laut Datenblatt soll nach dem Chipselect eine Dauer von 500ns gewartet 
werden bis Takt und Daten kommen, also würde ich dort mal 'ne Wartezeit 
einbauen.
Habt ihr ein Oszi zum kontrollieren der SPI-Schnittstelle da?

Und hier: WriteAPC2(0b00001010, 0b01000000); werden die oberen 4 Bit 
der zweiten Variable nicht berücksichtig, d.h. das setzen der 1 ist 
irrelevant!
OP (Firma: HTBLuVA St.Pölten)
Ich glaube, das Problem gefunden zu haben bzw. hat Nico mich darauf 
gebracht. Die beiden Bytes aus dem WriteAPC2 gehören vertauscht. Wir 
haben anscheinend die Reihenfolge vertauscht. Deswegen auch das unnötige 
Bit, welches Nico angesprochen hat.

So wie wir es bis jetzt versucht haben, ist das FT-Bit (D6, also im 
ersten übertragenen Byte) im APC nicht gesetzt.
Wenn ich die Beschreibung im Datenblatt richtig interpretiere, sollte 
das FT-Bit für unsere Anwendung gesetzt werden.

Leider können wir das erst morgen Mittags testen, da das Projekt in der 
Schule liegt.

Wir werden uns auf alle Fälle morgen im Laufe des Nachmittags nochmal zu 
Wort melden.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 16 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.