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 | }
|