DUE и RTC

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

стало мало оперативы на меге и решил попробовать дую

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

inspiritus пишет:

стало мало оперативы на меге и решил попробовать дую

маладец, чо :)

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

естесссенно установил все, что положено установить

проверил компиляцию программы - выдает ошибки только на rtc. нашел старые ветки качнул библиотеку RTCdue-master

#ifndef _RTCdue_h_
#define _RTCdue_h_

// Code by JeeLabs http://news.jeelabs.org/code/
// Released to the public domain! Enjoy!

// Edited by Oskari Rauta. 
// i2c functionality adapted from DS1307 library of Henning Karlsen - no more wire.h needed
// Due now supported and calculation of 
// day of week now works. 3/16/2013

  
#include <Arduino.h>
  
// Simple general-purpose date/time class (no TZ / DST / leap second handling!)

#define DS1307_ADDR_R	209
#define DS1307_ADDR_W	208
#define SECONDS_PER_DAY 86400L
#define SECONDS_FROM_1970_TO_2000 946684800
  
  
class DateTime {
public:
    DateTime (uint32_t t =0);
    DateTime (uint16_t year, uint8_t month, uint8_t day,
                uint8_t hour =0, uint8_t min =0, uint8_t sec =0);
    DateTime (const char* date, const char* time);
    uint16_t year() const       { return 2000 + yOff; }
    uint8_t month() const       { return m; }
    uint8_t day() const         { return d; }
    uint8_t hour() const        { return hh; }
    uint8_t minute() const      { return mm; }
    uint8_t second() const      { return ss; }
    uint8_t dayOfWeek() const;

    // 32-bit times as seconds since 1/1/2000
    long secondstime() const;   
    // 32-bit times as seconds since 1/1/1970
    uint32_t unixtime(void) const;

protected:
    uint8_t yOff, m, d, hh, mm, ss;
};

// RTC based on the DS1307 chip connected via I2C and the Wire library
class RTC_DS1307 {
public:
  RTC_DS1307(const uint8_t data_pin = PIN_WIRE_SDA, const uint8_t sclk_pin = PIN_WIRE_SCL);
  void begin(void);
  void adjust(const DateTime& dt);
  void settime(const DateTime& dt);
  uint8_t isrunning(void);
  DateTime now(void);
private:
  uint8_t _scl_pin;
  uint8_t _sda_pin;
  uint8_t _burstArray[8];
  
  void _sendStart(byte addr);
  void _sendStop(void);
  void _sendAck(void);
  void _sendNack(void);
  void _waitForAck(void);
  uint8_t _readByte(void);
  void _writeByte(uint8_t value);
  void _burstRead(void);
  uint8_t _readRegister(uint8_t reg);
  void _writeRegister(uint8_t reg, uint8_t value);
  uint8_t _decode(uint8_t value);
  uint8_t _encode(uint8_t value);
};

// RTC using the internal millis() clock, has to be initialized before use
// NOTE: this clock won't be correct once the millis() timer rolls over (>49d?)
class RTC_Millis {
public:
    static void begin(const DateTime& dt) { adjust(dt); }
    static void adjust(const DateTime& dt);
    static DateTime now();

protected:
    static long offset;
};

#endif
        
        
// Code by JeeLabs http://news.jeelabs.org/code/
// Released to the public domain! Enjoy!

// Edited by SomeRandomGuy to implement support for the Arduino Due on 1/19/2013

// Edited more by Oskari Rauta. Due now supported and calculation of day of week now works. 3/16/2013

#include "RTCdue.h"

// utility code, some of this could be exposed in the DateTime API if needed

const uint8_t daysInMonth [] = { 31,28,31,30,31,30,31,31,30,31,30,31 }; //has to be const or compiler compaints

// number of days since 2000/01/01, valid for 2001..2099
static uint16_t date2days(uint16_t y, uint8_t m, uint8_t d) {
    if (y >= 2000)
        y -= 2000;
    uint16_t days = d;
    for (uint8_t i = 1; i < m; ++i)
        days += *daysInMonth + i - 1;
    if (m > 2 && y % 4 == 0)
        ++days;
    return days + 365 * y + (y + 3) / 4 - 1;
}

static long time2long(uint16_t days, uint8_t h, uint8_t m, uint8_t s) {
    return ((days * 24L + h) * 60 + m) * 60 + s;
}

////////////////////////////////////////////////////////////////////////////////
// DateTime implementation - ignores time zones and DST changes
// NOTE: also ignores leap seconds, see http://en.wikipedia.org/wiki/Leap_second

DateTime::DateTime (uint32_t t) {
  t -= SECONDS_FROM_1970_TO_2000;    // bring to 2000 timestamp from 1970

    ss = t % 60;
    t /= 60;
    mm = t % 60;
    t /= 60;
    hh = t % 24;
    uint16_t days = t / 24;
    uint8_t leap;
    for (yOff = 0; ; ++yOff) {
        leap = yOff % 4 == 0;
        if (days < 365 + leap)
            break;
        days -= 365 + leap;
    }
    for (m = 1; ; ++m) {
        uint8_t daysPerMonth = *daysInMonth + m - 1;
        if (leap && m == 2)
            ++daysPerMonth;
        if (days < daysPerMonth)
            break;
        days -= daysPerMonth;
    }
    d = days + 1;
}

DateTime::DateTime (uint16_t year, uint8_t month, uint8_t day, uint8_t hour, uint8_t min, uint8_t sec) {
    if (year >= 2000)
        year -= 2000;
    yOff = year;
    m = month;
    d = day;
    hh = hour;
    mm = min;
    ss = sec;
}

static uint8_t conv2d(const char* p) {
    uint8_t v = 0;
    if ('0' <= *p && *p <= '9')
        v = *p - '0';
    return 10 * v + *++p - '0';
}

// A convenient constructor for using "the compiler's time":
//   DateTime now (__DATE__, __TIME__);
// NOTE: using PSTR would further reduce the RAM footprint
DateTime::DateTime (const char* date, const char* time) {
    // sample input: date = "Dec 26 2009", time = "12:34:56"
    yOff = conv2d(date + 9);
    // Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec 
    switch (date[0]) {
        case 'J': m = date[1] == 'a' ? 1 : m = date[2] == 'n' ? 6 : 7; break;
        case 'F': m = 2; break;
        case 'A': m = date[2] == 'r' ? 4 : 8; break;
        case 'M': m = date[2] == 'r' ? 3 : 5; break;
        case 'S': m = 9; break;
        case 'O': m = 10; break;
        case 'N': m = 11; break;
        case 'D': m = 12; break;
    }
    d = conv2d(date + 4);
    hh = conv2d(time);
    mm = conv2d(time + 3);
    ss = conv2d(time + 6);
}

uint8_t DateTime::dayOfWeek() const {    
     // CalendarSystem = 1 for Gregorian Calendar
  
  	 uint16_t year = yOff + 2000;
  	 uint8_t result, month = m;
  
     if ( month < 3)
     {
           month = month + 12;
           year -= 1;
     }
  	  
  	 result = (d + ( 2 * month ) + int(6 * ( month + 1 ) / 10) +
       		year + int(year / 4) - int(year / 100) +
       		int(year / 400) + 1 ) %7;
  
  	return result == 0 ? 7 : result;
}

uint32_t DateTime::unixtime(void) const {
  uint32_t t;
  uint16_t days = date2days(yOff, m, d);
  t = time2long(days, hh, mm, ss);
  t += SECONDS_FROM_1970_TO_2000;  // seconds from 1970 to 2000

  return t;
}

////////////////////////////////////////////////////////////////////////////////
// RTC_DS1307 implementation

RTC_DS1307::RTC_DS1307(const uint8_t data_pin, const uint8_t sclk_pin) {
  _sda_pin = data_pin;
  _scl_pin = sclk_pin;
  pinMode(_scl_pin, OUTPUT);
}

void RTC_DS1307::begin(void) {
  uint8_t _reg = _readRegister(0);
  _reg &= ~(1 << 7);
  _reg |= (0 << 7);
  _writeRegister(0, _reg);
}

void	RTC_DS1307::_sendStart(byte addr)
{
	pinMode(_sda_pin, OUTPUT);
	digitalWrite(_sda_pin, HIGH);
	digitalWrite(_scl_pin, HIGH);
	digitalWrite(_sda_pin, LOW);
	digitalWrite(_scl_pin, LOW);
	shiftOut(_sda_pin, _scl_pin, MSBFIRST, addr);
}

void	RTC_DS1307::_sendStop(void)
{
	pinMode(_sda_pin, OUTPUT);
	digitalWrite(_sda_pin, LOW);
	digitalWrite(_scl_pin, HIGH);
	digitalWrite(_sda_pin, HIGH);
	pinMode(_sda_pin, INPUT);
}

void	RTC_DS1307::_sendNack(void)
{
	pinMode(_sda_pin, OUTPUT);
	digitalWrite(_scl_pin, LOW);
	digitalWrite(_sda_pin, HIGH);
	digitalWrite(_scl_pin, HIGH);
	digitalWrite(_scl_pin, LOW);
	pinMode(_sda_pin, INPUT);
}

void	RTC_DS1307::_sendAck(void)
{
	pinMode(_sda_pin, OUTPUT);
	digitalWrite(_scl_pin, LOW);
	digitalWrite(_sda_pin, LOW);
	digitalWrite(_scl_pin, HIGH);
	digitalWrite(_scl_pin, LOW);
	pinMode(_sda_pin, INPUT);
}

void	RTC_DS1307::_waitForAck(void)
{
	pinMode(_sda_pin, INPUT);
	digitalWrite(_scl_pin, HIGH);
	while (_sda_pin==LOW) {}
	digitalWrite(_scl_pin, LOW);
}

uint8_t RTC_DS1307::_readByte(void)
{
	pinMode(_sda_pin, INPUT);

	uint8_t value = 0;
	uint8_t currentBit = 0;

	for (int i = 0; i < 8; ++i)
	{
		digitalWrite(_scl_pin, HIGH);
		currentBit = digitalRead(_sda_pin);
		value |= (currentBit << 7-i);
		delayMicroseconds(1);
		digitalWrite(_scl_pin, LOW);
	}
	return value;
}
void RTC_DS1307::_writeByte(uint8_t value)
{
	pinMode(_sda_pin, OUTPUT);
	shiftOut(_sda_pin, _scl_pin, MSBFIRST, value);
}

uint8_t RTC_DS1307::_readRegister(uint8_t reg)
{
	uint8_t	readValue=0;

	_sendStart(DS1307_ADDR_W);
	_waitForAck();
	_writeByte(reg);
	_waitForAck();
	_sendStop();
	_sendStart(DS1307_ADDR_R);
	_waitForAck();
	readValue = _readByte();
	_sendNack();
	_sendStop();
	return readValue;
}

void RTC_DS1307::_writeRegister(uint8_t reg, uint8_t value)
{
	_sendStart(DS1307_ADDR_W);
	_waitForAck();
	_writeByte(reg);
	_waitForAck();
	_writeByte(value);
	_waitForAck();
	_sendStop();
}

void RTC_DS1307::_burstRead(void)
{
	_sendStart(DS1307_ADDR_W);
	_waitForAck();
	_writeByte(0);
	_waitForAck();
	_sendStop();
	_sendStart(DS1307_ADDR_R);
	_waitForAck();

	for (int i=0; i<8; i++)
	{
		_burstArray[i] = _readByte();
		if (i<7)
			_sendAck();
		else
			_sendNack();
	}
	_sendStop();
}

uint8_t	RTC_DS1307::_decode(uint8_t value)
{
	uint8_t decoded = value & 127;
	decoded = (decoded & 15) + 10 * ((decoded & (15 << 4)) >> 4);
	return decoded;
}

uint8_t RTC_DS1307::_encode(uint8_t value)
{
	uint8_t encoded = ((value / 10) << 4) + (value % 10);
	return encoded;
}

uint8_t RTC_DS1307::isrunning(void) {
  return !(_readRegister(0)>>7);
}

void RTC_DS1307::adjust(const DateTime& dt) {
  _writeRegister(0, _encode(dt.second()));
  _writeRegister(1, _encode(dt.minute()));
  _writeRegister(2, _encode(dt.hour()));
  _writeRegister(4, _encode(dt.day()));
  _writeRegister(5, _encode(dt.month()));
  _writeRegister(6, _encode(dt.year()-2000));
}

void RTC_DS1307::settime(const DateTime& dt) {
  _writeRegister(0, _encode(dt.second()));
  _writeRegister(1, _encode(dt.minute()));
  _writeRegister(2, _encode(dt.hour()));
}

DateTime RTC_DS1307::now(void) {
  _burstRead();
  uint8_t ss = _decode(_burstArray[0]);
  uint8_t mm = _decode(_burstArray[1]);
  uint8_t hh = _decode(_burstArray[2]);
  uint8_t d = _decode(_burstArray[4]);
  uint8_t m = _decode(_burstArray[5]);
  uint16_t y = _decode(_burstArray[6]) + 2000;
  return DateTime (y, m, d, hh, mm, ss);
}

////////////////////////////////////////////////////////////////////////////////
// RTC_Millis implementation

long RTC_Millis::offset = 0;

void RTC_Millis::adjust(const DateTime& dt) {
    offset = dt.unixtime() - millis() / 1000;
}

DateTime RTC_Millis::now() {
  return (uint32_t)(offset + millis() / 1000);
}

////////////////////////////////////////////////////////////////////////////////

        
        
        
#######################################
# Syntax Coloring Map For RTC
#######################################

#######################################
# Datatypes (KEYWORD1)
#######################################

DateTime	KEYWORD1
RTC_DS1307	KEYWORD1
RTC_Millis	KEYWORD1

#######################################
# Methods and Functions (KEYWORD2)
#######################################

year	KEYWORD2
month	KEYWORD2
day	KEYWORD2
hour	KEYWORD2
minute	KEYWORD2
second	KEYWORD2
dayOfWeek	KEYWORD2
secondstime	KEYWORD2
unixtime	KEYWORD2
begin	KEYWORD2
adjust	KEYWORD2
settime KEYWORD2
isrunning	KEYWORD2
now	KEYWORD2

#######################################
# Constants (LITERAL1)
#######################################

проверил , вроде все  почти работает как надо. за исключением мелочей

по рекомендациям незабвенного нашего Пухлявого ставлю время

rtc.adjust(DateTime( 2012, 06, 10, 12, 45, 12));

все ок, но 

rtc.adjust(DateTime( 2012, 09, 10, 12, 45, 12));

ругается : 

ds1307:13:28: error: invalid digit "9" in octal constant
 rtc.adjust(DateTime( 2012, 09, 10, 12, 45, 12));
                                           ^
exit status 1
invalid digit "9" in octal constant
спрашивается с какого рожна ему не нравятся не okt цифры в переменной типа uint8_t
 
мне для коррекции 1307 по ntp надо ставить только время и я дополнил библиотеку методом settime и он делает то что мне надо, но вот только не выделяет в тексте программы, хотя я его вписал в keywords. почему так не пойму...
 
и наконец при прошивке через Progamming port надо пальцевать кнопки res и erase,тк оно почемутто автоматом не стирает перед записью, а native вообще не нашел драйверов...
 
подскажите плз кто сталкивался...
 

 

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

потому что надо писать не "09", а просто 9 - это ведь число, а не строчка, зачем в ней лидирующий ноль?

А первый ноль в цифре зарезервирован под восьмеричные цифры

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

ага, спасибо, я не знал про лидирующий ноль и восьмеричные ... написал как у Пухлявого, а ОН оказался неправ :)

может быть и по двум другим вопросам просветите ? 

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

inspiritus пишет:

ага, спасибо, я не знал про лидирующий ноль и восьмеричные ... написал как у Пухлявого, а ОН оказался неправ :)

дело в том, что его строчка 06 будет работать, причем без ошибок, а вот ваша 09 - нет :) Догадайтесь почему...

 

Цитата:
может быть и по двум другим вопросам просветите ? 

нет,

по второму вопросу - меня абсолютно не трогает подсветка синтаксиса в ИДЕ. никогда не интересовался.

А третий вопрос я вообще не понял, вероятно потому, что у меня нет Дуе...

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

Да понятно почему в окте нет цыфыр больше 7 :) я не мог понять причем тут окт

победил rtc 

тут еще проблема нарисовалась - ethernet шильд на 5100 без изменений программы работавшей на меге не взлетает. Есть подозрения, что проблема с библиотекой SPI

Победил

тк у мну еще и сд висит то обязательно

SPI.begin(10);

SPI.begin(4);

Также для работы на меге инициализировал пины 4 и 10 на выход и прописывал в них 1. также принудительно пином ресеттил шильд.на дуэ это все не нужно и более того нельзя.

очередная проблема- не взлетает sd шильдовая и от отдельного  модуля. Предполагаю, что из-за того, что ноги флешки соединены через делитель для адаптации к 5v сигналам. На модуле стоят 3.3к четыре резюка. Надо будет их снять , замкнуть и проверить без них. Думаю заработает.

 

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

не взлетело. Теперь как и на эзершильде инициализация sd происходит , а файл не создается, имеющийся не читается.

чтотто у меня ощущение, что для дуи нужна специяльная библиОтека

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

Для работы с SD на Due я использую SdFat.

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

Спасибо, попробую. А по железу что Вы используете для sd и DUE

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

inspiritus пишет:

Спасибо, попробую. А по железу что Вы используете для sd и DUE

Да типовые схемы, собственно. Можно и китайские модули SD, главное, чтобы в MISO модуль не гадил (есть некоторые неправильные, которые MISO не отпускают, когда CS в высоком). SdFat - работает чётко, я полностью на него перелез, отказавшись от штатной SD. А под STM32 - SDIO под STM32GENERIC пользую.

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

Оода

это известный модуль который срал в мисо и после этого перестал :) и плсле ЭТОГО  долго и счстливо работает впаре с эзермодулем красным на 5100.

вроде снял и заменил перемычками резюки 3.3к и на библе sdFAT взлетело на стандартных примерах, но четто библа сильно перегруженная... разбираюсь... очень интересно можно ли? Делать произвольный поиск по файлу

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

inspiritus пишет:

очень интересно можно ли? Делать произвольный поиск по файлу

Насколько я помню - нет. Надо, как обычно - читать, искать. Можно реализовать поиск алгоритмом Бойера-Мура, например - будет меньше операций чтения.

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

Ну да читать искать. А вот например найти (по некоторому правилу) позицию  отначала 237-ю и от неёзаписать 4 байта...

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

inspiritus пишет:

Ну да читать искать. А вот например найти (по некоторому правилу) позицию  отначала 237-ю и от неёзаписать 4 байта...

Всё зависит от вводных. Так то всё решаемо.

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

... просто при работе с обычной библиотекой я никак не мог писать в позицию seek не открыв файл неописанным в обычной документации к либе способом.

https://arduino.ru/forum/programmirovanie/vopros-po-biblioteke-sd

потом с любезной подсказкой b707 этот вопрос был решен.

вот собственно более полный вопрос возможно в этой либе найти контент в файле и изменить его...

 

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

inspiritus пишет:

... просто при работе с обычной библиотекой я никак не мог писать в позицию seek не открыв файл неописанным в обычной документации к либе способом.

https://arduino.ru/forum/programmirovanie/vopros-po-biblioteke-sd

потом с любезной подсказкой b707 этот вопрос был решен.

вот собственно более полный вопрос возможно в этой либе найти контент в файле и изменить его...

 

Как обычно - открываете файл с флагами на чтение и запись, и вперёд - seekSet и прочее.

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

Не не взлетают одновременно эзернет и SD 

по-одному работают вместе нет. Причем железячно они подключены, когда программно по одному инциируются и запускаются. А вот запустить обе сразу никак. CS сидят на 10 и 4 пинах. Используются красный зэрнет на W5100 и доработаннный модуль для SD ( убраны резисторы согласования с 5v и проведена доработка по мисо см картинку выше).

 

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

что прикольно - все инициализируется, зернет отрабатывает все правильно, по карте драйвер выдает правильную инициализацию и все не читает и не пишет...

AGregator 2.8.4
My IP adress: 192.168.88.234
My gateway: 192.168.88.254
My subnet mask: 255.255.248.0
My dns Server: 77.37.255.30
******************* NTP correction END ********************
SD card initialized.
01012000.csv
modul/********.*** doesn't exist.
 can't create file
chiller/********.*** doesn't exist.
 can't create file
Initialisation complete
 
inspiritus
Offline
Зарегистрирован: 17.12.2012

Чуть продвинулся , с библиотекой sdfat получилось при работающем эзернете прочитать каталоги и файлы с sd.

Однако создать файл и читать/писать пока не получилось
inspiritus
Offline
Зарегистрирован: 17.12.2012

И вот казалось бы нарисовал и зафгачил ПЕЧАТКУ фоторезистом, а там долбаная тресчинка и то не всегда видна и не всегда звонится на обрыв , a  выглядит, как глюки библиотеки с дуёвым spiаем

и тут же взлетает эзернэт ибо это был CS

и SD инитится и даже фолдеры видит

AGregator 2.8.4_003
IP adress:   192.168.88.234
gateway:     192.168.88.254
subnet mask: 255.255.248.0
dns Server:  77.37.255.30
******************* NTP correction START********************
ask ntp.....ntp ok.....
Seconds since Jan 1 1900 = 3790178691
Unix time = 1581189891
The UTC time is 22:24:53
The local time is 1.1.2000,22:24:53
******************* NTP correction END ********************
SD card initialized.

List of files on the SD.
index1.htm
test.txt
modul/
chiller/
Done!
01012000.csv
modul/********.*** doesn't exist.
error: create Folder1/file1.txt failed

остается только перерихтовать с библы SD на SDfat создание файлов и запись в них лога, и миграция на дую свершится ....

ЗЫ дата правильная еще не выставлена и почему-то у этой заразы по-прежнему надо пальцАми стирать старую паршивку

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

inspiritus пишет:

и почему-то у этой заразы по-прежнему надо пальцАми стирать старую паршивку

Due старой ревизии, резетится некорректно, вернее, не всегда резетится. Решение есть, обсуждалось и тут на форуме, помнится. 

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

Подскажите плз какой контекст искать, или ткните в тему, а то искал по-всякому , много чего нарыл, а про нестирание автоматом флеша призаливке ничего найти не смог...

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

Ага спасибо, я видел уже гдетто про добавление резистора, однако решил, что, если после прошивки она ресеттится сама, то у мнея несмотря на старую ревизию ок и добавлять не стал. А что же оно связано с erase получается?

кстати эта зараза все равно на эзернете и sdFat одновременно не работает. По очереди запросто. Как только я объявляю

SPI.begin(10);

SPI.begin(4);

sd не инитится, зернет не отдает клиенту, хотя адрес и проч принимает.

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

inspiritus пишет:

Как только я объявляю

SPI.begin(10);

SPI.begin(4);

sd не инитится, зернет не отдает клиенту, хотя адрес и проч принимает.

Не понял. У SPI.begin - нет параметров, тащемта. Просто один раз позвали SPI.begin() - и всё: https://www.arduino.cc/en/Reference/SPIBegin

А SS уже каждый сам рулит, когда надо. Если надо по ходу менять настройки SPI - то грамотные либы юзают beginTransaction по своими настройками.

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

Там для дуи надо инициировать каждый ss

описано в расширенных spi и тут порусски

и еще тут говорится, что 4 ss не надо вообще объявлять выходом

тут и тут тоже есть про spi

и наконец ТУТ , после дискуссии с нашим незабываемым Пухлявым выясняется несомненный успех после инициализации каждой линии SS интерфейса SPI

кстати, на ресетный мосфет впаял 10кОм, ничего не изменилось, все так же надо эрасить память перед прошивкой...

Нихрена не выходит каменный цветок

аппаратно езернет и sd подключены к SPI, у зернета ss-10 у sd-4 . MOSI у sd не гадит ибо 13 нога буфера подключена к ss а не к земле, как у оригинальнойсхемы. В таком варианте на меге все работает.

на дуе:

инициируется зернет (красная плата на w5100)  и обращается по сетке за временем, получает время то есть в сеть ходит

потом если сказать SD.begin , то sd начинает работать, но отрубается w5100

если до sd.begin(10) и sd.begin(4) инициировать 10 как выход, то w5100 не запускается. 
если инициировать только 4 как выход, то w5100 запускается, sd нет

сломал весь моск

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

Что из процитированного прошло мимо понимания?

These APIs should not be used in new projects. Use SPISettings with SPI.beginTransaction() to configure SPI parameters.

Нашли непонятно что, которое уже и использовать не рекомендуется. Вся инициализация SS - это pinMode(pin,OUTPUT), это должна делать прикладная сторона, просто патамушта.

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

еще нарыл это
Да, но транзакшн применяются в нутрях библиотек

если я пишу сам библиотеку то я должен применять приведенное Вами

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

в частности видимо тем, что не отпускают по завершении транзакции шину.

кстати в этом надо покопаться....

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

Я уже писал, что под Due юзаю SdFat, есть параллельно и другие устройства на SPI, вроде MCP23S17. Ethernet, правда, не юзаю уже давно. Но вы правы в одном - для Due надо подбирать библиотеки, не все взлетают.

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

Что странно так это уровни сигналов

блинк на 10 пине болтается между 3.2 и 0

когда же на 10 пине ss сигнал шины SPI , то уровень единицы выше 1.5 вольта не поднимается... и что прикольно, на 4 пине ss болтается между 3.2 и 1.5 , не опускаясь до нуля. При этом выводы пустые, я с них все снял. 
и еще раз, блинк на этих ногах болтается как положено меду 3.2 и нулем

 

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

Что странно так это уровни сигналов

блинк на 10 пине болтается между 3.2 и 0

когда же на 10 пине ss сигнал шины SPI , то уровень единицы выше 1.5 вольта не поднимается... и что прикольно, на 4 пине ss болтается между 3.2 и 1.5 , не опускаясь до нуля. При этом выводы пустые, я с них все снял. 
и еще раз, блинк на этих ногах болтается как положено меду 3.2 и нулем

Чудес не бывает а херня случается :(

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

Вымарал объявление 10 пина как выхода, сигнал на нем стал полного размаха

вымарал с 4 пина, ничего не изменилось , все равно сволочь в ноль не падает такое ощущение, что оно болтается между единицей и Z

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

в общем DUE и два устройства на SPI (W5100-красный и SD-с буфером) заработали. 

решение получилось такое:

0- аппаратно - доработать модуль SD , убрать резисторы толерантности с MISO-SCK-MOSI-SS, завести 13 ногу буфера с земли на CS. далее подключение обычное MOSI-MISO-CSK на оба модуля, CS-w5100 на 10, CS-SD на 4, reset на reset w5100. земли на земли, питание 5v. (на обоих модулях есть собственный понижатель на 3.2). 

возвращаясь к теме топика, DS1307 цепляется к I2C обычно с резисторами 4.7-6.8 кОм и питанием 3.2

бибилиотеки

//#include <SPI.h>                //объявляется внутри Ether и SPI наверно можно убрать.
#include <Ethernet.h>
#include <EthernetUdp.h>  //для моих нужд
#include "SdFat.h"
#include "RTCdue.h"

1- SS пины не инициализируем!!! только объявляем

#define W5100_CS        10 // порт управления сетевой платой
#define SD_CS            4 // порт управления SD картой

2- инициализация w5100 совсем простая (приведен мой случай, когда после инита я получаю время)

SPI.begin(W5100_CS);
Ethernet.begin(mac,ip,dnServer,gateway,subnet);
  Serial.print("IP adress:   "); Serial.println(Ethernet.localIP());
  Serial.print("gateway:     "); Serial.println(Ethernet.gatewayIP());
  Serial.print("subnet mask: "); Serial.println(Ethernet.subnetMask());
  Serial.print("dns Server:  "); Serial.println(Ethernet.dnsServerIP());
 server.begin();
 Udp.begin(8888);
//********************* запуск часов************************** 
  rtc.begin();
  now = rtc.now();
  task_ntp();  //setting task interval inside 
  SPI.end();

3- работаем с SD

 if (!SD.begin(SD_CS)) {
  Serial.print("SD card on port ");  Serial.print(SD_CS);  Serial.println(" initialization failed!");
  return;
  }
  Serial.println("SD card initialized.");

  cout << F("\nList of files on the SD.\n");    //поток надо раньше организовать
  SD.ls(LS_R);
  cout << F("Done!\n");
//***************************************** проверка или создание лог файла для модулей ****************
                                                                                          
{  String tmp = "modul/" + log_fileName() ;
  char log_name[tmp.length()+1];
  tmp.toCharArray(log_name, sizeof(log_name));

  if (SD.exists(log_name)) {
    Serial.print("SUCCESS - Found ");Serial.print(log_name);Serial.println(" file.");
  } else {   
    Serial.print(log_name); Serial.println(" doesn't exist.");
    if (!file.open(log_name, O_WRONLY | O_CREAT)) {                                //file надо раньше объявить
    Serial.print(log_name); Serial.println(" create failed");
  } else {Serial.print(log_name); Serial.println(" create sucess"); 
  logstring = "Date,Time";
  for (byte i = 0; i <54 ; i++){
  logstring += ",";
  logstring += tpa_name[tpa[i][0]-1];
  logstring += "-";
  logstring += tpa[i][1];
  logstring += ",,,";
  } 
file.println(log_name);
file.close();
Serial.println(logstring);
Serial.print("SUCCESS - log file Created ");Serial.print(log_name);Serial.println(" file.");
  }
 }
}    

4- если обращаемся к W5100 то так

SPI.begin(W5100_CS);
SPI.setClockDivider(W5100_CS,10);             // по необходимости
  client_mod = server_mod.available();
  if (client_mod) {
    //******************************выдаем страницу**********************
    client_mod.stop();
    Serial.println(" disconnected status OK");
  }
SPI.end();

то есть обязательно закрываем сессию работы по SPI, иначе SD перестает работать

если дать команду SPI.begin(4) для SS SD-карты, то сигнал SS перестает падать до нуля и SD не работает.

если инитить SS-10 как выход, то перестает подниматься SS-10 до 3.2v и перестает работать W5100.

к сожаление такой способ не подходит для выдачи страницы web-браузеру , или выгрузки например лог-файла, когда требуется одновременная работа из SD в буфер и из буфера в client.write(buf,len_buf);

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

и, несмотря на впаянный на ресетовый мосфет резистор, автоматический erase при перепрошивке так и не появился...

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

Мучился я мучился и наконец получил рузултат

модет быть вскорости выложу полное решение, но , предварительно :

дуе, эзернет на аппаратном spi на cs-10, и sd на  софтверном spi на библе  sdFat заработали совместно

то есть стандартный пример вэб сервера и приаатаченый к нему пример  ридврайт из библы sdFat на софтверном spi !!! Взлетели вместе.

клиент.врайт выводит в бравзер полученное из sd.read

 

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

Мучился я мучился и наконец получил рузултат

может быть вскорости выложу полное решение, но , предварительно :

дуе, эзернет на аппаратном spi на cs-10, и sd на  софтверном spi на библе  sdFat на произвольных пинах дуи заработали совместно

то есть стандартный пример вэб сервера и приаатаченый к нему пример  ридврайт из библы sdFat на софтверном spi !!! Взлетели вместе. Не забываем прописать в нужном месте sdfat.h единичку , посмотрев пример софтверного spi.

клиент.врайт выводит в бравзер полученное из sd.read

респект за подсказку нашему давнему другу, который перестал сюда приходить.

товарищ и друг модератор извини, но это запостилось дважды (почемутто). Прошу раннее это прибить. СЛАВА ЭТОМУ !!!