////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // ATmega8: // RC - 8 МHz; фьюзы: Low E4; Higt D9; // начальное: RC - 1 МHz; фьюзы: Low E1; Higt D9; // кварц - 8 МHz; фьюзы: Low EF; Higt C9 (CKOPT -on); XTAL2 – выход ----V // кварц - 8 МHz; фьюзы: Low EF; Higt D9 (CKOPT -off); // XTAL1 – вход; фьюзы: Low E0; Higt D9 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // nRF24L01+ : // преамбула - 10101010 - По умолчанию // адрес - 11100111 11100111 11100111 11100111 11100111 - (0xE7E7E7E7E7) - По умолчанию // Data - (LSB) 00000000 ........ 00000000 (MSB) - 1 // CRC-16 - 00000000 00000000 - (X16+ X12 + X5 + 1) - Начальное 0xFFFF. // // 1 / 250.000 kbps; 1 бит = 0,000 004с. // пакет - 9 х 8 = 72 бит. // пакет - 0,000 004с х 72 бит = 0,000 288с пакет + 0,000 130с PLL = 0,000 418с. (2.392 пак/c). ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // Настройка: // 0x00 CONFIG: // 0... .... 0 // .0.. .... MASK_RX_DR, 1: Interrupt not reflected on the IRQ pin // ..1. .... MASK_TX_DS, 1: Interrupt not reflected on the IRQ pin // ...1 .... MASK_MAX_RT, 1: Interrupt not reflected on the IRQ pin // .... 1... EN_CRC, 1: Enable CRC. // .... .1.. CRCO, 1: 2 bytes // .... ..1. PWR_UP, 1: POWER UP, 0:POWER DOWN // .... ...0 PRIM_RX, 1: RX, 0: TX ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // RX Addresses (Enhanced ShockBurst ™): - ОТКЛЮЧИТЬ. // 0x01 EN_AA: // 0000 0000 //Отключить Усовершенствованный формат (Enhanced ShockBurst ™), Установите регистр EN_AA = 0x00 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // Длина Адрес: // 0x03 SETUP_AW: (3,4,5 bytes) // 0... .... 0 // .0.. .... 0 // ..0. .... 0 // ...0 .... 0 // .... 0... 0 // .... .0.. 0 // .... ..1. 1 Адрес // .... ...1 1 Адрес // '00' - 2 байта, (много помех). // '01' - 3 байта, // '10' - 4 байта, // '11' - 5 байтов - 0xE7E7E7E7E7 (11100111 11100111 11100111 11100111 11100111) - По умолчанию ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //Automatic Retransmission (автоматическая ретрасляция)(Enhanced ShockBurst ™): - ОТКЛЮЧИТЬ. // 0x04 SETUP_RETR: // 0000 0000 //Отключить Усовершенствованный формат (Enhanced ShockBurst ™), Установите регистр EN_AA = 0x00 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // Частота: F0 = 2400 + RF_CH [МГц] 2.400GHz до 2.525GHz. 00000000(0)...01111101(125) // 0x05 RF_CH RF Channel: // 0... .... 0 // .0.. .... 0 // ..0. .... 0 // ...0 .... 0 // .... 0... 0 // .... .0.. 0 // .... ..1. 1 - по умолчанию 2.402GHz // .... ...0 0 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // Скорость передачи и Выходная мощность: // 0x06 RF_SETUP: // 0... .... CONT_WAVE - Позволяет выполнять непрерывную передающую несущую при высокой. // .0.. .... 0 // ..1. .... RF_DR_LOW - Set RF Data Rate до 250kbps. См RF_DR_HIGH для кодирования. // ...0 .... PLL_LOCK - сигнал блокировки / W Force ФАПЧ. Используется только в тесте // .... 0... RF_DR_HIGH - Выбор между скоростями передачи данных с высокой скоростью. // Этот бит это не волнует, если RF_DR_LOW установлен.Кодирование: // [RF_DR_LOW, RF_DR_HIGH]: // '00' - 1 Мбит // '01' - 2 Мбит - по умолчанию // '10' - 250kbps ------------------------------------ // '11' - Зарезервировано // .... .1.. RF_PWR 2:1 - Set Выходная мощность в режиме TX // .... ..1. RF_PWR 2:1 - Set Выходная мощность в режиме TX // '00'-18dBm - 0,015 mW // '01'-12dBm - 0,063 mW // '10'-6dBm - 0,251 mW // '11'-0dBm - 1,000 mW - по умолчанию -------------- // .... ...0 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // Адрес приёмника: // 0x0A RX_ADDR_P0: // .... .... 0xE7 - LSB. - Сначала записывается LSB. // .... .... 0xE7 - // .... .... 0xE7 - // .... .... 0xE7 - // .... .... 0xE7 - MSB. // 5 байтов - 0xE7E7E7E7E7 (11100111 11100111 11100111 11100111 11100111) - По умолчанию ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // Адрес предатчика: // 0x10 RX_ADDR_P0: // .... .... 0xE7 - LSB. - Сначала записывается LSB. // .... .... 0xE7 - // .... .... 0xE7 - // .... .... 0xE7 - // .... .... 0xE7 - MSB. // 5 байтов - 0xE7E7E7E7E7 (11100111 11100111 11100111 11100111 11100111) - По умолчанию ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // Длина полезной нагрузки для приёмника: // 0x11 RX_PW_P0: // 0... .... 0 // .0.. .... 0 // ..0. .... 1 byte // ...0 .... 1 byte // .... 0... 1 byte // .... .0.. 1 byte // .... ..0. 1 byte // .... ...1 1 byte // 000000 = 0 byte // ... // 100000 = 32 byte ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // Совместимость: // Отключить Усовершенствованный формат (Enhanced ShockBurst ™), Установите регистр EN_AA = 0x00 и ARC = 0, // 0x01 EN_AA: = 0b00000000 // 0x04 SETUP_RETR: = 0b00000000 // Формат пакета (ShockBurst ™): преамбула, адрес, полезная нагрузка, поле CRC (Контрольная сумма не является обязательным в формате ShockBurst ™). ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // IRQ: // Процедура обработки прерывания: //////////////////////////////////////////////////////////////////////////////////////////// TX: PORTB.2=0; // SS SPDR=0b00100111; while(!(SPSR & (1<<7)));// 0x07 STATUS: SPDR=0b00100000; while(!(SPSR & (1<<7)));// сброс флаг IRQ=1. TX_DS - окончание передачи. PORTB.2=1; // SS ////////////////////////////////////////////// PORTB.2=0; // SS SPDR=0b00100000; while(!(SPSR & (1<<7)));// 0x00 CONFIG: SPDR=0b01011110; while(!(SPSR & (1<<7)));// маска TX IRQ=0, CRC=2, POWER=1, TX=0. PORTB.2=1; // SS ////////////////////////////////////////////// вкл. TX: PORTB.1=1; // CE 1; вкл. TX //////////////////////////////////////////// запись в TX FIFO: PORTB.2=0; // SS SPDR=0b10100000; while(!(SPSR & (1<<7))); // запись в TX FIFO ///////////////////// SPDR=k; while(!(SPSR & (1<<7))); // k // кнопки SPDR=k; while(!(SPSR & (1<<7))); // k // кнопки SPDR=k; while(!(SPSR & (1<<7))); // k // кнопки SPDR=k; while(!(SPSR & (1<<7))); // k // кнопки SPDR=k; while(!(SPSR & (1<<7))); // k // кнопки SPDR=k; while(!(SPSR & (1<<7))); // k // кнопки ////////////////////// PORTB.2=1; // SS - старт TX //////////////////////////////////////////// while(PINB.0==1); // IRQ. Ждём окончания передачи TX: пакет - 250kbps; 0,000.512с. ////////////////////////////////////////////// выкл. TX: PORTB.1=0; // CE 0; выкл. TX //////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////// вкл. RX: PORTB.2=0; // SS SPDR=0b00100111; while(!(SPSR & (1<<7)));// 0x07 STATUS: SPDR=0b01000000; while(!(SPSR & (1<<7)));// сброс флаг IRQ=1. RX_DR - приём. PORTB.2=1; // SS ////////////////////////////////////////////// PORTB.2=0; // SS SPDR=0b00100000; while(!(SPSR & (1<<7)));// 0x00 CONFIG: SPDR=0b00111111; while(!(SPSR & (1<<7)));// маска RX IRQ=0, CRC=2, POWER=1, RX=1. PORTB.2=1; // SS ////////////////////////////////////////////// вкл. RX: PORTB.1=1; // CE 1; вкл. RX //////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////// задержка... ждём ответ от RX: delay_ms(10); // ждём ответ мин. 3mc + // 32 пак/c. цикл 0,031.25c. //////////////////////////////////////////////////////////////////////////////////////////// // Data: кнопки - кнопки - кнопки - кнопки - кнопки - кнопки - CRC16 - CRC16. //////////////////////////////////////////////////////////////////////////////////////////// выкл. RX: PORTB.1=0; // CE 0; выкл. RX //////////////////////////////////////////////////////////////////////////////////////////// RX FIFO if (PINB.0==1) { delay_us(1200); // коррекция читать RX FIFO + CRC // SPI = 1 Мгц goto mesto_1; // RX FIFO - пуст > сброс }; //////////////////////////////////////////////////////////////////////////////////////////// mesto_12: ///////////////////////////////////////////// читать RX FIFO: -0,1mc PORTB.2=0; // SS SPDR=0b01100001; while(!(SPSR & (1<<7))); // читать RX FIFO ////////////////////// SPDR=0; while(!(SPSR & (1<<7))); n1=SPDR; // SPI пустой // n1 // индикатор SPDR=0; while(!(SPSR & (1<<7))); n1=SPDR; // SPI пустой // n1 // индикатор SPDR=0; while(!(SPSR & (1<<7))); n1=SPDR; // SPI пустой // n1 // индикатор SPDR=0; while(!(SPSR & (1<<7))); n1=SPDR; // SPI пустой // n1 // индикатор SPDR=0; while(!(SPSR & (1<<7))); n1=SPDR; // SPI пустой // n1 // индикатор SPDR=0; while(!(SPSR & (1<<7))); n1=SPDR; // SPI пустой // n1 // индикатор ////////////////////// PORTB.2=1; // SS ////////////////////////////////////////////// читать STATUS: PORTB.2=0; // SS SPDR=0xFF; while(!(SPSR & (1<<7))); x=SPDR; // SPI (NOP) // читать STATUS PORTB.2=1; // SS ////////////////////////////////////////////// флаг .... 111. - RX FIFO - пуст if ((x & 0b00001110)!=0b00001110) { goto mesto_12; // > читать RX FIFO }; ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // Переключения TX > RX > TX: // 1- настройка TX (0x00 CONFIG) // 2- Вкл. TX (PORTC.0=1; // выход CE вкл.) // 3- Выкл. TX (PORTC.0=0; // выход CE выкл.) // // 4- delay... Ждём окончания передачи TX: 1 / 250.000 kbps; 1 бит = 0,000 004с. 32 байт x (40x8=320 бит) х 0,000 004с. = 0,001.280c. // // 5- настройка RX (0x00 CONFIG) // 6- Вкл. RX (PORTC.0=1; // выход CE вкл.) // 7- Выкл. RX (PORTC.0=0; // выход CE выкл.) // 8- настройка TX (0x00 CONFIG) ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // Переключения Частота: F0 = 2400 + RF_CH [МГц] 2.400GHz до 2.525GHz. 00000000(0)...01111101(125) // 1- Выключить TX и RX. // 2- Изменить частоту. // 3- Включить TX или RX. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////// SPI DDRC.0=1; // выход CE PORTC.0=0; // выход CE DDRC.1=0; // вход IRQ PORTC.1=0; // вход IRQ DDRB.5=1; // выход SCK PORTB.5=0; // выход SCK DDRB.4=0; // вход MISO PORTB.4=0; // вход MISO DDRB.3=1; // выход MOSI PORTB.3=0; // выход MOSI DDRB.2=1; // выход SS (выход CSN) (в режиме мастер - настроить на выход)!!! PORTB.2=1; // выход SS (выход CSN +) delay_ms(100); // Power on reset 100ms // задержка ////////////////////////////////////////////////////////////////////////////////////// nRF24L01+ : // CONFIG: PORTB.2=0; // выход SS (выход CSN 0) SPDR=0b00100000; // SPI command - W_REGISTER 001. .... + регистр CONFIG 0x00: while(!(SPSR & (1<<7))); SPDR=0b00111110; // SPI data Bit - CRC=2 bytes, POWER=1, TX=0. while(!(SPSR & (1<<7))); PORTB.2=1; // выход SS (выход CSN +) // RX Addresses (Enhanced ShockBurst ™): - ОТКЛЮЧИТЬ. PORTB.2=0; // выход SS (выход CSN 0) SPDR=0b00100001; // SPI command - W_REGISTER 001. .... + регистр EN_AA 0x01: while(!(SPSR & (1<<7))); SPDR=0b00000000; // SPI data Bit - EN_AA = 0x00. while(!(SPSR & (1<<7))); PORTB.2=1; // выход SS (выход CSN +) // Длина Адреса: // 0x03 SETUP_AW: (3,4,5 bytes) PORTB.2=0; // выход SS (выход CSN 0) SPDR=0b00100011; // SPI command - W_REGISTER 001. .... + регистр SETUP_AW 0x11: while(!(SPSR & (1<<7))); SPDR=0b00000011; // SPI data Bit - SETUP_AW = 0x03 (5 bytes). while(!(SPSR & (1<<7))); PORTB.2=1; // выход SS (выход CSN +) // Отключить - Automatic Retransmission - Усовершенствованный формат (Enhanced ShockBurst ™): // 0x04 SETUP_RETR: PORTB.2=0; // выход SS (выход CSN 0) SPDR=0b00100100; // SPI command - W_REGISTER 001. .... + регистр SETUP_RETR 0x04: while(!(SPSR & (1<<7))); SPDR=0b00000000; // SPI data Bit - ARC = 0. while(!(SPSR & (1<<7))); PORTB.2=1; // выход SS (выход CSN +) // Частота: F0 = 2400 + RF_CH [МГц] 2.400GHz до 2.525GHz. 00000000(0)...01111101(125) // 0x05 RF_CH RF Channel: PORTB.2=0; // выход SS (выход CSN 0) SPDR=0b00100101; // SPI command - W_REGISTER 001. .... + регистр RF_CH 0x05: while(!(SPSR & (1<<7))); SPDR=0b00000000; // SPI data Bit - 2.400GHz. while(!(SPSR & (1<<7))); PORTB.2=1; // выход SS (выход CSN +) // Скорость передачи и Выходная мощность: // 0x06 RF_SETUP: PORTB.2=0; // выход SS (выход CSN 0) SPDR=0b00100110; // SPI command - W_REGISTER 001. .... + регистр RF_SETUP 0x06: while(!(SPSR & (1<<7))); SPDR=0b00100110; // SPI data Bit - 250kbps, -0dBm. while(!(SPSR & (1<<7))); PORTB.2=1; // выход SS (выход CSN +) // Длина полезной нагрузки для приёмника: // 0x11 RX_PW_P0: PORTB.2=0; // выход SS (выход CSN 0) SPDR=0b00110001; // SPI command - W_REGISTER 001. .... + регистр RX_PW_P0 0x11: while(!(SPSR & (1<<7))); SPDR=0b00000001; // SPI data Bit - 1 while(!(SPSR & (1<<7))); PORTB.2=1; // выход SS (выход CSN +) ///////////////////////////////////////////////////////////////////////////////// программный SPI char tx; // tx - SPI char rx; // rx - SPI char mask; // mask - SPI /////////////////////////////////////////////////////////// программный SPI/4МГц/150.000 кГц. void SPI(void) { rx=0; // сброс RX mask=0b10000000; do { if (tx & mask) PORTB.0 = 1;// выход MOSI else PORTB.0 = 0;// выход MOSI delay_us(2); PORTB.5=1; // выход SCK if (PINB.4) rx |= mask; // вход MISO PORTB.5=0; // выход SCK mask=(mask>>1); } while (mask); delay_us(2); PORTB.0 = 0; // сброс MOSI } /////////////////////////////////////////////////////////// tx=0; SPI(); x=rx; //////////////////////////////////////////////////////////////////////////////////////////////////////