Хочу соединить чип памяти с МК через SPI.
Поскольку опыта работы с МК мало, с SPI вообще нет и немного умею в Proteus - решил сначала разобраться с протоколом SPI с помошью AVRStudio(C) и ISIS Proteus.
Взял ATmega8 и SPI Debugger. Пытаюсь передать и считать байт.
Вот написал функции:
CODE:
#define TRYES 16 // количество попыток
void SPI_init()
{
SPCR = 0b11010000;
// включить SPI
// режим MASTER
// разрешить прерывания от модуля SPI
// делитель скорости - 4
// полярность +
// фаза - по наростающему фронту
}
unsigned char SPI_WriteByte(unsigned char byte)
{
unsigned char ntry = 0;
while(1)
{
if(ntry >= TRYES)
return 0; // ошибка
if((SPSR & 0b10000000) == 0b00000000) // если модуль SPI свободен
SPDR = byte;
else
{
ntry++;
continue;
}
if((SPSR & 0b01000000) == 0b00000000) // если небыло конфликта записи
while((SPSR & 0b10000000) == 0b10000000) // пока не кончится передача
{}
else
{
ntry++;
continue;
}
break;
}
return 1;
}
unsigned char SPI_ReadByte(unsigned char *byte)
{
unsigned char ntry = 0;
while(1)
{
if(ntry >= TRYES)
return 0; // ошибка
if((SPSR & 0b10000000) == 0b00000000) // если модуль SPI занят(предполагается что он ожидает чтения байта)
*byte = SPDR;
else
{
ntry++;
continue;
}
if((SPSR & 0b01000000) == 0b00000000) // если небыло конфликта записи
break;
else
{
ntry++;
continue;
}
}
return 1;
}
#define TRYES 16 // количество попыток
void SPI_init()
{
SPCR = 0b11010000;
// включить SPI
// режим MASTER
// разрешить прерывания от модуля SPI
// делитель скорости - 4
// полярность +
// фаза - по наростающему фронту
}
unsigned char SPI_WriteByte(unsigned char byte)
{
unsigned char ntry = 0;
while(1)
{
if(ntry >= TRYES)
return 0; // ошибка
if((SPSR & 0b10000000) == 0b00000000) // если модуль SPI свободен
SPDR = byte;
else
{
ntry++;
continue;
}
if((SPSR & 0b01000000) == 0b00000000) // если небыло конфликта записи
while((SPSR & 0b10000000) == 0b10000000) // пока не кончится передача
{}
else
{
ntry++;
continue;
}
break;
}
return 1;
}
unsigned char SPI_ReadByte(unsigned char *byte)
{
unsigned char ntry = 0;
while(1)
{
if(ntry >= TRYES)
return 0; // ошибка
if((SPSR & 0b10000000) == 0b00000000) // если модуль SPI занят(предполагается что он ожидает чтения байта)
*byte = SPDR;
else
{
ntry++;
continue;
}
if((SPSR & 0b01000000) == 0b00000000) // если небыло конфликта записи
break;
else
{
ntry++;
continue;
}
}
return 1;
}
Собрал схему:
пытаюсь чтот там писать читать, а вылазит такой сигнал
Подозрительные значения напряжения получаются.
И не разберу как настроить SPI Debugger чтоб он показывал что принимает и передавал что укажу.
Помогите пожалуйста, знатоки.