Autor |
Probleme bei der Datenübertragung mit Cypress Transeiver |
|
|
|
|
BID = 706730
ledi Gerade angekommen
Beiträge: 2 Wohnort: Graz
|
|
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üsste ich die übertragenen Daten am MISO-Pin des Empfänger-Transceivers mit dem Oszi zu messen sein.
Alle Register des Transceivers wurden in der Grundeinstellung belassen.
Hier der C-Code:
Code : |
/**************************************** *
* Prozessor: AT90PWM316 *
* Clock: Osz. int.8MHz *
******************************************/
#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
}
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 |= !(1<<PD3); //SS = 0
}
void Chip_Select_off()
{
PORTD |= (1<<PD3); //SS = 1
}
int main(void)
{
DDRD |= (1<<PD3);
SPI_MasterInit(); // SPI Initialisierung
while (1)
{
Chip_Select(); // Chip Select
SPI_MasterTransmit(0x03, 0b10000101);
// Übergabe der Daten an die Funktion SPI_MasterTransmit
Chip_Select_off(); // Chip Select off
}
}
|
|
/**************************************** *
* Prozessor: AT90PWM316 *
* Clock: int.8MHz *
******************************************/
#include <avr/io.h>
#include <util/delay.h>
void SPI_MasterInit(void) // Init SPI
{
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
}
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 |= !(1<<PD3); //SS = 0
}
void Chip_Select_off()
{
PORTD |= (1<<PD3); //SS = 1
}
int main(void)
{
DDRD |= (1<<PD3);
SPI_MasterInit(); // SPI Initialisierung
while (1)
{
Chip_Select(); // Chip Select
SPI_MasterTransmit(0x03, 0b10000101);
// Übergabe der Daten an die Funktion SPI_MasterTransmit
Chip_Select_off(); // Chip Select off
}
}
|
|
BID = 706737
Jornbyte Moderator
Beiträge: 7170
|
|
Schalte den SS Pin (PD3) vom AVR auf Ausgang, dann sollte es gehen.
_________________
mfg Jornbyte
Es handelt sich bei dem Tipp nicht um eine Rechtsverbindliche Auskunft und
wer Tippfehler findet, kann sie behalten.
[ Diese Nachricht wurde geändert von: Jornbyte am 9 Aug 2010 18:39 ] |
|
BID = 706741
ledi Gerade angekommen
Beiträge: 2 Wohnort: Graz
|
hab ich bereits gemacht:
DDRD |= (1<<PD3);
|
BID = 706775
Jornbyte Moderator
Beiträge: 7170
|
Ich betreibe eine SD-Card mit diesen Einstellungen an einem 1284P:
SPCR = (0 << SPIE) | // SPI Interrupt Enable
(1 << SPE) | // SPI Enable
(0 << DORD) | // Data Order: MSB first
(1 << MSTR) | // Master mode
(0 << CPOL) | // Clock Polarity: SCK low when idle
(0 << CPHA) | // Clock Phase: sample on rising SCK edge
(1 << SPR1) | // Clock Frequency: f_OSC / 128
(1 << SPR0);
SPSR &= ~(1 << SPI2X); // No doubled clock frequency
_________________
mfg Jornbyte
Es handelt sich bei dem Tipp nicht um eine Rechtsverbindliche Auskunft und
wer Tippfehler findet, kann sie behalten.
|
BID = 706776
clembra Inventar
Beiträge: 5404 Wohnort: Weeze / Niederrhein
|
Zitat :
|
void Chip_Select()
{
PORTD |= !(1<<PD3); //SS = 0
}
|
Hierzu hat DonComi vor einigen Tagen einen netten Merkzettel verfasst. Das muss wohl "PORTD &= ~(1<<PD3)" heißen. So wie du es geschrieben hast werden höchstens die anderen 7 Pins aktiviert. Jedenfalls wird PD3 nicht auf Gnd geschaltet.
_________________
Reboot oder be root, das ist hier die Frage.
|