Как управлять ATMega с компьютера, средствами SPI ?Необходимо твердо в этом вопросе разобраться и для себя уяснить что и как. Поэтому поставил себе следующие условия простой задачи:
Мега, получает с ПК управляющий код (байт), анализирует его и выполняет какое то определенное действие (пускай будет моргать светодиодами на порту). Используется SPI, мега получается в режиме salve.Схема к данной задачи:

После моих проб, ошибок и советов добрых людей получилось 2 реализации:
* Программирую в CodeVisionAVR
1. С использованием примера из даташита atmega16 (стр. 132)Код
#include <mega16.h>
#define DDR_SPI DDRB
#define DD_MISO PORTB.6
// Управляющие коды, которые могут быть переданы
#define CMD1 0x01
#define CMD2 0x02
#define CMD3 0x03
#define CMD4 0x04
void SPI_SlaveInit(void)
{
/* Set MISO output, all others input */
DDR_SPI = (1 << DD_MISO);
/* Enable SPI */
SPCR = (1 << SPE);
}
unsigned char SPI_SlaveReceive(void)
{
/* Wait for reception complete */
while(!(SPSR & (1 << SPIF)))
;
/* Return data register */
return SPDR;
}
void main (void){
SPI_SlaveInit();
DDRA = 0xFF; // сделали порт A выходом
while (1){
// анализируем полученный ответ
switch(SPI_SlaveReceive())
{
case CMD1:
PORTA = 0x01;
break;
case CMD2:
PORTA = 0x01;
break;
case CMD3:
PORTA = 0x03;
break;
case CMD4:
PORTA = 0x04;
break;
default:
PORTA = 0xFF;
break;
}
};
}
2. С использованием стандартных функций в spi.h (а также codewizard'а в cvavr):Код
#include <mega16.h>
#include <spi.h>
// Управляющие коды, которые могут быть переданы
#define CMD1 0x01
#define CMD2 0x02
#define CMD3 0x03
#define CMD4 0x04
unsigned char read;
void main (void){
// инициализируем порты
PORTB=0x00;
DDRB=0x40; //тут SPI порт
PORTF=0x00;
DDRF=0xFF;
// инициализируем SPI
SPCR=0x40;
SPSR=0x00;
while (1){
read = spi(0x00);
/* [b]вот здесь мне непонятно что писать в качестве аргумента spi()? [без аргумента выдает ошибку]. [/b]*/
switch(read)
{
case CMD1:
PORTA = 0x01;
break;
case CMD2:
PORTA = 0x02;
break;
case CMD3:
PORTA = 0x03;
break;
case CMD4:
PORTA = 0x04;
break;
default:
PORTA = 0xFF;
break;
}
};
}
Проблема в том, что оба этих варианта не работают, и цели поставленной задачи достичь не удалось :cry:
Прошу помочь, натолкнуть в сторону где можно найти ошибку.