Forum: Mikrocontroller und Digitale Elektronik ATMEGA32 und SPI


von Clemens K. (clemensk)


Lesenswert?

Hallo,

ich habe ein Problem das ich auch mit viel lesen im Forum nicht lösen 
kann.
Ich habe ein Eval Board von IB Markl mit einem Atmega32 drauf. Dort habe 
ich versucht die SPI Schnittstelle zu konfigurieren. Leider gelingt mir 
das überhaupt nicht.
1
int x=0;
2
char INIT[15] = {0x00, 0x03, 0x04, 0x09, 0x02, 0xC3, 0x0A, 0x82, 0x02, 0x0D, 0x01, 0x02, 0x0E, 0x30, 0x00};
3
DDRA =0xFF;
4
SPCR=0x5f;
5
SPSR=0x00;
6
7
while(x<=15){
8
/*Start transmission */ 
9
SPDR=INIT[x];
10
/*Wait for transmission complete */ 
11
while(!(SPSR & (1<<SPIF)));
12
x=x+1;
13
}

ich müsste doch zumindest auf dem CLK Pin auf dem Oszi was erkennen? 
Nichtmal das fuktioniert. Was mache ich falsch?

von holger (Gast)


Lesenswert?

>ich müsste doch zumindest auf dem CLK Pin auf dem Oszi was erkennen?
>Nichtmal das fuktioniert. Was mache ich falsch?

SS Pin nicht auf Ausgang gesetzt?

>while(x<=15){

while(x<15){

von Clemens K. (clemensk)


Lesenswert?

so, ich habe mal folgendes eingefügt:

1
DDRB = DDRB | 0x10;

damit müsste ich doch pin 4 port a auf ausgang setzen, oder?

von holger (Gast)


Lesenswert?

>so, ich habe mal folgendes eingefügt:
>DDRB = DDRB | 0x10;
>damit müsste ich doch pin 4 port a auf ausgang setzen, oder?

Ja, und was ist mit dem Rest von DDRB?
Oben steht DDRA!

von Clemens K. (clemensk)


Lesenswert?

das oben war noch ein teil von einem anderen code. also ddra bleibt 
unberührt. ich muss doch nur die den pin an dem der clock ist auf 
ausgang setzen, oder? den rest mache ich doch automatisch wenn ich das 
spi initialisiere?

von holger (Gast)


Lesenswert?

Kriegst du es irgendwie gebacken die komplette Initialisierung
von PORTB zu zeigen? Oder ist das zu schwer für dich?

von Clemens K. (clemensk)


Lesenswert?

so: mein kompletter code:
[c]
#include <avr/io.h>
#include "delay.h"
// Hauptprogramm
int main(void) {
int x=0;
char INIT[15] = {0x00, 0x03, 0x04, 0x09, 0x02, 0xC3, 0x0A, 0x82, 0x02, 
0x0D, 0x01, 0x02, 0x0E, 0x30, 0x00};
DDRB = (1<<PB4)|(1<<PB5) | (1<<PB7); // Ausgang für MOSI, SS und CLK
//SPCR = ( (1<<SPE)|(1<<MSTR) | (1<<SPR1) |(1<<SPR0));
SPCR=0x5f;
SPSR=0x00;
DDRA = 0xFF;
while(x<=15){
/*Start transmission */
SPDR=INIT[x];
/*Wait for transmission complete */
while(!(SPSR & (1<<SPIF)));
x=x+1;
}
// Puls für Step Dir
while(1){
PORTA=0x00;
_delay_ms(4);
PORTA=0xFF;
_delay_ms(4);
}
}

von holger (Gast)


Lesenswert?

>so: mein kompletter code:

Sieht doch gut aus. Allerdings hast du nur für
16 Bytes lang Clock auf dem SPI.

>while(x<=15){

Das ist immer noch falsch. Dein Array hat nur
15 Bytes. Du sendest 16.

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.