RTC SPI?

walt88
Offline
Зарегистрирован: 14.04.2019

Приветствую, есть микросхема RTC марки S-3510, вообщем пытаюсь понять как её запустить, загвоздка в том чо вроде как микросхема имеет интерфейс SPI (это не точно), но есть одно но, в документации по SPI указаны выводы MOSI-MISO для передачи информации от микроконтроллера в устройство и обратно, а у S-3510 вместо MOSI-MISO указан двунаправленный вывод SIO и инвертирован вывод  SCK (тут вроде разобрался должно помочь setDataMode(SPI_MODE*)), хотелось бы чтоб кто нибудь из старожилов форума подсказвл как её запустить, зарание благодарю

Datasheet

 

https://www.alldatasheet.com/datasheet-pdf/pdf/80556/SII/S-3510.html

walt88
Offline
Зарегистрирован: 14.04.2019

Накидал такой код, для тестов, пока результатов 0, на выходе FF FF FF FF FF FF FF, может я что то не так делаю? Для меня это пока тёмный лес.

#include <SPI.h> 

#define _DELAY10 10
int nCS = 10; 
int nSIO = 11; 
int nSCK = 12; 

void setup(){ 
	Serial.begin(9600);
	Rtc_init(); 
	Serial.println("startup !!"); 
	//сброс Rtc
	//digitalWrite(nCS, HIGH); //чип силект на +
	//Rtc_writeByte(B10101010); //ресет
	//delay(1000);
	//digitalWrite(nCS, LOW); //чип силект на -
} 

void loop(){ 
	uint8_t r;

	delay(1000); 

	digitalWrite(nCS, HIGH);//чип силект на +

	Rtc_writeByte(B11100000); // команда на чтение из Rtc 1110хххх

	for(int8_t i = 0; i <= 6; i++) { // читаем 7 байт Y-M-D-status-H-Min-Sec
		r = Rtc_readByte();
		Serial.print(r, HEX);
		//Serial.print(r, BIN);
		Serial.print(" "); //Serial.print("\t"); 
	}
	digitalWrite(nCS, LOW);//чип силект на -
	Serial.print("\n"); 
} 


void Rtc_init() {
	pinMode(nSIO, OUTPUT);
	pinMode(nSCK, OUTPUT);
	pinMode(nCS, OUTPUT);

	digitalWrite(nSIO, LOW);
	digitalWrite(nSCK, LOW);  
}

void Rtc_writeByte(byte data) {
	pinMode(nSIO, OUTPUT);
	for(int8_t i = 0; i <= 7; i++) {
		digitalWrite(nSCK, LOW); //
		digitalWrite(nSIO, bitRead(data, i));delayMicroseconds(_DELAY10);
		digitalWrite(nSCK, HIGH);
	}
}


byte Rtc_readByte() {
	byte data = 0;
	pinMode(nSIO, INPUT);
	for(int8_t i = 0; i <= 7; i++) {//for(int8_t i = 7; i >= 0; i--) {
		digitalWrite(nSCK, LOW); //пин SCK на - 
		bitWrite(data, i, digitalRead(nSIO));delayMicroseconds(_DELAY10); // читаем состояние SIO в byte
		digitalWrite(nSCK, HIGH); //пин SCK на + 
	}
	return data;
}

 

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

мда . тяжодый случай. Изучите для начала как устроены библиотеки для RTC, а потом уже пишите код. Без структуры данных и класса устройства можете даже не начинать.

walt88
Offline
Зарегистрирован: 14.04.2019

Я извиняюсь, вы даташит на ЭТУ микросхему видели ? Если видели то вопрос причём тут библиотека для RTC ? Причем тут структура данных? Микросхеме нужно рередать команду и прочитать ответ (несколько байтов), и непойму зачем мне для теста писать класс ? мне кажится что сперва нужно разобраться как упровлять микросхемой какие регистры и за что отвечают а уже потом можно оформеть код в виде класса (не обязательно), вы наверно можете  сразу налету прочитав бегло даташит написать класс для подобной микросехми, не потыкав не поэкспериментировав с регистрами, я к сожелению так не могу (

walt88
Offline
Зарегистрирован: 14.04.2019

Моя функция передачи данных в микросхему работает, после передачи команды B10111010 на выводе TPout появляется одногерцовый строб, а вот с чтением пока неполучается, мне кажится проблема в то что я не правельно написал команду в датащите 1110хххх у меня B11100000 при смене хххх 0 на 1 меняется выхлоп с FF FF F..... на 0 0 0 0......

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Да блин микросхема работает пакетом, где первый байт задает что делаем дальше. И SPI тут не к чему. Напрямую работаем с выводами, переключая вход/выход в соответсвии с правилами пакета. А то что привели ниже, так это пакет настройки и не больше. Как вы дальше собираетесть с часами работать???

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

Это не SPI. Это их собственный протокол - что-то среднее между SPI и I2C . В общем нечего сложного, но я сомневаюсь что удастся найти подходящюю библиотеку. Надо самому все делать будет.  

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

asam пишет:

Это не SPI. Это их собственный протокол - что-то среднее между SPI и I2C . В общем нечего сложного, но я сомневаюсь что удастся найти подходящюю библиотеку. Надо самому все делать будет.  

Не совсем так. Это SPI, но полудуплексный. Например STM32 поддерживает данный протокол на аппаратном уровне.