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

0z0n
Offline
Зарегистрирован: 10.02.2019

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

 

b707
Offline
Зарегистрирован: 26.05.2017

хм, а  с чего вы взяли, что на Меге два SPI ?

Что-то я нигде в спеках второго SPI не вижу

0z0n
Offline
Зарегистрирован: 10.02.2019

Абсолютно не против. Но вот на даташите есть и в описании тоже есть.  Возле USB.  В описании тоже упоминается о двух независимых SPI.

https://www.microchip.com/wwwproducts/en/ATmega2560

 

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

Вы заблуждаетесь - там только 1 SPI на 19-22 ножках микропроцессора. Читайте даташит, а не околонаучные коммиксы.

asam
asam аватар
Offline
Зарегистрирован: 12.12.2018

Разводите эти два устройства на одной SPI шине с помощью ChipSelect (CS)

0z0n
Offline
Зарегистрирован: 10.02.2019

Согласен. В Спецификации его нет. Гоню.

andriano
andriano аватар
Онлайн
Зарегистрирован: 20.06.2015

asam пишет:

Разводите эти два устройства на одной SPI шине с помощью ChipSelect (CS)

Скорее всего, это бесполезно: довольно большая часть выпускаемых китайцами модулей SD содержат то ли неправильно подключенный конвертер уровней, то ли еще что, но в итоге модуль не отпускает шину при снятии сигнала CS (т.е. установке его в 1). В принципе, можно попытаться установить последовательнос SD MISO резистор на 1-2к, но нужно еще и проверить, что при снятии CS модуль не продолжает писать на карту.

Ну либо с паяльником исправлять то, что нахомутали китайцы.

 

PS. А "второй SPI" - это не SPI ATMega2560, а SPI ATMega8U2, которая служит для подключения USB.

b707
Offline
Зарегистрирован: 26.05.2017

вместо Меги можно взять Блюпилл СТМ32 - там реально два хардварных SPI

 

0z0n
Offline
Зарегистрирован: 10.02.2019

Да проблема именно с модулем SD он кривой. Как только даешь на него +5V начинается цирк.  А бекапить данные надо. Может посоветуете какой то вменяемый способ хранить данные, локально? Интернета в этом месте по определению нет. (

sadman41
Offline
Зарегистрирован: 19.10.2016

Скоко данных?

andriano
andriano аватар
Онлайн
Зарегистрирован: 20.06.2015

Смотря сколько данных. Если немного - можно внешней EEPROM. Если совсем мало - внутренней.

Ну а так - что-то делать с SD:

- перепаивать существующий модуль,

- искать нормальный,

- делать самому из 3.3-вольтового или из переходника SD-microSD,

- использовать софтверный SPI.

0z0n
Offline
Зарегистрирован: 10.02.2019

дата;время;456;456;456;456;456;456;456;456;456;456;456;456; 

и так каждые 4 часа.

 

inspiritus
Offline
Зарегистрирован: 17.12.2012

sadman41
Offline
Зарегистрирован: 19.10.2016

0z0n пишет:

дата;время;456;456;456;456;456;456;456;456;456;456;456;456; 

и так каждые 4 часа.

Вы отвечаете не на тот вопрос.

Формат хранения неважен, важен размен записи и их количество при определенной условиями глубине хранения. О чём вас и спрашивают.