c-DS3234 RTC与ESP32 spi通信错误



我正在努力学习协议和ESP32。我是Arduino的用户,但我想使用eclipse转到ESP32,而不是使用Arduino ide。

我正在尝试使用SPI通信的DS3234-rtc,但我无法使其工作。

首先,我用Arduino设置了RTC,一切都很完美,1Hz脉冲也很好(闪烁(。然后我先试着只读ESP32,但我无法做到。

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

根据Espressif网站中的API参考:GPIO编号CS0*15SCLK 14味噌12MOSI 13

我还尝试在传输开始和结束时手动将CS设置为低和高代码:[全选][展开/折叠]

spi_device_interface_config_t.spics_io_num=-1

GeSHi©Codebox Plus扩展。我给你主.c文件和我的输出。

我使用time.h和time((函数来获取系统时间,但正如你在输出中看到的那样,这也没有给出正确的时间,甚至试图将1970年1月1日星期二的0:00:00设置为rtc也不起作用,因为你会看到Read函数的返回是0:00:00 1作为第2000-1-1天,这是不正确的,而且秒数也没有变化。

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

#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-%in",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 SPIn");
spiInit();
printf("Set Timen");
uint8_t bufferData[7];
memset(bufferData,0,sizeof(bufferData));
time_t curTime;
time(&curTime);
printf("%sn",ctime(&curTime));
struct tm *myTime=localtime(&curTime);

setTime(timeToBuffer(bufferData,*myTime),WRITE_TIME_REG,7);
memset(bufferData,0,sizeof(bufferData));
printf("Start Readingn");
while (true) {
readData(READ_TIME_REG,7,bufferData);
bufferToTime(myTime,bufferData);
print_time(*myTime);
vTaskDelay(1000/portTICK_PERIOD_MS);
}
}

输出:

初始化SPI

设置时间

1970年1月1日星期四00:00:00

缓冲时间时间:第4天0:0:0 2070-1-1

开始读取

时间:2000-1-0 当天0:0:0

时间:2000-1-0 当天0:0:0

时间:2000-1-0 当天0:0:0

我发现了问题。

时间设置工作正常。读取时,我必须注释掉标志,并将t.rx_buffer设置为数据变量。因此,此函数中的代码的工作方式类似。

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;
}

最新更新