Софт SPI на DigitalIO для nRF24L01+

Lictor
Offline
Зарегистрирован: 01.10.2015

Доброго времени суток.

В продолжение предыдущей проблемы. Решил подключить приемник по Софт SPI. Опирался на этот и этот форум. 

файл RF24_config.h в корневом каталоге библиотеки отредактировал так:

/*
 Copyright (C) 2011 J. Coliz <maniacbug@ymail.com>

 This program is free software; you can redistribute it and/or
 modify it under the terms of the GNU General Public License
 version 2 as published by the Free Software Foundation.
 */
 
 /* spaniakos <spaniakos@gmail.com>
  Added __ARDUINO_X86__ support
*/

#ifndef __RF24_CONFIG_H__
#define __RF24_CONFIG_H__

  /*** USER DEFINES:  ***/  
  //#define FAILURE_HANDLING
  //#define SERIAL_DEBUG
  //#define MINIMAL
  //#define SPI_UART  // Requires library from https://github.com/TMRh20/Sketches/tree/master/SPI_UART
  //#define SOFTSPI   // Requires library from https://github.com/greiman/DigitalIO
  
  /**********************/
  #define rf24_max(a,b) (a>b?a:b)
  #define rf24_min(a,b) (a<b?a:b)

  #if defined SPI_HAS_TRANSACTION && !defined SPI_UART && !defined SOFTSPI
    #define RF24_SPI_TRANSACTIONS
  #endif
 
 
//ATXMega
#if defined(__AVR_ATxmega64D3__) || defined(__AVR_ATxmega128D3__) || defined(__AVR_ATxmega192D3__) || defined(__AVR_ATxmega256D3__) || defined(__AVR_ATxmega384D3__) // In order to be available both in windows and linux this should take presence here.
  #define XMEGA
  #define XMEGA_D3
  #include "utility/ATXMegaD3/RF24_arch_config.h"
#elif ( !defined (ARDUINO) ) // Any non-arduino device is handled via configure/Makefile

  // The configure script detects device and copies the correct includes.h file to /utility/includes.h
  // This behavior can be overridden by calling configure with respective parameters
  // The includes.h file defines either RF24_RPi, MRAA, LITTLEWIRE or RF24_SPIDEV and includes the correct RF24_arch_config.h file
  #include "utility/includes.h"

//ATTiny  
#elif defined(__AVR_ATtiny25__) || defined(__AVR_ATtiny45__) || defined(__AVR_ATtiny85__) || defined(__AVR_ATtiny24__) || defined(__AVR_ATtiny44__) || defined(__AVR_ATtiny84__) || defined(__AVR_ATtiny2313__) || defined(__AVR_ATtiny4313__) || defined(__AVR_ATtiny861__)  
  #define RF24_TINY
  #include "utility/ATTiny/RF24_arch_config.h"


//LittleWire  
#elif defined(LITTLEWIRE)
  
  #include "utility/LittleWire/RF24_arch_config.h"

//Teensy  
#elif defined (TEENSYDUINO)

  #include "utility/Teensy/RF24_arch_config.h"  
//Everything else
#else 

  #include <Arduino.h>
  
  // RF modules support 10 Mhz SPI bus speed
  const uint32_t RF24_SPI_SPEED = 10000000;  

#if defined (ARDUINO) && !defined (__arm__) && !defined (__ARDUINO_X86__)
      #if defined SPI_UART
		#include <SPI_UART.h>
		#define _SPI uspi
	  #elif defined SOFTSPI
	  // change these pins to your liking
      //
const uint8_t SOFT_SPI_MISO_PIN = 47;
const uint8_t SOFT_SPI_MOSI_PIN = 49;
const uint8_t SOFT_SPI_SCK_PIN = 45;
  
      const uint8_t SPI_MODE = 0;
      #define _SPI spi
      
	  #else	    
		#include <SPI.h>
		#define _SPI SPI
	  #endif
#else
  // Define _BV for non-Arduino platforms and for Arduino DUE
  #include <stdint.h>
  #include <stdio.h>
  #include <string.h>


 #if defined(__arm__) || defined (__ARDUINO_X86__)
   #include <SPI.h>
 #endif

 
 #define _BV(x) (1<<(x))
 #if !defined(__arm__) && !defined (__ARDUINO_X86__)
   extern HardwareSPI SPI;
 #endif


  #define _SPI SPI
#endif

  #ifdef SERIAL_DEBUG
	#define IF_SERIAL_DEBUG(x) ({x;})
  #else
	#define IF_SERIAL_DEBUG(x)
	#if defined(RF24_TINY)
	#define printf_P(...)
    #endif
  #endif
  
#if  defined (__ARDUINO_X86__)
	#define printf_P printf
	#define _BV(bit) (1<<(bit))
#endif
  
// Progmem is Arduino-specific
// Arduino DUE is arm and does not include avr/pgmspace
#if defined (ARDUINO_ARCH_ESP8266)

  #define PSTR(x) (x)
  #define printf Serial.printf
  #define sprintf(...) os_sprintf( __VA_ARGS__ )
  #define printf_P printf
  #define strlen_P strlen  
  #define PROGMEM
  #define pgm_read_byte(addr) (*(const unsigned char *)(addr))
  #define pgm_read_word(p) (*(p))
  #define PRIPSTR "%s"

#elif defined(ARDUINO) && ! defined(__arm__) && !defined (__ARDUINO_X86__) || defined(XMEGA)
	#include <avr/pgmspace.h>
	#define PRIPSTR "%S"
#else
  #if ! defined(ARDUINO) // This doesn't work on Arduino DUE
	typedef char const char;
  #else // Fill in pgm_read_byte that is used, but missing from DUE
	#define pgm_read_byte(addr) (*(const unsigned char *)(addr))
  #endif


  typedef uint16_t prog_uint16_t;
  #define PSTR(x) (x)
  #define printf_P printf
  #define strlen_P strlen
  #define PROGMEM
  #define pgm_read_word(p) (*(p))

  #define PRIPSTR "%s"

#endif

#endif



#endif // __RF24_CONFIG_H__





Так же пробовал раскомментировать эту строку в этом же файле:

  //#define SOFTSPI   // Requires library from https://github.com/greiman/DigitalIO

Сам скетч получился такой:

#include<DigitalIO.h>
#include<SPI.h>
#include<nRF24L01.h>
#include<RF24.h>

SoftSPI<SOFT_SPI_MISO_PIN, SOFT_SPI_MOSI_PIN, SOFT_SPI_SCK_PIN, SPI_MODE> spi;

const uint64_t pipe = {0xF0F0F0F0E1LL}; //адрес трубы

RF24 radionrf(7, 6); //Мега

byte red[4] = {1, 2, 3, 4};          //куда получем сообщение

void setup() {

  Serial.begin(9600); //запуск серийного опрта
  radionrf.begin();      //запуск радиомодуля
  delay(100);         //небольшая задержка для запуска
  radionrf.setChannel(0x112);
  radionrf.enableDynamicPayloads();      //отключаем изменение размера передаваемого буфера????
  radionrf.openReadingPipe(1, pipe);     //открываем трубу для прослушки
  radionrf.openWritingPipe(pipe);       //Открывем трубу для отправки
  radionrf.startListening();            //начинаем слушать эфир

}

void loop() {

  if ( radionrf.available() ) {          //если в эфире что-то есть, то 
    radionrf.read( red, sizeof(red) );  //принимаем сообщение
   
    Serial.print(red[0]);      //и выводим в серийный порт
    Serial.print(" ");
    Serial.print(red[1]);
    Serial.print(" ");
    Serial.print(red[2]);
    Serial.print(" ");
    Serial.print(red[3]);
    Serial.println(" ");
  }

}//конец loop

При компиляции выдает гору ошибок (с раскомментированной строкой выше):



In file included from C:\Users\Администратор\Desktop\arduino-1.6.1\libraries\DigitalIO-master\src/DigitalIO.h:31:0,
                 from RF24priem.ino:2:
C:\Users\Администратор\Desktop\arduino-1.6.1\libraries\DigitalIO-master\src/DigitalPin.h: In function 'void badPinCheck(uint8_t)':
C:\Users\Администратор\Desktop\arduino-1.6.1\libraries\DigitalIO-master\src/DigitalPin.h:55:44: error: 'NUM_DIGITAL_PINS' was not declared in this scope
   if (!__builtin_constant_p(pin) || pin >= NUM_DIGITAL_PINS) {
                                            ^
C:\Users\Администратор\Desktop\arduino-1.6.1\libraries\DigitalIO-master\src/DigitalPin.h: In function 'void fastBitWriteSafe(volatile uint8_t*, uint8_t, bool)':
C:\Users\Администратор\Desktop\arduino-1.6.1\libraries\DigitalIO-master\src/DigitalPin.h:110:9: error: 'cli' was not declared in this scope
     cli();
         ^
C:\Users\Администратор\Desktop\arduino-1.6.1\libraries\DigitalIO-master\src/DigitalPin.h: In function 'void fastPinMode(uint8_t, uint8_t)':
C:\Users\Администратор\Desktop\arduino-1.6.1\libraries\DigitalIO-master\src/DigitalPin.h:175:29: error: 'OUTPUT' was not declared in this scope
   fastDdrWrite(pin, mode == OUTPUT);
                             ^
C:\Users\Администратор\Desktop\arduino-1.6.1\libraries\DigitalIO-master\src/DigitalPin.h:177:35: error: 'INPUT_PULLUP' was not declared in this scope
     fastDigitalWrite(pin, mode == INPUT_PULLUP);
                                   ^
Ошибка компиляции.

Насколько я понял, он пытается мне сказать, что таких пинов не существует. Т.е. он не понимает что я подключил Мегу, а так же что команды подтяжки пинов не существуют в данной библиотеке, что с этим сможно сделать?

Lictor
Offline
Зарегистрирован: 01.10.2015

Что интересно, не компилируется даже часть примеров из библиотеки.

например этот:

// Create object for pin 13 in output mode and demo toggle().
#include "DigitalIO.h"

DigitalPin<13> pin13;

void setup() {
 pin13.mode(OUTPUT);
}

void loop() {
  // toggle is a two byte instruction that executes
  // in two cycles or 125 ns on a 16 MHz CPU
  pin13.toggle();
  delay(250);
}

ошибка:


Изменена опция сборки, пересобираем все
In file included from C:\Users\Администратор\Desktop\arduino-1.6.1\libraries\DigitalIO-master\src/DigitalIO.h:31:0,
                 from DigitalPinBlink.ino:2:
C:\Users\Администратор\Desktop\arduino-1.6.1\libraries\DigitalIO-master\src/DigitalPin.h: In function 'void badPinCheck(uint8_t)':
C:\Users\Администратор\Desktop\arduino-1.6.1\libraries\DigitalIO-master\src/DigitalPin.h:55:44: error: 'NUM_DIGITAL_PINS' was not declared in this scope
   if (!__builtin_constant_p(pin) || pin >= NUM_DIGITAL_PINS) {
                                            ^
C:\Users\Администратор\Desktop\arduino-1.6.1\libraries\DigitalIO-master\src/DigitalPin.h: In function 'void fastBitWriteSafe(volatile uint8_t*, uint8_t, bool)':
C:\Users\Администратор\Desktop\arduino-1.6.1\libraries\DigitalIO-master\src/DigitalPin.h:110:9: error: 'cli' was not declared in this scope
     cli();
         ^
C:\Users\Администратор\Desktop\arduino-1.6.1\libraries\DigitalIO-master\src/DigitalPin.h: In function 'void fastPinMode(uint8_t, uint8_t)':
C:\Users\Администратор\Desktop\arduino-1.6.1\libraries\DigitalIO-master\src/DigitalPin.h:175:29: error: 'OUTPUT' was not declared in this scope
   fastDdrWrite(pin, mode == OUTPUT);
                             ^
C:\Users\Администратор\Desktop\arduino-1.6.1\libraries\DigitalIO-master\src/DigitalPin.h:177:35: error: 'INPUT_PULLUP' was not declared in this scope
     fastDigitalWrite(pin, mode == INPUT_PULLUP);
                                   ^
Ошибка компиляции.

Скачал эту же библиотеку с другого сайта, не помогло. Ошибка та же что и при использовании в моем скетче.

Lictor
Offline
Зарегистрирован: 01.10.2015

Господа, ну может кто-нибудь тогда подскажет как подключить хотя бы SD карту на программный SPI?

Lictor
Offline
Зарегистрирован: 01.10.2015

Проблема решилась подключением SD к SPI через буфер HEF4050, а nRF24L01+ напрямую к выходам SPI на ардуино. 

alexvs
Offline
Зарегистрирован: 22.07.2014

Как я и писал, есть не правильные модули, как раз вам такой и попался, но как вы уже поняли эту железячную проблему можно исправить.

А для того что бы радиомодуль NRF24 работал на softSPI я использую библиотеки https://github.com/TMRh20  и https://github.com/greiman/DigitalIO. Естественно строчку  #define SOFTSPI надо раскомменить.

Для того что бы SD Card работал на  softSPI нужно в  Sd2Card.cpp закомментировать  //#define USE_SPI_LIB

а в  Sd2Card.h: закомментировать //#define USE_SPI_LIB и раскомментировать  #define MEGA_SOFT_SPI 1 

                   
alexvs
Offline
Зарегистрирован: 22.07.2014

Ну и необходимо помнить, что если вы внесли изменения в библиотеку, то  при ее испльзовании в другом проекте, где не нужен softSPI, придется убирать внесенные изменения.

Или же для пректа с изменной библиотекой создать отдельную папку libraries и сложить туда все заюзанные библиотеки, а в ИДЕ потом выбирать какие библиотеки использовать.

Lictor
Offline
Зарегистрирован: 01.10.2015

alexvs пишет:

Ну и необходимо помнить, что если вы внесли изменения в библиотеку, то  при ее испльзовании в другом проекте, где не нужен softSPI, придется убирать внесенные изменения.

Или же для пректа с изменной библиотекой создать отдельную папку libraries и сложить туда все заюзанные библиотеки, а в ИДЕ потом выбирать какие библиотеки использовать.

Я использовал обычную библиотеку, просто добавил буфер  и все заработало. А так да, у меня отдельная папка под каждый проект на ардуине с библиотеками под него. Т.к. пару раз было что библиотека с одного сайт аработает, а с другого нет. Ищи свищи ее потом.

YeSS
Offline
Зарегистрирован: 01.02.2017

Lictor пишет:

Я использовал обычную библиотеку, просто добавил буфер  и все заработало.

Подскажите пожалуйста, такой буфер подойдёт?