как подключить 2ой IIC

gisli79
Offline
Зарегистрирован: 16.01.2019

Добрый день.

Сейчас работаю с платой STM32F103 blue pill.

1.Использую аппаратный IIC(В6, B7), подключив файл Wire.h.

Все работает хорошо.

2. Возникла необходимость использовать 2ой аппаратный IIC (В10, В11). Каким образом это можно сделать? Добавление цифры 1

или 2 к командам IIC (как в Serial) не работает.

Заранее спасибо.

С уважением, Антон.

 

Муж_Долговой
Муж_Долговой аватар
Offline
Зарегистрирован: 07.10.2018

Набери в пользовательский поиск "Два датчика на I2C". Получишь кучу ответов. Рассмотри.

gisli79
Offline
Зарегистрирован: 16.01.2019

 

Добрый день.

Спасибо. В поиске нашел, но файл HARDWIRE.h не подключается.

#include <stdint.h>
08 #include <HardWire.h>

 

Jeka_M
Jeka_M аватар
Offline
Зарегистрирован: 06.07.2014

Так как всё-таки называется файл: HARDWIRE.h или HardWire.h ? Для языка программирования С/С++ это два разных файла, т.к. язык регистрозависим. 

gisli79
Offline
Зарегистрирован: 16.01.2019

Добрый день.

 

1.Файл называется HardWire.h. Это то что посоветовали в поиске на данном сайте

2. В свою очередь в файле Wire.сpp нашел следующую функцию: 

// TODO: Add in Error Handling if devsel is out of range for other Maples

TwoWire::TwoWire(uint8 dev_sel, uint8 flags) {
    if (dev_sel == 1) {
        sel_hard = I2C1;
    } else if (dev_sel == 2) {
        sel_hard = I2C2;
    } else {
        ASSERT(1);
    }
    dev_flags = flags;
т.е. можно подключить 2ой IIC используя уже подключенный файл Wire.h. Вот только я не соображу как грамотно прописать в скетче
выбор нужного мне в данный момент IIC и команды для работы с ним как в случае Serial:
 
 Serial1.begin(9600);
 Serial.begin(9600);
 Serial1.print(c);  
 Serial2.print(c);  и т.д.
 
b707
Offline
Зарегистрирован: 26.05.2017

вот тут почитайте https://www.stm32duino.com/viewtopic.php?t=1590

Там. кстати, в обсуждении задают вполне резонный вопрос - зачем вам две шины I2C - ведь и к одной замечательно подключается по многу устройств одновременно?

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Jeka_M пишет:

Так как всё-таки называется файл: HARDWIRE.h или HardWire.h ? Для языка программирования С/С++ это два разных файла, т.к. язык регистрозависим. 

Жека, не путайте TC'а.

В Винде это один и тот же файл. И языки программирования С/С++ ничего с этим фактом сделать не могут. Думаю, и в Линуксе для совместимости по файлам с Виндой никто в здравом уме не будет делать файлы формата 8.3 регистрозависимыми.

Ну а переменные внутри файлов, естественно, могут быть и регистрозависимыми, т.к. от свойств файловой системы их содержание никак не зависит.

asam
asam аватар
Offline
Зарегистрирован: 12.12.2018

b707 пишет:

Там. кстати, в обсуждении задают вполне резонный вопрос - зачем вам две шины I2C - ведь и к одной замечательно подключается по многу устройств одновременно?

Ну варианты бывают разные. Неоднократно сталкивалься с устройствами где и 3 и 4 линии I2C задействованны были.

gisli79
Offline
Зарегистрирован: 16.01.2019

Добрый день.

Спасибо за ответы.

микросхема MCP23017 имеет 3 адресные ноги (А2-А0) т.е. максимум 8 шт. на 1 IIC. Я использую 14 микросхем т.е. мне необходимо использовать 2 IIC.

gisli79
Offline
Зарегистрирован: 16.01.2019

Спасибо. Там написано следующее:

At the end of the Wire.cpp file you can see :

CODE: SELECT ALL

TwoWire Wire(PB6, PB7, SOFT_STANDARD);

т.е. что в конце файла Wire.cpp написано: TwoWire Wire(PB6, PB7, SOFT_STANDARD);, но

к сожалению ничего такого там нет, а есть, как я уже писал:

// TODO: Add in Error Handling if devsel is out of range for other Maples

TwoWire::TwoWire(uint8 dev_sel, uint8 flags) {
    if (dev_sel == 1) {
        sel_hard = I2C1;
    } else if (dev_sel == 2) {
        sel_hard = I2C2;
    } else {
        ASSERT(1);
    }
    dev_flags = flags;
}
т.е. функция, позволяющая выбрать 1 из 2х IIC. Мне хотелось бы узнать у людей кто применял одновременно 2 IIC как правильно инициализировать 2 IIC и писать команды для них как в случае Serial
asam
asam аватар
Offline
Зарегистрирован: 12.12.2018

Похоже что это просто разные версии библиотеки. Приведите ссылку на ту кторороя у вас.

А, если не секрет, зачем вам столько портов?

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

gisli79, что вам непонятно? Создаёте второй объект  TwoWire названиеобъекта(2);  И в программе уже обращаетесь к нему, а не к дефоловому wire. Например:

TwoWire myi2c(2);
myi2c.begin();
myi2c.beginTransmission(address);
myi2c.write(adr);

Естессно если устройство имеет библиотеку, то в библиотеке нужно исправить всё на новый объект.

gisli79
Offline
Зарегистрирован: 16.01.2019

1 плата с 7 микросхемами на вход, 2 плата с 7 микросхемами на выход.

На выходную плату подаем сигналы, с входной считываем. Посередине устройство требующее проверки.

gisli79
Offline
Зарегистрирован: 16.01.2019

Спасибо.

Если я правильно Вас понял, то внизу приведен текст программы

инициализации 2х микросхем по 2 м IIC.

Правильно?

 

#include <Wire.h>
 
TwoWire myi2c(2);
 
void setup()
{
//iic-1  
//м.схема с адресом 0х0
  Wire.beginTransmission(0x20);
  Wire.write(0x00);             // регистр-А
  Wire.write(0x00);             // вывод
  Wire.endTransmission();
 
//iic-2  
  //м.схема с адресом 0х3
  myi2c.beginTransmission(0x23);
  myi2c.write(0x00);             // регистр-А
  myi2c.write(0x00);             // вывод
  myi2c.endTransmission();
}
 
void loop()
{
 
}
gisli79
Offline
Зарегистрирован: 16.01.2019

Скачал с сайта в декабре. могу выслать по эл.почте.

gisli79
Offline
Зарегистрирован: 16.01.2019

Спасибо за помощь. Некоторые вопросы могут показаться глупыми, но в Arduino я недавно.

Если я правильно понял, то используя функцию TwoWire , написанную в Wire.h создаем объект для 2 го IIC и используем его в программе вместе с 1м IIC?

#include <Wire.h>
TwoWire WIRE1 (1); //  I2C 1
TwoWire WIRE2 (2); //  I2C 2
 
void setup()
{
  WIRE1.begin();
  WIRE2.begin();
 
  WIRE1.beginTransmission(0x20);
  WIRE1.write(0x00);             // регистр-А
  WIRE1.write(0x00);             // вывод
  WIRE1.endTransmission();
 
  WIRE2.beginTransmission(0x23);
  WIRE2.write(0x00);             // регистр-А
  WIRE2.write(0x00);             // вывод
  WIRE2.endTransmission();
}
void loop()
{
 
}
 

 

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

gisli79, ну да как-то так в теории, а что долго проверить, в чём проблема то?

Только первый I2C  уже привязан  по умолчанию к обьекту wire. Так что WIRE1 определять не нужно.

gisli79
Offline
Зарегистрирован: 16.01.2019

1. Спасибо. Я так и думал.

2. Жду плату.

3.Вы в своем сообщении писали:

"Естессно если устройство имеет библиотеку, то в библиотеке нужно исправить всё на новый объект."

но исходя из кода в библиотеке Wire.h, код трогать не нужно а оставить как был, а именно :

// TODO: Add in Error Handling if devsel is out of range for other Maples

TwoWire::TwoWire(uint8 dev_sel, uint8 flags) {
    if (dev_sel == 1) {
        sel_hard = I2C1;
    } else if (dev_sel == 2) {
        sel_hard = I2C2;
    } else {
        ASSERT(1);
    }
    dev_flags = flags;
}

 

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

gisli79, Я писал про библиотеку для _устройства_, которая в свою очередь работает через библиотеку wire.

gisli79
Offline
Зарегистрирован: 16.01.2019

Да. Я понял. 

Для моей платы (устройства) я библиотеки не делал.