Сегодня пробовал сделать на другом ATMega8535(из другой партии), и эщо на ATMega16. Результат тот же.
Получается что проблема все таки программная.
Тестировал такой код:
Код
#include <MEGA8535.H>
void main(void)
{
unsigned char tmp;
#asm ("cli") //Выкл. глоб. прерывания
// Input/Output Ports initialization
// Port A initialization
PORTA=0x00;
DDRA=0x00;
// Port B initialization
PORTB=0x00;
DDRB=0b00000111;
// Port C initialization
PORTC=0x00;
DDRC=0xFF;
// Port D initialization
PORTD=0x00;
DDRD=0b11000000;
// SPI initialization
/* Set MISO output, all others input */
DDRB.6 = 1; //DDR_SPI = (1<<DD_MISO);
SPCR=0x00;
// Clear the SPI interrupt flag
#asm
in r30,spsr
in r30,spdr
#endasm
/* Enable SPI */
SPCR |= (1<<SPE);
// Global enable interrupts
#asm("sei")
while (1)
{
SPDR = 0b11001100;
/* Wait for reception complete */
while(!(SPSR & (1<<SPIF))) {};
PORTD.6 = 1;
PORTD.6 = 0;
tmp = SPDR;
if (tmp == 0x81)
{
PORTD.7 = 1;
PORTD.7 = 0;
};
};
}
чтобы прояснить сложившуюся картину выложу Немного осциллограмм.
Ето ЧипСелект и Клок который генерирует Мастер (ARM):

Мастер постоянно передает посылку из 2 байт
Первый байт (0x81):

Второй байт (0x1e):

От АВРа получаю:
Первый байт:

Второй байт:

Третий байт:

Четвертый байт:

Тоесть если ресетнуть АВР то тогда в ответ на первую посылку получу первый и второй байт,
на вторую посылку - третий и четвертый байты, на третюю посылку снова получу третий и
четвертый байты ну и т.д.
Отсюда хорошо видно что третий и четвертый байты ето те которые посилал Мастер. Получается что все возвращается назад к АРМу.
Методом научного втыка нашел причину. Виной всему было вот ето:
while (1)
{
SPDR = 0b11001100;
/* Wait for reception complete */После того как убрал, и флаг начал выставляться, и прерывания начало работать.
Только теперь появилась новая проблема.
Вот исходный код преривания SPI:
Код
interrupt [SPI_STC] void spi_isr(void)
{
unsigned char data;
PORTD.6 = 1;
data = SPDR;
if (data == 0x81)
{
PORTD.7 = 0;
PORTD.7 = 1;
PORTD.7 = 0;
};
if (data == 0x1e)
{
PORTD.7 = 0;
PORTD.7 = 1;
PORTD.7 = 1;
PORTD.7 = 1;
PORTD.7 = 1;
PORTD.7 = 0;
};
PORTD.6 = 0;
}
Мастер постоянно посылает посылку из 2 байт. Первый байт - 0x81. Второй - 0x1e. Тоесть сначала мы должны
увидеть узкий импульс на PORTD.7 а потом шырокий.
А ето осциллограммы.


И с них четко видно что все наоборот. Тоесть в прерывании я получаю байт который физически был принят ещо в момент
предыдущей пересылки.
Это должно так быть ? Или снова какая то ерунда ?