I sad - problem. "monitoring" preko Serial.print-a (arduino, dakako) pokazuje da se povremeno javljaju greške u čitanju iz registra, odnosno, da primljeni bajt ne odgovara onom prethodnom poslanom. Npr. bio je broj 55 pa je sad na redu broj 56, pošalje na SPI broj 56, a ne primi sa SPI-a prethodni 55, nego 54, dakle, ne prošlu vrijednost, nego pretprošlu. To se događa na svim prescalerima, dakle, i na najvećoj i na najmanjoj brzini komunikacije. Otprilike je 5-10% bajtova krivih, ostali su OK. Jasno bi mi bili da ne valja niti jedan, ali ovo mi ne štima.
Pojava se javlja i kod svih brzina UART komunikacije prema računalu, s tim da je izraženija kod 115200 nego kod 9600 kbps.
I onda - očajnički potez pa šok i nevjerica. Postavim serisjku vezu prema PC-u na 500000 kbps i odjednom sistem radi bez ikakvih problema, ostavio sam ga sat vremena, nije prijavio niti jednu grešku (osim prve odmah u startu koja je posljedica stava "ne da mi se programirati bezveze").
Kakve veze ima brzina UART-a sa SPI komunikacijom?
prilog - kôd:
Code: Select all
byte i=0;
byte j=0;
int err=0;
void setup() {
/* Postavi MOSI, SCK i SS kao izlaze */
DDRB |= (1<<DDB5)|(1<<DDB3) |(1<<DDB2);
/*
SPCR: 7 6 5 4 3 2 1 0
SPIE SPE DORD MSTR CPOL CPHA SPR1 SPR0
SPR1, SPR0: 0 0 = f/4
0 1 = f/16
1 0 = f/64
1 1 = f/128
SPSR: 7 6 ----- 0
SPIF WCOL SPI2X
*/
SPCR = B01010000; //Omogući SPI, postavi Master, mod rada 0, prescaler na "najbrže"
SPSR |=1; //brzina SPI x 2
pinMode(4,OUTPUT);
pinMode(9,OUTPUT);
pinMode(6, OUTPUT);
//Reset registra 74HC595
digitalWrite(4,LOW);
digitalWrite(4, HIGH);
//Postavljanje registra 74HC595 na izlaze
digitalWrite(6,HIGH);
digitalWrite(6,LOW);
//Enable 74HC595
digitalWrite(9,LOW);
Serial.begin(500000);
}
void loop() {
for(i=0; i<=255;i++){
//SPI komunikacija
SPDR = i;
while(!(SPSR & (1<<SPIF)))
j=SPDR;
//Postavljanje registra 74HC595 na izlaze
PORTD |=B01000000;
// digitalWrite(6,HIGH);
PORTD &=B10111111;
// digitalWrite(6,LOW);
Serial.print(i);
Serial.print("\t");
Serial.print(j);
j++;
if (i==j){
Serial.print("\t OK");
}else{
if (i!=1) {
err++;
Serial.print("\t ERROR");
}
}
Serial.print("\t Broj gresaka:");
Serial.println(err);
}
}