Witam,
Pierwszy raz próbuję komunikować po SPI atmega8 z atmega168 i mam z tym problem.
Mega168 jest masterem, w jego programie wywołuje procedurę SPI_MasterInit() a następnie co sekundę SPI_MasterTransmit(char cData).
I tu pojawia się pierwszy problem: podglądając oscyloskopem statusy linii mam przebieg zegara nie na SCK ale na SS, na MOSI stan zmienia sie cyklicznie 0,1 ale ze znacznie mniejsza czestotliwoscia niż przebieg zegara tak jak by to był sygnał SS. Stan SCK i MISO to zawsze stan niski.
W atemega8 wywołuje procedurę SPI_SlaveInit() i nastepnie w procedurze przerwania interrupt [SPI_STC] void spi_isr() zmieniam wartosc zmiennej spichar by wykryć czy w ogóle przerwanie miało miejsce - czy coś zostało odebrane ale przerwanie bez wzgledu czy układy połaczone sa standardowo: MISO-MISO, MOSI-MOSI,SCK-SCK, SS-SS czy też tak jak ja interpretuje je po przebiegach, to procedura przerwania nie jest wykonywana.
Proszę o pomoc w analizie co robie źle. Sieć przeszukałem ale nie znalazłem rozwiązania mojego problemu.
Pierwszy raz próbuję komunikować po SPI atmega8 z atmega168 i mam z tym problem.
Mega168 jest masterem, w jego programie wywołuje procedurę SPI_MasterInit() a następnie co sekundę SPI_MasterTransmit(char cData).
I tu pojawia się pierwszy problem: podglądając oscyloskopem statusy linii mam przebieg zegara nie na SCK ale na SS, na MOSI stan zmienia sie cyklicznie 0,1 ale ze znacznie mniejsza czestotliwoscia niż przebieg zegara tak jak by to był sygnał SS. Stan SCK i MISO to zawsze stan niski.
W atemega8 wywołuje procedurę SPI_SlaveInit() i nastepnie w procedurze przerwania interrupt [SPI_STC] void spi_isr() zmieniam wartosc zmiennej spichar by wykryć czy w ogóle przerwanie miało miejsce - czy coś zostało odebrane ale przerwanie bez wzgledu czy układy połaczone sa standardowo: MISO-MISO, MOSI-MOSI,SCK-SCK, SS-SS czy też tak jak ja interpretuje je po przebiegach, to procedura przerwania nie jest wykonywana.
Proszę o pomoc w analizie co robie źle. Sieć przeszukałem ale nie znalazłem rozwiązania mojego problemu.
#define SPIF 7
#define SPIE 7
#define SPE 6
#define MSTR 4
#define SPR0 0
#define DIR_MOSI DDRB.3
#define DIR_MISO DDRB.4
#define DIR_SCK DDRB.5
#define DIR_SS DDRB.2
#define d_INPUT 0
#define d_OUTPUT 1
#define d_I_NO_PULLUP 0
#define d_I_PULLUP 1
#define d_Q_INIT0 0
#define d_Q_INIT1 1
void SPI_MasterInit()
{
DIR_MOSI = d_OUTPUT; // Set MOSI and SCK output, all others input
DIR_MISO = d_INPUT;
DIR_SCK = d_OUTPUT;
DIR_SS = d_OUTPUT;
SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR0); // Enable SPI, Master, set clock rate fck/16
}
void SPI_SlaveInit()
{
DIR_MOSI = d_INPUT; // Set MISO output, all others input
DIR_MISO = d_OUTPUT;
DIR_SCK = d_INPUT;
DIR_SS = d_INPUT;
SPCR = (1<<SPE); // Enable SPI
}
void SPI_MasterTransmit(char cData)
{
SPDR = cData; // Start transmission
while(!(SPSR & (1<<SPIF))); // Wait for transmission complete
}
char SPI_SlaveReceive()
{
while(!(SPSR & (1<<SPIF))); // Wait for reception complete
return SPDR;
}
interrupt [SPI_STC] void spi_isr()
{
spichar = 88; //SPI_SlaveReceive();
}
