hallo, ik heb een simpele start opstelling gemaakt om het SPI gebeuren te testen, 1 master en 1 slave.
het gaat om de data v/d slave naar de master, in de slave staat deze in een array.
het probleem is, dat wanneer de SPI de 1e byte naar buiten shift, er eerst een aantal bytes komen met 0x00 (maar ik verwacht als 1e byte 0x255 (1e byte in de array)). dat aantal bytes met 0x00 is random. zodra de 1e byte uit de array verschijnt komt de hele array er correct achter aan.
in de datasheet staat, zodra de SS laag word start de SPI de pulstrein en shift zijn SPDR naar buiten, dan zou dus meteen de SPDR in de slave ook over de MISO naar de master moeten gaan.
als test heb ik nog in de slave SPDR = 0x255 dus zonder de hele array, en dat gaat wel goed. het lijkt hem dus echt in het array gebeuren te zitten.
ik test het een en ander met een logic analyzer, de blauwe lijn onder aan is de SS. (SS_TSOP).
ik hoop dat iemand hier ziet wat er nou fout gaat, alvast bedankt.
MASTER
c code:
//*******************************17-8-2019 TEST PSI****************************
//**********************************MASTER**************************************
#define F_CPU 1000000UL // 1 MHz int osc
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
int main(void)
{
char data;
DDRB |= (1<<PINB1)|(1<<PINB2)|(1<<PINB0); // SCK, MOSI and SS as outputs
DDRB &= ~(1<<PINB3); // MISO as input
DDRC = 0b11111111;
SPCR |= (1<<MSTR); // Set as Master
SPCR |= (1<<SPR0)|(1<<SPR1); // divided clock by 128
SPCR |= (1<<SPE); // Enable SPI
while(1)
{
_delay_ms(1);
PORTC &= ~(1 << PINC5); // maakt SS laag
SPDR = 0b01010101; // send the data
while(!(SPSR & (1<<SPIF))); // wait until transmission is complete
PORTC |= (1 << PINC5); // maakt SS hoog
}
}
SLAVE
c code:
//****************17-8-2019 TEST PSI*****************************************************
#define F_CPU 1000000UL // 1 MHz int osc
#include <avr/io.h>
#include <stdio.h>
#include <util/delay.h>
int testers [38] = {255, 0, 255, 0, 255, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,} ;
int bytenr;
int data;
//*****************************SLAVE*********************************************
int main(void)
{
// char data;
DDRB &= ~((1<<PINB7)|(1<<PINB5)|(1<<PINB4)); // SCK, MOSI and SS as inputs
DDRB |= (1<<PINB6); // MISO as output
SPCR &= ~(1<<MSTR); // Set as slave
SPCR |= (1<<SPR0)|(1<<SPR1); // divide clock by 128
SPCR |= (1<<SPE); // Enable SPI
while(1)
{
for (bytenr=0; bytenr<38; bytenr++)
{
while(!(SPSR & (1<<SPIF))); // wait until all data is received
SPDR = testers[bytenr]; // hurray, we now have our data
}
}
}