Forum: Mikrocontroller und Digitale Elektronik ATMega128 + CC2420 konfiguration über SPI


von d-roehrig (Gast)


Lesenswert?

Hallo!

Ich bin dabei eine Sniffer Funktionalität mittels ATMega128 und CC2420 
zu erstellen. Die UART läuft bereits in beide Richtungen. Ich denke das 
das SPI auch bereits funktionieren sollte, jedoch kann ich es nicht 
testen. (Bin ein Neuling in dem Bereich, vielleicht kennt ihr ja eine 
Möglichkeit)

Nun zu meinem Anliegen. Ich müsste als nächsten Schritt den CC2420 über 
SPI konfigurieren, jedoch weiß ich nicht wie. Aus den Datenblättern für 
den CC2420 sowie dem ATMega128 werde ich auch nicht schlau.

Mein bisheriger Code sieht so aus:
1
#include <avr/io.h>
2
3
#define F_CPU 8388608
4
#define BAUD 9600
5
#define MYUBRR F_CPU/16/BAUD-1
6
#define DD_SCK PINB1
7
#define DD_MOSI PINB2
8
#define DD_MISO PINB3
9
10
void USART_Init( unsigned int ubrr )
11
{
12
  
13
  /* Set baud rate */
14
  UBRR0H = (unsigned char)(ubrr>>8);
15
  UBRR0L = (unsigned char)ubrr;
16
17
  /* Enable receiver and transmitter */
18
  UCSR0B = (1<<TXEN0)|(1<<RXEN0);
19
  
20
  /* Set frame format: 8data, 2stop bit */
21
  UCSR0C = (1<<USBS0)|(3<<UCSZ0);
22
}
23
24
void SPI_MasterInit(void)
25
{
26
  PORTB = (1<<PORTB4)|(1<<PORTB5);
27
28
  /* Set MOSI and SCK output, all others input */
29
  DDRB = (1<<DD_MOSI)|(1<<DD_SCK);
30
 
31
  /* Enable SPI, Master, set clock rate fck/16 */
32
  SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR0);
33
}
34
35
void USART_Transmit( unsigned char data )
36
{
37
  /* Wait for empty transmit buffer */
38
  while (!( UCSR0A & (1<<UDRE0)));
39
40
  /* Put data into buffer, sends the data */
41
  UDR0 = data;
42
}
43
44
uint8_t USART_Receive(void)
45
{
46
    while (!(UCSR0A & (1<<RXC0)));
47
48
  return UDR0;
49
}
50
51
void SPI_MasterTransmit(char cData)
52
{
53
  /* Start transmission */
54
  SPDR = cData;
55
56
  /* Wait for transmission complete */
57
  while(!(SPSR & (1<<SPIF)));
58
}
59
60
uint8_t SPI_MasterReceive(void)
61
{
62
  return SPDR;
63
}
64
65
int main( void )
66
{
67
  USART_Init(MYUBRR);
68
  SPI_MasterInit();
69
70
  while(1)
71
  {
72
    USART_Transmit(USART_Receive());
73
  }
74
75
  return 0;
76
}

Ich hoffe ihr könnt mir helfen ;-)

Vielen Dank im voraus

von Analog (Gast)


Lesenswert?

Äh ... das ist gar keine Initalisierug dabei. Dann ladt Dir mal das 
SmartRF-Studio runter und stell erst mal fest wie du Transceiver 
konfigurieren willst. Wenn Du eine die Initialsierung fertig hast und es 
nicht klappt, dann kann man Dir helfen.

von Christian R. (supachris)


Lesenswert?

Bei TI gibts doch eine Appnote mit Quellcodes für den CC2420, die ist 
sowohl auf dem MSP430 als auch auf einem ATMega lauffähig. Da sind in 
den Codes immer Präprozessor-Anweisungen, die das machen.

http://focus.ti.com/analog/docs/techdocsabstract.tsp?familyId=1624&abstractName=swra059a

Die Software wurde von TI ja von ATMega auf den MSP430 portiert.

von d-roehrig (Gast)


Lesenswert?

Dankt euch erstmal für eure antworten...

Aber das verstehe ich noch nicht ganz. Im Datenblatt des ATMega128 steht 
auch etwas über das SPI.

http://www.atmel.com/dyn/resources/prod_documents/doc2467.pdf
Seite: 165/166

und dort habe ich auch den Code zu Initialisierung her, wenn es denn 
eine ist :D

Könnt ihr dazu etwas sagen?

von Analog (Gast)


Lesenswert?

Also ich will Dir ja nicht auf den Schlipps treten, aber meinst Du nicht 
das dieses Projekt ne nummer zu hoch ist. Die SPI-Ansteuerung dürfte das 
wenigste sein. Die Programmierung des Funktransceivers halte ich für 
komplizierte. Ich würde folgendermaßen vorgehen, um die Kommunikation 
sicher zu stellen. Du ließt das Datenblatt des CC2420 und versuchst via 
SPI ein bestimmtes Register z.B. PLL auszulesen. Ist der Wert plausibel 
dann würde als nächste eins beschreiben und wieder auslesen. Stimmen die 
Werte überein, dann hast Du Kommunikation und die Arbeit kann losgehen.

von d-roehrig (Gast)


Lesenswert?

Ich glaube nicht das das Projekt zu groß ist. Ich habe nur leider noch 
nicht mit der SPI gearbeitet, aber Unwissenheit ist keine Ausrede für 
ein zu großes Projekt ;-)

Aber nun weiter zu meinem Problem. Ich habe mich weiterhin mit der SPI 
beschäftigt, aber weiß nicht genau was du damit meinst, dass ich keine 
SPI initialisiert habe. Ich habe lediglich keine libarys zur 
initialisierung genutzt. Nachdem ich eine Adresse über die SPI sende 
bekomme ich immer nur eine 0 zurück. Es scheint so, dass das SPDR gar 
nicht gesetzt wird oder die Daten am CC2420 nicht ankommen.
Zur Eingrenzung des Problems werde ich einfach mal meine durchgeführten 
Schritte posten:

1. Pin belegung zu Ordnen
1
#define DD_CS PB0    //Selektiert den Master ??kontrollieren
2
#define DD_SCK PB1    //Takt
3
#define DD_MOSI PB2    //Master Out, Slave In
4
#define DD_MISO PB3    //Master In, Slave Out
5
6
#define CC_FIFO PE5
7
#define CC_FIFOP PE6
8
#define CC_CCA PD5
9
#define CC_SFD PD4
10
#define CC_RESET PB6
11
#define CC_VREG_EN PB7          //VREG Enable
sollte selbsterklärend sein.

2. SPI initialisieren
1
  DDRB = (1<<DD_MOSI)|(1<<DD_SCK)|(1<<DD_CS);  // Output Pins festgelegt
2
  PORTB = (0<<DD_MOSI)|(0<<DD_SCK)|(0<<DD_CS); // Pull Up disabled
3
4
  /* Enable SPI, Master, set clock rate fck/16 */
5
  SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR0);

3. Register Adresse Senden über:
1
  /* Start transmission */
2
  SPDR = cData;
3
4
  /* Wait for transmission complete */
5
  while(!(SPSR & (1<<SPIF)));

Ist das soweit (von der Art wie ich es machen würde) richtig?

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.