Частота SPI - 1МГц.
Проверяю как. Беру отправляю байт с АРМа, и ожидаю каких то
импульсов на PORTD.7/ PORTD.6 AVRa. Их конечно же нету.
на ARMе получаю первый байт 0b11001100. как и ожидалось. а
последующее - тэ которые посылал с АРМа. Тоесть данные возвращаются,
что свидетельствует о том что они не были программно принятые в AVRе.
Исходний код AVRа (проект в CodeVisionAVR):
Код
#include <MEGA8535.H>
#include <stdio.h>
#include <delay.h>
#include "header.h"
interrupt [SPI_STC] void spi_isr(void)
{
unsigned char data;
PORTD.6 = 0;
PORTD.6 = 1;
// Clear the SPI interrupt flag
#asm
in r30,spsr
#endasm
data = SPDR;
PORTD.6 = 0;
}
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 */
DDRB.6 = 1; //DDR_SPI = (1<<DD_MISO);
// SPI initialization
// SPI Type: Slave
// SPI Clock Phase: Cycle Half
// SPI Clock Polarity: Low
// SPI Data Order: MSB First
// SPCR=0xC0;
SPCR=0x80;
SPSR=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))) {}; // <<< --- Такое ощущение, что здесь программа уходит в ступор
tmp = SPDR;
tmp = SPSR;
tmp = tmp & 0b10000000;
if (tmp)
{
PORTD.7 = 0;
PORTD.7 = 1;
PORTD.7 = 0;
}
// delay_ms(1000);
};
}
#include <stdio.h>
#include <delay.h>
#include "header.h"
interrupt [SPI_STC] void spi_isr(void)
{
unsigned char data;
PORTD.6 = 0;
PORTD.6 = 1;
// Clear the SPI interrupt flag
#asm
in r30,spsr
#endasm
data = SPDR;
PORTD.6 = 0;
}
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 */
DDRB.6 = 1; //DDR_SPI = (1<<DD_MISO);
// SPI initialization
// SPI Type: Slave
// SPI Clock Phase: Cycle Half
// SPI Clock Polarity: Low
// SPI Data Order: MSB First
// SPCR=0xC0;
SPCR=0x80;
SPSR=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))) {}; // <<< --- Такое ощущение, что здесь программа уходит в ступор
tmp = SPDR;
tmp = SPSR;
tmp = tmp & 0b10000000;
if (tmp)
{
PORTD.7 = 0;
PORTD.7 = 1;
PORTD.7 = 0;
}
// delay_ms(1000);
};
}
Что я делаю не так ? Есть какие то идеи ?