首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带有DS3234 spi通信错误的ESP32 RTC

带有DS3234 spi通信错误的ESP32 RTC
EN

Stack Overflow用户
提问于 2020-03-02 18:08:59
回答 1查看 312关注 0票数 0

我正在努力学习协议和ESP32。我是一个Arduino用户,但是我想转移到带eclipse的ESP32,根本不使用arduino ide。

我试图使用DS3234 rtc与SPI通信,但我无法使它工作。

首先,我用Arduino设置了RTC,一切都很完美,1Hz的脉冲也很好(闪烁)。然后,我首先尝试只读ESP32,但我无法使它工作。

我尝试了来自SPI2 (HSPI_HOST)的来自API参考站点的引脚和来自spi_master模板的pinout,在模式1和3中,基于在Arduino .ide中使用的模式(我也尝试了模式0),我尝试了Spi_freq的freq为1,4,10,16,80 the。Arduino SPI频率为4 4MHz。

来自Espressif站点的API参考: GPIO编号CS0* 15 SCLK 14 MISO 12 MOSI 13

我还尝试在传输开始和结束时手动将CS设置为低和高,还可以设置代码:选择所有

代码语言:javascript
复制
spi_device_interface_config_t.spics_io_num=-1

GeSHi (代码盒+)扩展。我给你的是main.c文件和我的输出。

我使用time.h和time()函数来获取系统时间,但是正如您将在输出中看到的那样,这也没有给出正确的时间,甚至尝试将1970年1月1日Tue 1的0:00:00设置为rtc无效,因为您将看到读取函数的返回值为0:00:00-1,这是不正确的,而且秒也没有变化。

也许主要关心的是我的spi设置中是否有问题,总线、开发、初始化等等。如果有人能帮上忙的话,那就太好了。谢谢。

代码语言:javascript
复制
#include "stdio.h"
#include "stdbool.h"
#include "freertos/FreeRTOS.h"
#include "esp_system.h"
#include "freertos/task.h"
#include "driver/gpio.h"
#include "driver/spi_master.h"
#include "string.h"
#include "time.h"

#define MISO 12
#define MOSI 13
#define CLK 14
#define CS 15

#define PIN_NUM_MISO 25
#define PIN_NUM_MOSI 23
#define PIN_NUM_CLK  19
#define PIN_NUM_CS   22

#define SQW_1Hz 0b00000000;
#define WRITE_CONTROL_REG 0x8E
#define READ_CONTROL_REG 0x0E
#define WRITE_TIME_REG 0x80
#define READ_TIME_REG 0x00


spi_device_handle_t spi;
spi_bus_config_t busCfg;
spi_device_interface_config_t devCfg;


uint8_t bcdToInt(uint8_t bcd){
    return bcd-6*(bcd>>4);
}

uint8_t intToBcd(uint8_t dec){
    return dec+6*(dec/10);
}

uint8_t bcdTo24Hour(uint8_t bcdHour){
    uint8_t hour;
    if(bcdHour&0x40){
        bool isPm = ((bcdHour& 0x20)!=0);
        hour=bcdToInt(bcdHour& 0x1f);
        if(isPm){
            hour+=12;
        }
    }else{
        hour= bcdToInt(bcdHour);
    }
    return hour;
}


void spiInit(){

    busCfg.miso_io_num=MISO;
    busCfg.mosi_io_num=MOSI;
    busCfg.sclk_io_num=CLK;

//  busCfg.miso_io_num=PIN_NUM_MISO;
//  busCfg.mosi_io_num=PIN_NUM_MOSI;
//  busCfg.sclk_io_num=PIN_NUM_CLK;
    busCfg.quadhd_io_num=-1;
    busCfg.quadwp_io_num=-1;

    spi_bus_initialize(HSPI_HOST,&busCfg,2);

    vTaskDelay(100/portTICK_PERIOD_MS);

    devCfg.mode=1;
    devCfg.clock_speed_hz=1*1000*1000;
    devCfg.spics_io_num=CS;
    devCfg.queue_size=7;

    spi_bus_add_device(HSPI_HOST,&devCfg,&spi);

    vTaskDelay(100/portTICK_PERIOD_MS);

//  gpio_pad_select_gpio(PIN_NUM_CS);
//  gpio_set_direction(PIN_NUM_CS,GPIO_MODE_OUTPUT);
//  gpio_set_level(PIN_NUM_CS,1);

//  gpio_pad_select_gpio(CS);
//  gpio_set_direction(CS,GPIO_MODE_OUTPUT);
//  gpio_set_level(CS,1);

}

void setCS(){

    gpio_set_level(CS,0);
}

void unsetCS(){
    gpio_set_level(CS,1);
}

void setControlReg(const uint8_t cmd){


    esp_err_t ret;
    spi_transaction_t t;
    memset(&t,0,sizeof(t));
    t.length=8;
    t.tx_buffer=&cmd;
    ret=spi_device_transmit(spi,&t);

    assert(ret==ESP_OK);
}
void setTime(const uint8_t *data,uint8_t cmd,int len){

    //setCS();
    setControlReg(cmd);

    esp_err_t ret;
    spi_transaction_t t;
    memset(&t,0,sizeof(t));
    t.length=len*8;
    t.tx_buffer=&data;
    ret=spi_device_transmit(spi,&t);
    assert(ret==ESP_OK);
    //unsetCS();
}

uint8_t* readData(const uint8_t cmd,int len,uint8_t *data){

    //setCS();
    setControlReg(cmd);

    esp_err_t ret;
    spi_transaction_t t;
    memset(&t,0,sizeof(t));
    t.length=len*8;
    t.flags=SPI_TRANS_USE_RXDATA;
    ret=spi_device_transmit(spi,&t);
    //printf("Get Data result");
    assert(ret==ESP_OK);

    //unsetCS();

    data=t.rx_data;

    return data;

}

void print_time(struct tm tm){

    printf("Time: %i:%i:%i %i Day %i-%i-%i\n",tm.tm_hour,tm.tm_min,tm.tm_sec,tm.tm_wday,tm.tm_year+2000,tm.tm_mon+1,tm.tm_mday);
}

uint8_t* timeToBuffer(uint8_t *data,struct tm tm){
    printf("Time to buffer");
    print_time(tm);
    data[0]=intToBcd(tm.tm_sec);
    data[1]=intToBcd(tm.tm_min);
    data[2]=intToBcd(tm.tm_hour);
    data[3]=intToBcd(tm.tm_wday);
    data[4]=intToBcd(tm.tm_mday);
    data[5]=intToBcd(tm.tm_mon);
    data[6]=intToBcd(tm.tm_year);

    return data;

}

void bufferToTime(struct tm *tm,uint8_t *buffer){


    tm->tm_sec=bcdToInt(buffer[0]);
    tm->tm_min=bcdToInt(buffer[1]);
    tm->tm_hour=bcdTo24Hour(buffer[2]);
    tm->tm_wday=bcdToInt(buffer[3]);
    tm->tm_mday=bcdToInt(buffer[4]);
    tm->tm_mon=bcdToInt(buffer[5]);
    tm->tm_year=bcdToInt(buffer[6]);

}


void app_main(void)
{
    printf("Initializing SPI\n");
    spiInit();

    printf("Set Time\n");

    uint8_t bufferData[7];
    memset(bufferData,0,sizeof(bufferData));

    time_t curTime;
    time(&curTime);
    printf("%s\n",ctime(&curTime));
    struct tm *myTime=localtime(&curTime);


    setTime(timeToBuffer(bufferData,*myTime),WRITE_TIME_REG,7);
    memset(bufferData,0,sizeof(bufferData));

    printf("Start Reading\n");
    while (true) {
        readData(READ_TIME_REG,7,bufferData);
        bufferToTime(myTime,bufferData);
        print_time(*myTime);
        vTaskDelay(1000/portTICK_PERIOD_MS);
    }
}

输出:

初始化SPI

设定时间

清华1月1日00:00: 1970

bufferTime时间: 0:0:0 4天2070-1-1

开始阅读

时间: 0:0:0日2000-1-0

时间: 0:0:0日2000-1-0

时间: 0:0:0日2000-1-0

EN

回答 1

Stack Overflow用户

发布于 2020-03-02 20:40:44

我发现了问题。

一组时间正在正常工作。在读取时,我必须注释掉标记,并将t.rx_buffer设置为数据变量。所以这个函数中的代码就像。

代码语言:javascript
复制
uint8_t* readData(const uint8_t cmd,int len,uint8_t *data){

    setCS();
    setControlReg(cmd);

    esp_err_t ret;
    spi_transaction_t t;
    memset(&t,0,sizeof(t));
    t.length=len*8;
    //t.flags=SPI_TRANS_USE_RXDATA;
    //t.tx_buffer=data;
    t.rx_buffer=data;
    ret=spi_device_transmit(spi,&t);
    //printf("Get Data result");
    assert(ret==ESP_OK);

    unsetCS();

    //data=t.rx_data;

    return data;

}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60494380

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档