Есть такая проблемка, подключаю трансивер DP1205 к AtMega8 и при обращении по SPI, Mega зависает.
Зависание происходит абсолютно непредсказуемо, иногда сразу после включения, иногда после нескольких минут работы.
Программу(WinAVR) максимально упростил, читаю и пишу в один из регистров, но всё равно виснет. может SPI неправильно настроен? Помогите разобраться плиз
Код
#include <avr/io.h>
#include <util/delay.h>
void init(void) //инициализация
{
DDRC |= (1 << 5); //сделать выходом
DDRD |= (1 << 4); //сделать выходом
DDRD |= (1 << 5); //сделать выходом
PORTD |= (1 << 4); //установка в 1 NSS_CONFIG
PORTD |= (1 << 5); //установка в 1 NSS_DATA
DDRB |= (1 << 3); //MOSI сделать выходом
DDRB |= (1 << 5); //SCK сделать выходом
SPCR = (1 << SPE)|(1 << MSTR)|(1 << SPR0);
}
void WriteConfig(char adres, char value)
{
adres = ((adres << 1) & 0x3F) | 0x01;
PORTD |= (1 << 5); //установка в 1 NSS_DATA
PORTD &= ~(1 << 4); //активация NSS_CONFIG
SPDR=adres;
while(!(SPSR & (1 << SPIF)));
SPDR=value;
while(!(SPSR & (1 << SPIF)));
PORTD |= (1 << 4); //деактивация NSS_CONFIG
}
char ReadConfig(char adres)
{
char value = 0;
PORTD |= (1 << 5); //установка в 1 NSS_DATA
adres = ((adres << 1) & 0x7F) | 0x41;
PORTD &= ~(1 << 4); //активация NSS_CONFIG
SPDR=adres;
while(!(SPSR & (1 << SPIF)));
value = SPDR;
PORTD |= (1 << 4); //деактивация NSS_CONFIG
return value;
}
void main (void)
{
char Data;
init();
while(1)
{
_delay_ms(100);
Data = ReadConfig(4);
if (Data > 0)
{
WriteConfig(4, 0x00);
PORTC |= (1 << 5);
}
else
{
WriteConfig(4, 0x01);
PORTC &= ~(1 << 5);
};
}; //конец цикла
} //конец
#include <util/delay.h>
void init(void) //инициализация
{
DDRC |= (1 << 5); //сделать выходом
DDRD |= (1 << 4); //сделать выходом
DDRD |= (1 << 5); //сделать выходом
PORTD |= (1 << 4); //установка в 1 NSS_CONFIG
PORTD |= (1 << 5); //установка в 1 NSS_DATA
DDRB |= (1 << 3); //MOSI сделать выходом
DDRB |= (1 << 5); //SCK сделать выходом
SPCR = (1 << SPE)|(1 << MSTR)|(1 << SPR0);
}
void WriteConfig(char adres, char value)
{
adres = ((adres << 1) & 0x3F) | 0x01;
PORTD |= (1 << 5); //установка в 1 NSS_DATA
PORTD &= ~(1 << 4); //активация NSS_CONFIG
SPDR=adres;
while(!(SPSR & (1 << SPIF)));
SPDR=value;
while(!(SPSR & (1 << SPIF)));
PORTD |= (1 << 4); //деактивация NSS_CONFIG
}
char ReadConfig(char adres)
{
char value = 0;
PORTD |= (1 << 5); //установка в 1 NSS_DATA
adres = ((adres << 1) & 0x7F) | 0x41;
PORTD &= ~(1 << 4); //активация NSS_CONFIG
SPDR=adres;
while(!(SPSR & (1 << SPIF)));
value = SPDR;
PORTD |= (1 << 4); //деактивация NSS_CONFIG
return value;
}
void main (void)
{
char Data;
init();
while(1)
{
_delay_ms(100);
Data = ReadConfig(4);
if (Data > 0)
{
WriteConfig(4, 0x00);
PORTC |= (1 << 5);
}
else
{
WriteConfig(4, 0x01);
PORTC &= ~(1 << 5);
};
}; //конец цикла
} //конец
P.S. На PORTC 5 подключён светодиод, при зависании перестаёт моргать