Відповісти

Введіть повідомлення і натисніть Надіслати
Параметри

Назад

Огляд теми (нові повідомленні вгорі)

Матчасть
2019-02-11 09:48:18

С помощью библиотек Ардуино невозможно корректное совместное использование интерфейсов. В однозадачной среде, вам необходимо проследить и, возможно, самому обеспечить строго последовательное выполнение операций доступа к разным устройствам, подключенным к общей шине. Для этого придётся углубиться в алгоритмы используемых библиотек.

ard125
2019-02-11 09:36:11

Первый скетч, который для RF-ки работает при подключенной SD?

int SR = 53; // pin slave для RF
int SC = 4; // pin slave для SD

{

Serial.begin(9600);

pinMode(SR,OUTPUT);
pinMode(SC,OUTPUT);
pinMode(9,OUTPUT);
digitalWrite(9, LOW);
digitalWrite(SR, LOW);
digitalWrite(SC, HIGH ); // - работа с пином, отключение  SD от шины 
0z0n
2019-02-11 09:08:39
ard125 пише:

Я смотрю что у вас в скетчах по разному обозначен пин слейв для карты. В одном sc, в другом чипселект. Может в этом проблема?

наверное запутался. Но как я его уже не обзывал. толку 0.

Hugh
2019-02-11 05:59:46
0z0n пише:

Это я уже читал. Не очень понимаю. Там в мануале сказано что есть 2 SPI независимых. (https://www.microchip.com/wwwproducts/en/ATmega2560)По идеее я могу их оба сделать мастерами. Как сделать второй мастером. Как его вообще объявить? В чем суть мат части? Да чего то не понимаю. На вики болт тоже. При чем тут вики.

ard125
2019-02-10 23:10:38

Я смотрю что у вас в скетчах по разному обозначен пин слейв для карты. В одном sc, в другом чипселект. Может в этом проблема?

0z0n
2019-02-10 22:48:29

Они у вас что по отдельности работают?

Не RF24 в определенный момент затыкается. Уже выяснил что у меня нет SPI2 а проблема в китайском модуле SD micro. Он не заканчивает сесию а втупую держиш шину. Из за этого масса проблем.

ard125
2019-02-10 22:40:49
0z0n пише:

Вот стандартный скетч немного переработаный для "RF 24"

И вот для SD

Они у вас что по отдельности работают?

0z0n
2019-02-10 19:43:03

Это я уже читал. Не очень понимаю. Там в мануале сказано что есть 2 SPI независимых. (https://www.microchip.com/wwwproducts/en/ATmega2560)По идеее я могу их оба сделать мастерами. Как сделать второй мастером. Как его вообще объявить? В чем суть мат части? Да чего то не понимаю. На вики болт тоже. При чем тут вики.

Матчасть
2019-02-10 17:14:17

https://github.com/arduino/Arduino
https://www.microchip.com/wwwproducts/en/ATmega2560
https://ru.wikipedia.org/wiki/Serial_Peripheral_Interface
...

0z0n
2019-02-10 12:59:48

Нужна помощь с этим вопросом т.к. модуль micro sd card блокирует работу других устройств arduino на шине SPI. Взял Megu для этих целей но не могу поднять SPI2 помогите кто соображает как это сделать. Мат части нигде толком нет. roll

Точнее модуль SD работает всегда но вот незадачка если V5+ подключаю к источнику питания даже не подключив V5- модуль RF24 ложится и начинает при опросе каналов  кидать "4444444444444444444444444444444444444444" как будто он не подключен.

Вот стандартный скетч немного переработаный для "RF 24"

#include <Wire.h>
#include <SPI.h>
#include "nRF24L01.h"
#include "RF24.h"
#include <SD.h>


Sd2Card card;
SdVolume volume;
SdFile root;

const int chipSelect = 4;

//RF24 radio(9,10); // инициализировать модуль на пинах 9 и 10 Для Уно
RF24 radio(9,53);// Для Меги

int SR = 53;
int SC = 4;

const uint8_t num_channels = 128;
uint8_t values[num_channels];
void setup(void)
{

Serial.begin(9600);

pinMode(SR,OUTPUT);
pinMode(SC,OUTPUT);
pinMode(9,OUTPUT);
digitalWrite(9, LOW);
digitalWrite(SR, LOW);
digitalWrite(SC, HIGH ); // - работа с пином  
  
  printf_begin();
  radio.begin();
  radio.setAutoAck(false);
  radio.startListening();

  radio.printDetails();  // Вот эта строка напечатает нам что-то, если все правильно соединили.
  delay(5000);              // И посмотрим на это пять секунд.

  radio.stopListening();
  int i = 0;    // А это напечатает нам заголовки всех 127 каналов
  while ( i < num_channels )  {
    printf("%x",i>>4);
    ++i;
  }
  printf("\n\r");
  i = 0;
  while ( i < num_channels ) {
    printf("%x",i&0xf);
    ++i;
  }
  printf("\n\r");
}
const int num_reps = 100;

void loop(void)
{
  memset(values,0,sizeof(values));
  int rep_counter = num_reps;
  while (rep_counter--) {
    int i = num_channels;
    while (i--) {
      radio.setChannel(i);
      radio.startListening();
      delayMicroseconds(128);
      radio.stopListening();
      if ( radio.testCarrier() )
        ++values[i];
    }
  }
  int i = 0;
  while ( i < num_channels ) {
    printf("%x",min(0xf,values[i]&0xf));
    ++i;
  }
  printf("\n\r");
}
int serial_putc( char c, FILE * ) {
  Serial.write( c );
  return c;
}

void printf_begin(void) {
  fdevopen( &serial_putc, 0 );
} 

И вот для SD


#include <Wire.h>

#include <SPI.h>
#include <SD.h>

#include "nRF24L01.h"
#include "RF24.h"

int SR = 53;
int SC = 4;

Sd2Card card;
SdVolume volume;
SdFile root;

const int chipSelect = 4;

void setup() {
pinMode(SR,OUTPUT);
pinMode(SC,OUTPUT);
pinMode(9,OUTPUT);
digitalWrite(9, LOW);
digitalWrite(SR, HIGH);
digitalWrite(SC, LOW); // - работа с пином  
    
    
    Serial.begin(9600);
    Serial.print("\nInitializing SD card...");

    if (!card.init(SPI_HALF_SPEED, chipSelect)) {
        // неверное подключение или карта неисправна
        Serial.println("initialization failed");
        return;
    } else {
        // всё ок!
        Serial.println("Wiring is correct and a card is present.");
    }

    // считываем тип карты и выводим его в COM-порт
    Serial.print("\nCard type: ");
    switch (card.type()) {
        case SD_CARD_TYPE_SD1:
            Serial.println("SD1");
            break;
        case SD_CARD_TYPE_SD2:
            Serial.println("SD2");
            break;
        case SD_CARD_TYPE_SDHC:
            Serial.println("SDHC");
            break;
        default:
            Serial.println("Unknown");
    }

    // инициализация файловой системы
    if (!volume.init(card)) {
        // неверная файловая система
        Serial.println("Could not find FAT16/FAT32 partition.");
        return;
    }

    // считываем тип и вычисляем размер первого раздела
    uint32_t volumesize;
    Serial.print("\nVolume type is FAT");
    Serial.println(volume.fatType(), DEC);
    Serial.println();

    volumesize = volume.blocksPerCluster(); // блоков на кластер
    volumesize *= volume.clusterCount(); // кластеров
    volumesize *= 512; // 512 байтов в блоке, итого байт.. 
    Serial.print("Volume size (bytes): ");
    Serial.println(volumesize);
    Serial.print("Volume size (Kbytes): ");
    volumesize /= 1024;
    Serial.println(volumesize);
    Serial.print("Volume size (Mbytes): ");
    volumesize /= 1024;
    Serial.println(volumesize);

    Serial.println("\nFiles found on the card (name, date and size in bytes): ");
    root.openRoot(volume);
    // выводим список файлов
    root.ls(LS_R | LS_DATE | LS_SIZE);
}

void loop(void) {
}

Підвал форуму