Veja que a forma de colocar dados na memoria é por identificadores e não por posição de memoria como é feito nos microcontroladores.As informações serão retornadas pela porta serial(rs-232) do chip.
O código fonte:
#include <ESP8266WiFi.h> #include "FS.h" const int LED_STATUS = 2; // led de status const int ANALOGICA = A0; // porta analogica ///emulando uma porta SPI generica - aqui se configura quais pinos se quer usar //////////////// const int SPI_CLK = 14; //ligue no sinal de clock const int SPI_IN = 13; //ligue no Mosi const int SPI_OUT = 12; //ligue no Miso const int SPI_CS = 16; //ligue no chip select //*********************************************************************************************************** // Registradores do chip DS3234 - endereço de leitura,para escrever basta somar 0X80 ao valor hexadecimal //*********************************************************************************************************** #define DS3234_SEG 0X00 // registrador de segundos #define DS3234_MIN 0X01 // registrador de minutos #define DS3234_HORA 0X02 // registrador de horas #define DS3234_DIA_SEMANA 0X03 // registrador de dia da semana #define DS3234_DIA 0X04 // registrador de dia #define DS3234_MES 0X05 // registrador de Mes #define DS3234_ANO 0X06 // registrador de ano #define DS3234_ALM1_SEG 0X07 // registrador Alarme 1 de segundos #define DS3234_ALM1_MIN 0X08 // registrador Alarme 1 de minutos #define DS3234_ALM1_HORA 0X09 // registrador Alarme 1 de horas #define DS3234_ALM1_DIA_SEMANA 0X0A // registrador Alarme 1 de dia e dia da semana #define DS3234_ALM2_MIN 0X0B // registrador Alarme 2 de minutos #define DS3234_ALM2_HORA 0X0C // registrador Alarme 2 de horas #define DS3234_ALM2_DIA_SEMANA 0X0D // registrador Alarme 2 de dia e dia da semana #define DS3234_CONTROLE 0X0E // registrador de controle(config) #define DS3234_STAT_CONTROLE 0X0F // registrador de controle e status #define DS3234_CONF_CRISTAL 0X10 // registrador do cristal interno #define DS3234_TEMP_H 0X11 // registrador do sensor de temperatura parte alta(msb)) #define DS3234_TEMP_L 0X12 // registrador do sensor de temperatura parte baixa(lsb) #define DS3234_S_RAM 0X18 // registrador da memoria S_RAM #define DS3234_S_RAM_DADOS 0X18 // registrador da memoria S_RAM dados void setup() { Serial.begin(115200); conf_pinos(); inicializa_spi(); inicializa_DS3234(); ler_memo_rom(); } void loop() { digitalWrite(LED_STATUS,HIGH); Serial.print("DATA:"); Serial.print(DS3234_ler_spi(DS3234_DIA), HEX); Serial.print("/"); Serial.print(DS3234_ler_spi(DS3234_MES), HEX); Serial.print("/"); Serial.print(DS3234_ler_spi(DS3234_ANO), HEX); Serial.print(" -> "); Serial.print(DS3234_ler_spi(DS3234_HORA), HEX); Serial.print(":"); Serial.print(DS3234_ler_spi(DS3234_MIN), HEX); Serial.print(":"); Serial.println(DS3234_ler_spi(DS3234_SEG), HEX); delay(300);//1s digitalWrite(LED_STATUS,LOW); delay(300);//1s } /* * Funções usadas no laço principal * eu poderia ter montado uma lib - mas a ideia é compartilhar como se faz * uma comunicação spi com o DS3234 que sirva em qualquer dispositivo. */ //////////////////////////////////////////////////////////////////// //configura os pinos //////////////////////////////////////////////////////////////////// void conf_pinos() { pinMode(9, INPUT);//sempre será entrada pinMode(LED_STATUS, OUTPUT); digitalWrite(LED_STATUS, LOW); return; } //////////////////////////////////////////////////////////////////// //lendo a memoria rom do ESP8266 //////////////////////////////////////////////////////////////////// void ler_memo_rom() { bool result = SPIFFS.begin(); Serial.println("abrindo SPIFFS : " + result); File f = SPIFFS.open("/f.alame1", "r"); if (!f) { // tenta abrir o arquivo com nome "f.alame1" Serial.println("Arquivo não existe"); // abre o arquivo em modo escrita File f = SPIFFS.open("/f.alame1", "w");//cria ao arquivo if (!f) { Serial.println("não foi possivel cria o arquivo!"); } // escreve 2 linhas já colocando o caracter de fim de linha f.println("hora=12"); f.println("minutos=00"); } else {//o arquivo já existe Serial.println("Dados da memoria :"); while(f.available()) //enquanto tiver dados ele lê {//cria string para ler um linha a linha do arquivo String line = f.readStringUntil('\n'); Serial.println(line); } } f.close(); } //////////////////////////////////////////////////////////////////// //cria estado padrão dos pinos spi //////////////////////////////////////////////////////////////////// void inicializa_spi() { pinMode(SPI_CLK, OUTPUT); digitalWrite(SPI_CLK, HIGH); pinMode(SPI_IN, INPUT); pinMode(SPI_OUT, OUTPUT); digitalWrite(SPI_OUT, LOW); pinMode(SPI_CS, OUTPUT); digitalWrite(SPI_CS,HIGH); return; } //////////////////////////////////////////////////////////////////// //inicializa o chip //////////////////////////////////////////////////////////////////// void inicializa_DS3234() { DS3234_escr_spi(DS3234_CONTROLE,0X80);//80= desliga saida do oscilador , SQ wave @1hz, Alarme desabilitados DS3234_escr_spi(DS3234_ANO,0X17);//configura data para 25/08/2017 - 15:05 DS3234_escr_spi(DS3234_MES,0X02);//colocar os valores sempre em hexadecimal DS3234_escr_spi(DS3234_DIA,0X25); DS3234_escr_spi(DS3234_HORA,0X15); DS3234_escr_spi(DS3234_MIN,0X05); return; } //////////////////////////////////////////////////////////////////// //essa rotina serve tanto para escrever quanto para ler //////////////////////////////////////////////////////////////////// int DS3234_ler_spi_byte(int valor,int liga_cs) {//já escreve e já lê int dados = 0; int pos=128; digitalWrite(SPI_CS, LOW); delayMicroseconds(1); while(pos>0)///bit mais significativo primeiro { if((valor&pos)>0)//faz uma operaçao and e checa se é 1 {digitalWrite(SPI_OUT,HIGH);} else {digitalWrite(SPI_OUT,LOW);} digitalWrite(SPI_CLK,LOW); delayMicroseconds(1); ///tempo em nivel baixo do clock if(digitalRead(SPI_IN)==HIGH) {dados = dados|pos;} digitalWrite(SPI_CLK,HIGH); delayMicroseconds(1); ///tempo em nivel baixo do clock//tempo em nivel alto do clock pos=pos/2;//rotaciona 1 bit } if(liga_cs == 1) {digitalWrite(SPI_CS, HIGH);} return(dados); } //////////////////////////////////////////////////////////////////// //essa rotina lê um byte do registrador colocado em endereço //////////////////////////////////////////////////////////////////// int DS3234_ler_spi(int endereco) { int dados; DS3234_ler_spi_byte(endereco,0); dados = DS3234_ler_spi_byte(0X00,1);//não envia nada somente para pegar os dados return(dados); } //////////////////////////////////////////////////////////////////// //essa rotina escreve um byte no registrador em endereço //////////////////////////////////////////////////////////////////// void DS3234_escr_spi(int endereco,int dados) { endereco = endereco|0X80;//pronto pra escrever DS3234_ler_spi_byte(endereco,0); DS3234_ler_spi_byte(dados,1); }
Até a próxima pessoal!
Nenhum comentário :
Postar um comentário
olá,digite aqui seu comentário!