#1 2019-02-10 12:59:48

0z0n
Учасник
Зареєстрований: 2019-02-10
Повідомлень: 20

Инициализация SPI2 на Arduino Mega 2560 Rev3

Нужна помощь с этим вопросом т.к. модуль 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) {
}

Остання редакція 0z0n (2019-02-10 13:04:39)

Неактивний

#2 2019-02-10 17:14:17

Матчасть
Гість

Re: Инициализация SPI2 на Arduino Mega 2560 Rev3

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

#3 2019-02-10 19:43:03

0z0n
Учасник
Зареєстрований: 2019-02-10
Повідомлень: 20

Re: Инициализация SPI2 на Arduino Mega 2560 Rev3

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

Неактивний

#4 2019-02-10 22:40:49

ard125
Учасник
Зареєстрований: 2019-01-30
Повідомлень: 121

Re: Инициализация SPI2 на Arduino Mega 2560 Rev3

0z0n пише:

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

И вот для SD

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

Неактивний

#5 2019-02-10 22:48:29

0z0n
Учасник
Зареєстрований: 2019-02-10
Повідомлень: 20

Re: Инициализация SPI2 на Arduino Mega 2560 Rev3

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

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

Неактивний

#6 2019-02-10 23:10:38

ard125
Учасник
Зареєстрований: 2019-01-30
Повідомлень: 121

Re: Инициализация SPI2 на Arduino Mega 2560 Rev3

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

Неактивний

#7 2019-02-11 05:59:46

Hugh
Учасник
Зареєстрований: 2019-02-11
Повідомлень: 2

Re: Инициализация SPI2 на Arduino Mega 2560 Rev3

0z0n пише:

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

Неактивний

#8 2019-02-11 09:08:39

0z0n
Учасник
Зареєстрований: 2019-02-10
Повідомлень: 20

Re: Инициализация SPI2 на Arduino Mega 2560 Rev3

ard125 пише:

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

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

Неактивний

#9 2019-02-11 09:36:11

ard125
Учасник
Зареєстрований: 2019-01-30
Повідомлень: 121

Re: Инициализация SPI2 на Arduino Mega 2560 Rev3

Первый скетч, который для 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 от шины 

Неактивний

#10 2019-02-11 09:48:18

Матчасть
Гість

Re: Инициализация SPI2 на Arduino Mega 2560 Rev3

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

Швидке повідомлення

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

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