Anzeige:

Probleme mit dem Transceiver Cypres CYWUSB6934

Hier finden sie die archivierten Beiträge des alten PHPBB Forums von www.loetstelle.net

Probleme mit dem Transceiver Cypres CYWUSB6934

Von ledi am 10.08.2010 10:54

Da ich noch nie mit einem Transceiver gearbeitet habe, benötige ich hier bitte Eure Hilfe!

Für die Ansteuerung eines LED-Cubes per Funk möchte ich zwei 2,4GHz-Tranceiver von Cypress CYWUSB6934-48LTXC verwenden.
Auf der Sender- und Empfängerseite kommen zwei Mikrocontroller von Atmel (AT90PWM316) zum Einsatz.
Die Kommunikation wird über die SPI-Schnittstelle realisiert.

Ich möchte zum Test nur einen Datensatz (0b10000101) an den Empfänger übertragen.
Die Datenübertragung von 0b10000101 am MOSI-Pin funktioniert.
Leider kommt aber am Empfänger nichts an.
So wie ich das verstanden habe, müssten die übertragenen Daten am MISO-Pin des Empfänger-Transceivers mit dem Oszi zu messen sein.
Alle Register der Transceiver wurden in der Grundeinstellung belassen.


Hier der C-Code für den Sender:
1]
#include <avr/io.h>
#include <util/delay.h>

void SPI_MasterInit(void)
{
SPCR |= (1<<SPE); // SPI enable
SPCR |= (0<<DORD); // Send MSB first
SPCR |= (1<<MSTR); // UC = Master
SPCR |= (1<<CPOL); // CLK positiv phase
SPCR |= (0<<CPHA); // Sampling data to begin
SPCR |= (1<<SPR1); // CLK / 64 = 125kHz
DDRB = (1<<PB1)|(1<<PB7); // Set MOSI and SCK output
DDRD = (1<<PD3); // Set SS output
}

void SPI_MasterTransmit(char adress, char cData)
{
SPDR = adress | 0x80; // Start transmission adress - write mode
while (!(SPSR & (1<<SPIF))); // Wait for transmission complete
SPDR = cData; // Start transmission data - transmit
while (!(SPSR & (1<<SPIF))); // Wait for transmission complete
}

void Chip_Select()
{
PORTD = (0<<PD3); //SS = 0
}

void Chip_Select_off()
{
PORTD |= (1<<PD3); //SS = 1
}

int main(void)
{
SPI_MasterInit(); // SPI Initialisierung

while (1)
{
Chip_Select(); // Chip Select
SPI_MasterTransmit(0x03, 0b10010101);
// Übergabe der Adresse & Daten an die Funktion SPI_MasterTransmit
Chip_Select_off(); // Chip Select off
_delay_us(200);
}
}
1]

Hier der C-Code für den Empfänger:
1]
#include <avr/io.h>
#include <util/delay.h>

void SPI_MasterInit(void)
{
SPCR |= (1<<SPE); // SPI enable
SPCR |= (0<<DORD); // Send MSB first
SPCR |= (1<<MSTR); // UC = Master
SPCR |= (1<<CPOL); // CLK positiv phase
SPCR |= (0<<CPHA); // Sampling data to begin
SPCR |= (1<<SPR1); // CLK / 64 = 125kHz
DDRB = (1<<PB1)|(1<<PB7); // Set MOSI and SCK output
DDRD = (1<<PD3); // Set SS output
}

void SPI_MasterTransmit(char adress)
{
SPDR = adress; // Start transmission adress - read mode
while (!(SPSR & (1<<SPIF))); // Wait for transmission complete
}

void Chip_Select()
{
PORTD = (0<<PD3); //SS = 0
}

void Chip_Select_off()
{
PORTD |= (1<<PD3); //SS = 1
}

int main(void)
{
SPI_MasterInit(); // SPI Initialisierung

while (1)
{
Chip_Select(); // Chip Select
SPI_MasterTransmit(0x03);
// Übergabe der Adresse an die Funktion SPI_MasterTransmit
Chip_Select_off(); // Chip Select off
_delay_us(200);
}
}
1]

Von TheBug am 10.08.2010 14:04

Wow, wie kommt man denn zu so einer Idee?

Ich würde doch mal empfehlen das Datenblatt und den Beispielcode zu dem Chip genauer anzusehen. Diese Chips sind keine quasi-transparenten SPI Brücken, die Benutzung ist deutlich komplizierter.

Von ledi am 10.08.2010 14:30

Naja Neutral, das habe ich schon gemacht. Leider gibt es im Datenblatt keinen Beispielcode sondern nur eine Beschreibung der Register.

Aber ich bin auch schon einen Schritt weiter - denke ich! Idea

Hier nun meine Theorie:
Im PN-Code Register des Transceivers gibt es einen default-Standard-Code.
Wenn ich nun zb. 0xAA (=1010 1010) übertragen möchte, dann muss ich softwarseitig jedes Bit mit dem PN-Code multiplizieren!

Bsp: Daten = 0xAA
PN-Code = 0x36, 0xF3, 0xAE, 0x22, 0x6C, 0x72, 0x5A, 0x1F

Das Produkt aus Daten und PN-Code muss ich nun übertragen!
Wie mache ich das am Besten? (In C)

Anzeige: