参照chatgpt,软件备份,下一步用spi协议的显示屏显示。这样就学习了串口uart, i2c,spi三种通信协议。
#include <stdio.h>
#include "driver/i2c.h"
#include "esp_system.h"
#include "esp_log.h"
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "driver/uart.h"
#include <string.h>
#include "driver/gpio.h"
#define UART_NUM UART_NUM_2
#define TXD_PIN 17 //17
#define RXD_PIN 16 //16
#define BUF_SIZE 1024
// I2C 配置参数
#define I2C_EXAMPLE_MASTER_SDA_IO 21 // I2C 数据引脚
#define I2C_EXAMPLE_MASTER_SCL_IO 22 // I2C 时钟引脚
#define I2C_EXAMPLE_MASTER_NUM I2C_NUM_0
#define I2C_EXAMPLE_MASTER_FREQ_HZ 100000
#define I2C_EXAMPLE_MASTER_TX_BUF_DISABLE 0
#define I2C_EXAMPLE_MASTER_RX_BUF_DISABLE 0
#define DS3231_ADDR 0x68 // DS3231 的 I2C 地址
#define WRITE_BIT I2C_MASTER_WRITE
#define READ_BIT I2C_MASTER_READ
void init_uart() {
const uart_config_t uart_config = {
.baud_rate = 115200,
.data_bits = UART_DATA_8_BITS,
.parity = UART_PARITY_DISABLE,
.stop_bits = UART_STOP_BITS_1,
.flow_ctrl = UART_HW_FLOWCTRL_DISABLE
};
uart_param_config(UART_NUM, &uart_config);
uart_set_pin(UART_NUM, TXD_PIN, RXD_PIN, UART_PIN_NO_CHANGE, UART_PIN_NO_CHANGE);
uart_driver_install(UART_NUM, BUF_SIZE * 2, 0, 0, NULL, 0);
}
// 初始化 I2C
esp_err_t i2c_master_init() {
esp_err_t ret;
i2c_config_t conf;
conf.mode = I2C_MODE_MASTER;
conf.sda_io_num = I2C_EXAMPLE_MASTER_SDA_IO;
conf.scl_io_num = I2C_EXAMPLE_MASTER_SCL_IO;
conf.sda_pullup_en = GPIO_PULLUP_ENABLE;
conf.scl_pullup_en = GPIO_PULLUP_ENABLE;
conf.master.clk_speed = I2C_EXAMPLE_MASTER_FREQ_HZ;
ret = i2c_param_config(I2C_EXAMPLE_MASTER_NUM, &conf);
if (ret != ESP_OK) {
return ret;
}
ret = i2c_driver_install(I2C_EXAMPLE_MASTER_NUM, conf.mode, I2C_EXAMPLE_MASTER_RX_BUF_DISABLE, I2C_EXAMPLE_MASTER_TX_BUF_DISABLE, 0);
return ret;
}
// 读取 DS3231 时间
esp_err_t ds3231_read_time(uint8_t *data, size_t length) {
esp_err_t ret;
i2c_cmd_handle_t cmd = i2c_cmd_link_create();
i2c_master_start(cmd);
i2c_master_write_byte(cmd, (DS3231_ADDR << 1) | WRITE_BIT, true);
i2c_master_write_byte(cmd, 0x00, true); // 从 DS3231 的寄存器 0 开始读取时间
i2c_master_start(cmd);
i2c_master_write_byte(cmd, (DS3231_ADDR << 1) | READ_BIT, true);
i2c_master_read(cmd, data, length, I2C_MASTER_LAST_NACK);
i2c_master_stop(cmd);
ret = i2c_master_cmd_begin(I2C_EXAMPLE_MASTER_NUM, cmd, 1000 / portTICK_PERIOD_MS);
i2c_cmd_link_delete(cmd);
return ret;
}
void app_main() {
init_uart();
// uint8_t data[128];
// int length =100;
// int len;
esp_err_t ret;
uint8_t data[7]; // DS3231 返回 7 字节数据
// 初始化 I2C
ret = i2c_master_init();
if (ret != ESP_OK) {
ESP_LOGE("I2C", "Failed to initialize I2C");
return;
}
// 读取时间
while(1){
ret = ds3231_read_time(data, sizeof(data));
if (ret == ESP_OK) {
printf("DS3231 Time Data: ");
for (int i = 0; i < 7; i++) {
printf("%02x", data[i]);
}
uint8_t out=data[0];
uart_write_bytes(UART_NUM,&out,1); //向pc串口发送秒数字
printf("\n");
} else {
ESP_LOGE("DS3231", "Failed to read time");
}
vTaskDelay(pdMS_TO_TICKS(1000));
}
}