I2C Hardwire Библиотека Связь между 2 (двумя) STM32 Maple Mini

Концзакп
Чт, 8 декабря 2016 г., 13:37
Я установил связь между Maple Mini на порту I2C2 с BMP085 с использованием библиотеки Hardwire, и она работает, как следует. Теперь мне нужно установить соединение от i2c2 с этого первого Maple Mini до i2c1 на втором Maple Mini. Раньше я работал с протоколом связи I2C на Arduino, используя библиотеку Wire, но я не могу работать на Maple и Hardwire. (Я использую библиотеку Hardwire, потому что библиотека проводов не работала с BMP085). Моя проблема в том, что я пытаюсь отправить данные с второго (позвольте нам назвать это рабом) на первое (скажем, Master). И я не получаю никаких данных в Master. Что я делаю не так?

Рабский код #include #define I2C_ADDRESS_ME 0x02 HardWire HWire(1, I2C_FAST_MODE); // I2C String rfidout; void setup() { Serial1.begin(9600); Serial.begin(115200); HWire.begin(I2C_ADDRESS_ME); delay(3000); Serial1.write(0x04); Serial.println("start"); } void loop() { while (Serial1.available()) { byte C = Serial1.read(); rfidout += C; } if (rfidout.length() > 0){ if (rfidout == "4"){ //Serial.println("ok"); HWire.beginTransmission(0x01); HWire.write('O'); HWire.endTransmission(); } else { //Serial.println("err"); HWire.beginTransmission(0x01); HWire.write('E'); HWire.endTransmission(); } rfidout = ""; } }

Стивестронг
Чт, 8 декабря 2016 г., 19:26
Не должно соответствовать как (мастер -так и рабским адресам?
Кстати, обычно только мастер может писать или читать байты из рабов, но никогда не наоборот.

Martinayotte
Чт, 8 декабря 2016 г., 8:10 вечера
Эти мастер/рабский код выглядят странно. Раб, кажется, отправляет данные, даже если Мастер не запросит их !
Похоже, что раб действует как мастер : o
Обычно рабыня должна иметь обработчик onreceive () и/или onrequest ().
Но кажется, что раб не очень реализован на STM32.

Концзакп
Чт, 8 декабря 2016 г., 21:16
На Arduino этот код работал. Я использовал i2c, как uart, и он работал как очарование. Все устройства отправляли данные друг другу, и не было никаких рабов/Мастера - они не просили данные, которые они просто отправляли. Итак, я хотел достичь чего -то вроде Arduino. Если это не очень хороший подход, то как мне это сделать ? Вот сценарий:

1 -й Maple должен получить данные от BMP085 и других устройств, таких как RTC и т. Д., А также иметь возможность отправлять данные на 2 -й Maple без запроса от 2 -го клена
2 -й Maple должен получить данные из RFID и некоторых других устройств и отправить эти данные на 1 -й Maple. Этот клен также может ответить на запрос с 1 -го клена

Итак, оба клена для меня мастера и рабы. Или я ошибаюсь ?

Как мне это сделать ?

Ddrown
Чт, 8 декабря 2016 г., 22:41
Я не уверен, поможет ли это вам, потому что это не Arduino, но у меня есть пример кода для I2C Slave для STM32Cubemx: https: // github.com/ddrown/stm32-output- ... 2C_SLAVE.в

Я выбрал очень простой протокол рабов, когда мастер сигнализирует чтение, он просто пишет все регистры (структура i2c_registers, 17 байтов в моем случае).

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

Martinayotte
Чт, 8 декабря 2016 г. 11:10
@konczakp, вы должны иметь такой дизайн с несколькими мастерами, но если нет никакого арбритации и/или ручной работы, если все устройства i2c могут говорить без мастер-оркестровки, то вы можете в конечном итоге с тоннами столкновений, на как данные, так и часы.

Концзакп
Пт 09 декабря 2016 г. 8:51 утра
Вот подход для рабочего примера Arduino: https: // Майкл.БУВИ.net/blog/en/2013/ ... Aster-i2c/ По моему мнению, нет никакой проблемы с столкновением, потому что каждый раз, когда устройство пытается отправлять данные, становится мастером, и оно не станет мастером, если на линии будет связь на линии. Тогда новый мастер ждет, пока он не будет бесплатным.
Мне нужно получить то же самое для STM32. Обычно Arduino Wire Lib имеет реализацию для Multi Master I2C Bus, но в библиотеке для STM32 я не могу этого найти. Например, проволока.OneCeive отсутствует, и я не знаю, как это сделать. Если это невозможно сделать таким образом, то как ?

Rogerclark
Пт 09 декабря 2016 г. 9:02 утра
Вы можете попробовать использовать собственную / новую Arduino Core STM.

Смотрите этот пост

http: // www.STM32duino.com/viewtopic.PHP?f = 16&t = 1553

Технически STM только написал его для работы на Nucleo F103, но сообщество (@danieleff и т. Д.) Добавлено поддержку для Bluepill и Maple Mini

Однако я не думаю, что кто -то тестировал функциональность подчинения I2C

Martinayotte
Пт 09 декабря 2016 г. 14:53
@konczakp, даже после просмотра этой ссылки https: // Майкл.БУВИ.net/blog/en/2013/ ... Aster-I2C/ и чтение упомянутого сообщения на форуме, а также оригинальный код реализации Arduino I2C, я не вижу никакого мульти-мастерского арбитража, поэтому риски для столкновений все еще присутствуют. Я бы предпочел придерживаться единой мастер -схемы с requestphrom (), чтобы избежать этих рисков.

Концзакп
Пт 09 декабря 2016 г., 15:16
Хорошо, но в этом возникнет еще одна проблема, потому что, когда я начинаю экземпляр i2c с Hardwire Lib и укажу адрес раба, я не могу видеть этого раба, потому что, когда я использую пример сканера i2c Hardwire, он показывает мне только мой BMP085 и и ничего больше. Сканер не показывает мне адрес моего кленового раба

Mrburnette
Сб 10 декабря 2016 г. 15:06
Концзакп написал:<...>Раньше я работал с протоколом связи I2C на Arduino, используя библиотеку Wire, но я не могу работать на Maple и Hardwire. (Я использую библиотеку Hardwire, потому что библиотека проводов не работала с BMP085).<...>

Martinayotte
Сб 10 декабря 2016 г. 15:11
Концзакп написал:Потому что, когда я использую пример сканера i2c Hardwire, он показывает мне только мой BMP085 и ничего больше.

Концзакп
Сб 10 декабря 2016 г. 18:40
#include HardWire HWire(1, I2C_FAST_MODE); // I2c1 void setup() { Serial.begin(115200); HWire.begin(4); } void loop() { while(1 < HWire.available()) // loop through all but the last { char c = HWire.read(); // receive byte as a character Serial.print(c); // print the character } int x = HWire.read(); // receive byte as an integer Serial.println(x); // print the integer }

NRF24L01

ENC28J60 FAVE