Официальный сайт компании Arduino по адресу arduino.cc
Инициализация SPI2 на Arduino Mega 2560 Rev3
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
Вс, 10/02/2019 - 15:27
Нужна помощь с этим вопросом т.к. модуль micro sd card блокирует работу других устройств arduino на шине SPI. Взял Megu для этих целей но не могу поднять SPI2 помогите кто соображает как это сделать. Мат части нигде толком нет.
Точнее модуль 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) {
}
хм, а с чего вы взяли, что на Меге два SPI ?
Что-то я нигде в спеках второго SPI не вижу
Абсолютно не против. Но вот на даташите есть и в описании тоже есть. Возле USB. В описании тоже упоминается о двух независимых SPI.
https://www.microchip.com/wwwproducts/en/ATmega2560
Вы заблуждаетесь - там только 1 SPI на 19-22 ножках микропроцессора. Читайте даташит, а не околонаучные коммиксы.
Разводите эти два устройства на одной SPI шине с помощью ChipSelect (CS)
Согласен. В Спецификации его нет. Гоню.
Разводите эти два устройства на одной SPI шине с помощью ChipSelect (CS)
Ну либо с паяльником исправлять то, что нахомутали китайцы.
PS. А "второй SPI" - это не SPI ATMega2560, а SPI ATMega8U2, которая служит для подключения USB.
вместо Меги можно взять Блюпилл СТМ32 - там реально два хардварных SPI
Да проблема именно с модулем SD он кривой. Как только даешь на него +5V начинается цирк. А бекапить данные надо. Может посоветуете какой то вменяемый способ хранить данные, локально? Интернета в этом месте по определению нет. (
Скоко данных?
Смотря сколько данных. Если немного - можно внешней EEPROM. Если совсем мало - внутренней.
Ну а так - что-то делать с SD:
- перепаивать существующий модуль,
- искать нормальный,
- делать самому из 3.3-вольтового или из переходника SD-microSD,
- использовать софтверный SPI.
дата;время;456;456;456;456;456;456;456;456;456;456;456;456;
и так каждые 4 часа.
дата;время;456;456;456;456;456;456;456;456;456;456;456;456;
и так каждые 4 часа.
Вы отвечаете не на тот вопрос.
Формат хранения неважен, важен размен записи и их количество при определенной условиями глубине хранения. О чём вас и спрашивают.