PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : ATXMega64A3 SPI - keine Signale auf Pins



Che Guevara
09.01.2014, 10:56
Hi,

ich versuche gerade, die SPI Schnittstelle eines XMega64A3 zum laufen zu bekommen. Wenn ich Daten senden will und die Pins mit dem Oszi messe, tut sich allerdings nichts. Lediglich auf dem SCK Pin ist kurzzeitig etwas zu sehen. Ich hab mir schon die APP Note und den dazugehörigen Source Code von ATMEL angesehen, kann jedoch keine gravierenden Unterschiede erkennen. Am anderen Ende der Leitung hängt übrigens ein funktionsfähiger MPU6000 (3-Achs Gyro & Acc), getestet über I2C. Die Pins vom XMega funktionieren auch, hab sie toggln lassen zum überprüfen.
Hier mal mein Code:


/*
* MPU6000_SPI.c
*
* Created: 08.01.2014 19:35:10
* Author: Chris
*/


#define F_CPU 32000000UL

#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#include <string.h>
#include <util/twi.h>
#include <math.h>
#include <avr/eeprom.h>


#define SpiCWaitReceive while(!(SPIC.STATUS & SPI_IF_bm))


void InitClock(void);
void InitUart(USART_t *usart);
void WaitMs(uint16_t ms);
void SendUart(char data[], USART_t *usart, uint8_t crlf);

void InitSpi(SPI_t *spi);
void SpiWriteByte(uint8_t sendbyte , SPI_t *spi);
uint8_t SpiReadByte(SPI_t *spi);
uint8_t SpiTransceiveByte(SPI_t *spi , uint8_t TXSend);

void InitMpu(SPI_t *spi);
void ReadWhoIAm(SPI_t *spi);


uint8_t WhoIAm = 0;

char debug1[10];
char debug2[10];


int main(void)
{

InitClock();
PORTC.DIRSET = 0x08;
InitUart(&USARTC0);
InitSpi(&SPIC);

//InitMpu(&SPIC);

while(1)
{
SpiWriteByte(117,&SPIC);
//ReadWhoIAm(&SPIC);
itoa((int16_t)WhoIAm,debug1,10);
itoa((int16_t)SPIC.CTRL,debug2,2);
SendUart(debug1,&USARTC0,0);
SendUart(" : ",&USARTC0,0);
SendUart(debug2,&USARTC0,1);
WaitMs(250);
}
}

uint8_t SpiTransceiveByte(SPI_t *spi , uint8_t TXSend)
{
spi->DATA = TXSend;
SpiCWaitReceive;
return SpiReadByte(spi);
}

void InitMpu(SPI_t *spi)
{
spi->DATA = 25;
spi->DATA = 0;

spi->DATA = 26; //Configuration Register
spi->DATA = 0x03;
}

void ReadWhoIAm(SPI_t *spi)
{
WhoIAm = SpiTransceiveByte(&SPIC,117);
}

void SpiWriteByte(uint8_t sendbyte , SPI_t *spi)
{
spi->DATA = sendbyte;
}

uint8_t SpiReadByte(SPI_t *spi)
{
return spi->DATA;
}

void InitSpi(SPI_t *spi)
{
PORTC.DIRSET = 0xD0;
//
spi->CTRL = 0b01010010; //0b0101_00_10;
spi->INTCTRL = 0x00;
spi->STATUS = 0x00;
//
spi->CTRL |= 0x10; //set MasterBit
//
PORTC.DIRSET = 0xD0;
}

void InitClock(void)
{
OSC.CTRL |= OSC_RC32MEN_bm;
while(!(OSC.STATUS & OSC_RC32MRDY_bm));
CCP = CCP_IOREG_gc;
CLK.CTRL = CLK_SCLKSEL_RC32M_gc;
}

void InitUart(USART_t *usart)
{
usart->BAUDCTRLB = 0;
usart->BAUDCTRLA = 0x11;
usart->CTRLB = USART_TXEN_bm | USART_RXEN_bm;
usart->CTRLC = 0x03;
usart->CTRLA = 0;
}

void WaitMs(uint16_t ms)
{
for(ms;ms>=1;ms--)
{
_delay_ms(1);
}
}

void SendUart(char data[], USART_t *usart, uint8_t crlf)
{
char Counter = 0x00;
char lenght = 0x00;

lenght = strlen(data);

while(Counter < lenght)
{
while (!(usart->STATUS & USART_DREIF_bm));
usart->DATA = data[Counter];
Counter++;
}

Counter = 0x00;
if(crlf==1)
{
while (!( usart->STATUS & USART_DREIF_bm));
usart->DATA = 0x0D;
while (!( usart->STATUS & USART_DREIF_bm));
usart->DATA = 0x0A;
}
}

Vielleicht hat jemand von euch ja schonmal damit gearbeitet und kann mir helfen?!

Vielen Dank & Gruß
Chris

Che Guevara
09.01.2014, 15:11
Hi,

also ich hab jetzt den Fehler gefunden, ich hatte ausversehen MOSI auf Input und MISO auf Output gestellt...
Allerdings bräuchte ich wohl trotzdem noch ein paar Starthilfen, hab noch nie was mit SPI gemacht. Wie lese ich den jetzt ein Register aus? Ich dachts mir so:
Erst SS low machen, dann die Register Nummer senden (117), dann ein Dummy-Byte (0x00) und nun steht der Rückgabewert im DATA Register?
So funktionierts anscheinend nicht, muss ich wohl noch einwenig suchen.

Gruß
Chris