RTC SPI?
- Войдите на сайт для отправки комментариев
Вс, 14/04/2019 - 22:19
Приветствую, есть микросхема 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
Накидал такой код, для тестов, пока результатов 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; }мда . тяжодый случай. Изучите для начала как устроены библиотеки для RTC, а потом уже пишите код. Без структуры данных и класса устройства можете даже не начинать.
Я извиняюсь, вы даташит на ЭТУ микросхему видели ? Если видели то вопрос причём тут библиотека для RTC ? Причем тут структура данных? Микросхеме нужно рередать команду и прочитать ответ (несколько байтов), и непойму зачем мне для теста писать класс ? мне кажится что сперва нужно разобраться как упровлять микросхемой какие регистры и за что отвечают а уже потом можно оформеть код в виде класса (не обязательно), вы наверно можете сразу налету прочитав бегло даташит написать класс для подобной микросехми, не потыкав не поэкспериментировав с регистрами, я к сожелению так не могу (
Моя функция передачи данных в микросхему работает, после передачи команды B10111010 на выводе TPout появляется одногерцовый строб, а вот с чтением пока неполучается, мне кажится проблема в то что я не правельно написал команду в датащите 1110хххх у меня B11100000 при смене хххх 0 на 1 меняется выхлоп с FF FF F..... на 0 0 0 0......
Да блин микросхема работает пакетом, где первый байт задает что делаем дальше. И SPI тут не к чему. Напрямую работаем с выводами, переключая вход/выход в соответсвии с правилами пакета. А то что привели ниже, так это пакет настройки и не больше. Как вы дальше собираетесть с часами работать???
Это не SPI. Это их собственный протокол - что-то среднее между SPI и I2C . В общем нечего сложного, но я сомневаюсь что удастся найти подходящюю библиотеку. Надо самому все делать будет.
Это не SPI. Это их собственный протокол - что-то среднее между SPI и I2C . В общем нечего сложного, но я сомневаюсь что удастся найти подходящюю библиотеку. Надо самому все делать будет.
Не совсем так. Это SPI, но полудуплексный. Например STM32 поддерживает данный протокол на аппаратном уровне.