Найти тему

espressif I2c slave and master led

Цель: практически убедится в правильности понимания вопроса и достижения результата по примеру, который применим в других целях. 👌

порядок работы: a) создать два проекта в espressif slave и master. b) ввеси туда код с примеров. г) Отладить проекты д) собрать схему е) прошить чипы отлаженным кодом . убедиться в правильности работы кода.🚩

Замутнело в голове. Тень сомненья есть везде.

Значит надо просветлеть и сомненье прям изжечь.

Ну и так понятно. что всё просто адекватно.

но по логике событий если этого вдруг не факт ,

то при случае возникнуть может временной бардак.

Там споткнулся, тут упал, где то вдруг и промолчал,

и промямлил вслед за чем? почему такой удел?

Куча мелких тренировок позволяет напрягать -

да извилины качать, и тогда качек мозгов

фору даст хоть эрудиту , но слово блудному ленивцу.

ох моторикой не блещет , да в несложностях клевещет.

значит пин ему достоен? А игнор его пристроит ?

  • Бусинки простых примеров и решений проверенных позволяют в конечном случае организовывать сложные алгоритмы и системы.🎏
  • Кстати два чипа - уже больше ног и создание системы обмена данными по нескольким дублирующим каналам.
две платы
две платы

соберём схему. выше . Запитаем. Откроем диспетчер устройств

видны устройства
видны устройства

Определим какие порты задействованы под какую плату!😶

Чтобы при прошивки указывать правильные порты, а не прошивать одну и туже плату.🤢

Ниже карта операций из трёх действий😑

три  три три дыру не протри.
три три три дыру не протри.

далее создать проект и это ниже карта операций

двы два ?
двы два ?

Две операции. Дале создадим проект MASTER.

стрелки видны
стрелки видны

пострелкам.

Далее находим файл mail.. Туда кидаем код ниже

#include <stdio.h>
#include <string.h>
#include "esp_log.h"
#include "driver/i2c.h"
static const char *TAG = "i2c-master";
#define I2C_MASTER_SCL_IO 22 /*!< gpio number for I2C master clock */
#define I2C_MASTER_SDA_IO 21 /*!< gpio number for I2C master data */
#define I2C_MASTER_FREQ_HZ 100000 /*!< I2C master clock frequency */
#define I2C_MASTER_TX_BUF_DISABLE 0 /*!< I2C master doesn't need buffer */
#define I2C_MASTER_RX_BUF_DISABLE 0 /*!< I2C master doesn't need buffer */
#define SLAVE_ADDRESS 0x0A
#define WRITE_BIT I2C_MASTER_WRITE /*!< I2C master write */
#define READ_BIT I2C_MASTER_READ /*!< I2C master read */
#define ACK_CHECK_EN 0x1 /*!< I2C master will check ack from slave*/
#define ACK_CHECK_DIS 0x0 /*!< I2C master will not check ack from slave */
#define ACK_VAL 0x0 /*!< I2C ack value */
#define NACK_VAL 0x1 /*!< I2C nack value */
int i2c_master_port = 0;
static esp_err_t i2c_master_init(void)
{i2c_config_t conf = {
.mode = I2C_MODE_MASTER,
.sda_io_num = I2C_MASTER_SDA_IO,
.sda_pullup_en = GPIO_PULLUP_ENABLE,
.scl_io_num = I2C_MASTER_SCL_IO,
.scl_pullup_en = GPIO_PULLUP_ENABLE,
.master.clk_speed = I2C_MASTER_FREQ_HZ,
// .clk_flags = 0, /*!< Optional, you can use I2C_SCLK_SRC_FLAG_* flags to choose i2c source clock here. */
};////////////////////////
esp_err_t err = i2c_param_config(i2c_master_port, &conf);
if (err != ESP_OK) {
return err;
}/////////////////////////////////
return i2c_driver_install(i2c_master_port, conf.mode, I2C_MASTER_RX_BUF_DISABLE, I2C_MASTER_TX_BUF_DISABLE, 0);
}///////////////////////////////////
static esp_err_t i2c_master_send(uint8_t message[], int len)
{ ESP_LOGI(TAG, "Sending Message = %s", message); esp_err_t ret;
i2c_cmd_handle_t cmd = i2c_cmd_link_create(); i2c_master_start(cmd);
i2c_master_write_byte(cmd, SLAVE_ADDRESS << 1 | WRITE_BIT, ACK_CHECK_EN);
i2c_master_write(cmd, message, len, ACK_CHECK_EN); i2c_master_stop(cmd);
ret = i2c_master_cmd_begin(i2c_master_port, cmd, 1000 / portTICK_PERIOD_MS);
i2c_cmd_link_delete(cmd);
return ret;
}///////////////////////////////////
void app_main(void)
{const uint8_t on_command[] = "LED_ON";
const uint8_t off_command[] = "LED_OFF";
ESP_ERROR_CHECK(i2c_master_init());
ESP_LOGI(TAG, "I2C initialized successfully");
while(1) {i2c_master_send(on_command, sizeof(on_command));
vTaskDelay(1000/ portTICK_PERIOD_MS);
i2c_master_send(off_command, sizeof(off_command));
vTaskDelay(1000/ portTICK_PERIOD_MS);
}
}

два пункта выполним.
два пункта выполним.

Выполним 4 операции как указано ниже.

карта операций из 4 шагов.
карта операций из 4 шагов.

прошивка одного из чита должна пройти успешно. Запомните номер порта - на операции два. Можно временно после прошивки выключить чип - плату.

ТАК ЖЕ выключите проект MASTER - показано ниже

закрыть проект.
закрыть проект.

Закрыть проект MASTER после прошивки платы, которая будет ведущей= главной. На время данную плату можно выключить - отсоединить.

Выполним карту операций ниже - создать новый проект и назвать его SLAVE

две операции
две операции

Выполните операции как указано ниже

две стрелы
две стрелы

В файл mail.введите ниже указанный код.

#include <stdio.h>
#include <string.h>
#include "esp_log.h"
#include "driver/i2c.h"
#include "driver/gpio.h"
#include "soc/gpio_num.h"
static const char *TAG = "i2c-slave";
#define LED_PIN GPIO_NUM_2
#define I2C_SLAVE_SCL_IO 22 /*!< gpio number for I2C master clock */
#define I2C_SLAVE_SDA_IO 21 /*!< gpio number for I2C master data */
#define I2C_SLAVE_FREQ_HZ 100000 /*!< I2C master clock frequency */
#define I2C_SLAVE_TX_BUF_LEN 255 /*!< I2C master doesn't need buffer */
#define I2C_SLAVE_RX_BUF_LEN 255 /*!< I2C master doesn't need buffer */
#define ESP_SLAVE_ADDR 0x0A
#define WRITE_BIT I2C_MASTER_WRITE /*!< I2C master write */
#define READ_BIT I2C_MASTER_READ /*!< I2C master read */
#define ACK_CHECK_EN 0x1 /*!< I2C master will check ack from slave*/
#define ACK_CHECK_DIS 0x0 /*!< I2C master will not check ack from slave */
#define ACK_VAL 0x0 /*!< I2C ack value */
#define NACK_VAL 0x1 /*!< I2C nack value */
int i2c_slave_port = 0;
static esp_err_t i2c_slave_init(void)
{ i2c_config_t conf_slave = {
.sda_io_num = I2C_SLAVE_SDA_IO, // select GPIO specific to your project
.sda_pullup_en = GPIO_PULLUP_ENABLE,
.scl_io_num = I2C_SLAVE_SCL_IO, // select GPIO specific to your project
.scl_pullup_en = GPIO_PULLUP_ENABLE,
.mode = I2C_MODE_SLAVE,
.slave.addr_10bit_en = 0,
.slave.slave_addr = ESP_SLAVE_ADDR, // address of your project
.clk_flags = 0,
};
esp_err_t err = i2c_param_config(i2c_slave_port, &conf_slave);
if (err != ESP_OK) {
return err;
}
return i2c_driver_install(i2c_slave_port, conf_slave.mode, I2C_SLAVE_RX_BUF_LEN, I2C_SLAVE_TX_BUF_LEN, 0);
}
void app_main(void)
{ uint8_t received_data[I2C_SLAVE_RX_BUF_LEN] = {0};
uint8_t on_command[] = "LED_ON"; ////gpio_pad_select_gpio(LED_PIN);
gpio_reset_pin(LED_PIN);
// gpio_pad_rezet_gpio(LED_PIN);
gpio_set_direction(LED_PIN, GPIO_MODE_OUTPUT);
ESP_ERROR_CHECK(i2c_slave_init());
ESP_LOGI(TAG, "I2C Slave initialized successfully");
while(1)
{ i2c_slave_read_buffer(i2c_slave_port, received_data, I2C_SLAVE_RX_BUF_LEN, 100 / portTICK_PERIOD_MS);
i2c_reset_rx_fifo(i2c_slave_port);
if(strncmp((const char*)received_data, "LED_ON", 6) == 0)
{ESP_LOGI(TAG, "Data Recived = %s", received_data); gpio_set_level(LED_PIN, 1);
} else if(strncmp((const char*)received_data, "LED_OFF", 7) == 0)
{ESP_LOGI(TAG, "Data Recived = %s", received_data); gpio_set_level(LED_PIN, 0);
} memset(received_data, 0, I2C_SLAVE_RX_BUF_LEN);
}
}

Укажите порт для прошивки и на финиш.

ну  как  указывать порт  можно в видеороликах еще посмотреть.
ну как указывать порт можно в видеороликах еще посмотреть.

Как указывать порт прошивки надо в видеороликах посмотреть еще.

Далее карта операций на два пункта

два пункта выполнили.
два пункта выполнили.

Если чип прошился? .

Включаем оба чипа и смотрим мигание ведомого .

если открыть геркулес по мастеру то будем видеть.

видим результат
видим результат

КАК работать с данной программой можете посмотреть в сети или в предыдущих творческих изысканиях и познаниях.

если открыть геркулес по ведомому - slave то будем видеть.

видеть будем результат
видеть будем результат

В принципе код рабочий и схема адекватная.

Спонсор ООО АК ПРАВОВОЕ СОТРУДНИЧЕСТВО.

Ссылки на ролики

мечты сбываются

sht31 датчик проверить

камень живой

мудрёный дом

ссылка на архив САПР ТП

как организовать творчество

Лайки можно ставить, но если не тяжко то поставите тут