ISD1700 mit ATmega8 via SPI

OP (Firma: HTBLuVA St.Pölten) #1598348
Lesenswert?

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) #1598502
Lesenswert?

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
}
#1598808
Lesenswert?

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) #1599565
Lesenswert?

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

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