////////////////////////////// программный SPI:
unsigned char x; // x - Data SPI
unsigned char tx; // tx - SPI
unsigned char rx; // rx - SPI
unsigned char mask; // mask - SPI
////////////////////////////// функция программный SPI:
void SPI(void)
{
rx=0; // сброс RX
mask=0b10000000;
do {
if (tx & mask) PORTA.1 = 1;// выход MOSI
else PORTA.1 = 0;// выход MOSI
delay_us(2);
PORTA.3=1; // выход SCK
if (PINA.0) rx |= mask; // вход MISO
PORTA.3=0; // выход SCK
mask=(mask>>1);
}
while (mask);
delay_us(2);
PORTA.1 = 0; // сброс MOSI
}
void main(void)
{
////////////////////////////////////////////// программный SPI:
DDRA.0=0; // MISO
PORTA.0=0; // MISO
DDRA.1=1; // MOSI
PORTA.1=0; // MOSI
DDRA.2=1; // SS
PORTA.2=1; // SS
DDRA.3=1; // SCK
PORTA.3=0; // SCK
////////////////////////////////////////////// TX, RX - Data SPI
tx=x; SPI(); x=rx;
//////////////////////////////////////////////
}
Всё работает. И в протеусе и в железе.
Намного сложней сделать программный Ethernet.
Добавлено after 18 minutes 8 seconds:
P.S.
Выше - это для всяких LCD экранчиков.
А для связи двух AVR надо добавить вывод SS (обязательно!). Тогда будет так:
////////////////////////////// программный SPI:
unsigned char x; // x - Data SPI
unsigned char tx; // tx - SPI
unsigned char rx; // rx - SPI
unsigned char mask; // mask - SPI
////////////////////////////// функция программный SPI:
void SPI(void)
{
rx=0; // сброс RX
mask=0b10000000;
do {
if (tx & mask) PORTA.1 = 1;// выход MOSI
else PORTA.1 = 0;// выход MOSI
delay_us(2);
PORTA.3=1; // выход SCK
if (PINA.0) rx |= mask; // вход MISO
PORTA.3=0; // выход SCK
mask=(mask>>1);
}
while (mask);
delay_us(2);
PORTA.1 = 0; // сброс MOSI
}
void main(void)
{
////////////////////////////////////////////// программный SPI:
DDRA.0=0; // MISO
PORTA.0=0; // MISO
DDRA.1=1; // MOSI
PORTA.1=0; // MOSI
DDRA.2=1; // SS
PORTA.2=1; // SS
DDRA.3=1; // SCK
PORTA.3=0; // SCK
////////////////////////////////////////////// TX, RX - Data SPI
PORTA.2=0; // SS
tx=x; SPI(); x=rx;
PORTA.2=1; // SS
//////////////////////////////////////////////
}
А давайте лучше сделаем программный Ethernet. Он интересней ))


