Паралельный пропускаем..
Ну и зря)) Он самый быстрый))
Конкретно как? В библе ардуино - без понятия)) знаю только как через регистры AVR...
а ардуина разве не умеет работать с регистрами ? должна... (где то видел)...
в SPI всего три регистра: ))
SPCR=0b01010000; // Регистр управления
// 0... .... SPIE разрешение прерывания...
// .1.. .... SPE разрешается работа SPI.
// ..0. .... DORD порядок сдвига данных DORD=0 первым передается старший разряд.
// ...1 .... MSTR (1-мастер, 0-подчиненный).
// .... 0... CPOL 0 = SCK имеет низкий уровень в состоянии ожидания. (полярность синхро).
// .... .0.. CPHA 0 = установка-задний фронт/выборка передий фронт SCK (фаза синхро).
// .... ..00 SPR1, SPR0
// где SPR1, SPR0 - это делитель частоты SPI:
// .... ..00 SPR1, SPR0 f/4 - SCK = кварц 4 Мгц/4 = 1 МГц (частота).
// .... ..01 SPR1, SPR0 f/16
// .... ..10 SPR1, SPR0 f/64
// .... ..11 SPR1, SPR0 f/128
SPSR=0b10000000; // Регистр статуса
// 1... .... Флаг SPIF завершении последовательной передачи. Сбрасывается при чтении SPDR .
// .1.. .... Флаг повторной записи (устанавливается, если выполнена запись в регистр данных SPI (SPDR) во
// время передачи данных).
// .... ...1 SPI2X - удвоенная скорость передачи. SCK = кварц 4 Мгц/2 = 2 МГц (частота).
// (период SCK будет равен двум периодам синхронизации ЦПУ).
// Если SPI работает как подчиненный, то работа SPI гарантирована только на частоте fosc /4 или менее.
SPDR=0b00000000; //Регистр данных SPI
//Запись в данный регистр инициирует передачу данных.
//При чтении данного регистра считывается содержимое приемного буфера сдвигового регистра.
Примеры (из даташита AVR):
1. Режим мастер:
=============
передача (мастер):
Одноуровневая система. Передающий буфер: SPDR > (сдвиговый регистр передатчика).
/* Настройка выводов*/
PORTB=0b00000000;
DDRB=0b00101100;
// SCK-Out (PB5)
// MISO-In (PB4)
// MOSI-Out (PB3)
// SS-Out (PB2)
while (1) {
PORTB.2=0; // SS- разрешение передачи в подчиненное устройство.
/* Запуск передачи данных в подчиненное устройство.*/
SPDR =x;
/* Ожидание завершения передачи данных. Ждём флаг SPIF. */
while(!(SPSR & (1<<7)));
PORTB.2=1; // SS- запрет передачи в подчиненное устройство.
/* Чтение принятых данных из подчиненного устройства.*/
x=SPDR;
};
2. Режим слейв:
==============
приём (подчиненный):
Двухуровневая система. Приёмный буфер: SPDR(1) + (сдвиговый регистр приёмника).
/* Настройка выводов*/
PORTB=0b00000000;
DDRB=0b00010000;
// SCK-In (PB5)
// MISO-Out (PB4)
// MOSI-In (PB3)
// SS-In (PB2)
Если на вывод SS подать высокий лог. уровень во время приёма, то подчиненный SPI
сбросит передающую и приемную логику и потеряет любые не полностью принятые
данные в сдвиговом регистре.
while (1) {
/* Ожидание завершения передачи от мастер. Ждём флаг SPIF.*/
while(!(SPSR & (1<<7)));
/* Чтение принятых данных из мастер*/
x=SPDR;
};
3. Режим мастер / слейв:
====================
мастер
char x;
char x1;
char x2;
char bufer[8]={0,0,0,0,0,0,0,0};
////////////////////////////////////////////// SPI аппаратный
DDRB.5=1; // SCK
PORTB.5=1; // SCK (!)
DDRB.4=0; // MISO
PORTB.4=0; // MISO
DDRB.3=1; // MOSI
PORTB.3=0; // MOSI
DDRB.2=1; // SS
PORTB.2=1; // SS
//////////////////////////////////// Master > Slave
PORTB.2=0; // SS
SPCR=0x50; // 4 МГц/4 = 1 МГц -мастер
SPDR=0b00000000; while(!(SPSR & (1<<7))); //
PORTB.2=1; // SS
SPCR=0x00; // 4 МГц/4 = 1 МГц -мастер
/////////////////////
x=SPDR;
///////////////////////////////////////////////////
//////////////////////////////////// Slave > Master
if (x==0x10) {
x2=0;
for (x1=1; x1<8; x1++) {
/////////////////////
PORTB.2=0; // SS
SPCR=0x50; // 4 МГц/4 = 1 МГц -мастер
SPDR=x1; while(!(SPSR & (1<<7))); // мастер
PORTB.2=1; // SS
SPCR=0x00; // 4 МГц/4 = 1 МГц -мастер
/////////////////////
bufer[x2]=SPDR;
x2++;
};
/////////////////////
PORTB.2=0; // SS
SPCR=0x50; // 4 МГц/4 = 1 МГц -мастер
SPDR=0b00000000; while(!(SPSR & (1<<7))); //
PORTB.2=1; // SS
SPCR=0x00; // 4 МГц/4 = 1 МГц -мастер
/////////////////////
bufer[x2]=SPDR;
};
//////////////////////////////////////////////////
4. Режим слейв (приём через прерывания):
====================
слейв
char x;
// SPI interrupt service routine
interrupt [SPI_STC] void spi_isr(void)
{
x=SPDR;
}
////////////////////////////////////////////// SPI аппаратный
DDRB.5=0; // SCK
PORTB.5=0; // SCK
DDRB.4=1; // MISO
PORTB.4=0; // MISO
DDRB.3=0; // MOSI
PORTB.3=0; // MOSI
DDRB.2=0; // SS
PORTB.2=0; // SS
//////////////////////////////////////////////
SPCR=0x40; // 4 МГц/4 = 1.000.000 Hz -Режим слейв
// Global enable interrupts
#asm("sei")
//////////////////////////////////////////////
///////////////////////////////////////////////
while (1) {
};
И т.д. )) Примерно так))
