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:
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
Lesezeichen