Проблемы I2C с STM32F103

Сигнал32
Сб 03 сентября 2016 г. 2:58 утра
Привет,

Я пытаюсь использовать DS1624 с STM32Duino на пользовательской плате, которая имеет STM32F103T8U6.
DS1624 подключен к STM32 через I2C с 10-километровыми резисторами.
Проблема, с которой у меня есть, заключается в том, что чтение температуры не является точным. Датчик реагирует температурой, но температура составляет 0xff 0x80 (255.50 C).
Я попробовал тот же код на Arduino Pro Micro (atmega32u4, в основном Леонардо), и код работает там.

Я думаю, что проблема заключается в инициализации чипа (функция initDs1624).
При отслеживании сигналов я вижу некоторые различия между STM32 и Atmega.

Вот изображение последовательности инициализации на STM32 против Atmega: (Полный размер)
Изображение


Кто -нибудь знает, почему разница в формах волн I2C и как я смогу это исправить ?

Код: #include #include #define addr 0x4F // For STM32, Serial1 is the one being used #if !defined(__INTELLISENSE__) && defined(__STM32F1__) #define Serial Serial1 #endif #ifdef __STM32F1__ #define Wire HWire #define LED PA1 #else #define LED 15 #endif #define CONTINUOUS_CONVERSION 0x00 #define CONVERT_T 0xEE #define READ_T 0xAA void InitDS1624() { Wire.beginTransmission(addr); Wire.write(0xAC); Wire.write(CONTINUOUS_CONVERSION); //Put the DS1624 in continuos conversion mode Wire.endTransmission(); delay(100); //Min time needed to store the previous command is 10ms Wire.beginTransmission(addr); Wire.write(CONVERT_T); //Enable the continuos conversion mode Wire.endTransmission(); } float getTemp() { float temperature = 0; int tempmsb = 0; int templsb = 0; int temp2 = 0; Wire.beginTransmission(addr); Wire.write(READ_T); Wire.requestFrom(addr, 2); if (Wire.available()) { tempmsb = Wire.read(); } if (Wire.available()) { templsb = Wire.read(); } temp2 = templsb >> 3; temperature = (float(tempmsb) + (float(temp2) * 0.03125)); Wire.endTransmission(); return temperature; } void setup() { pinMode(LED, OUTPUT); Wire.begin(); InitDS1624(); Serial.begin(9600); } void loop() { float temp = getTemp(); Serial.println(temp); if (temp > 20 && temp < 50) digitalWrite(LED, HIGH); else digitalWrite(LED, LOW); delay(5); }

Rogerclark
Сб 03 сентября 2016 г. 9:19
10 тыс. Вытягивающие резисторы Это звучит слишком высоко для 3.3V Система.

Сигнал32
Сб 03 сентября 2016 г. 10:08
Rogerclark написал:Это звучит слишком высоко для 3.3V Система.

Rogerclark
Сб 03 сентября 2016 г. 10:09
Попробуйте использовать <Проволока.час> а не хардвор

Сигнал32
Сб 03 сентября 2016 г. 10:13
Rogerclark написал:Попробуйте использовать <Проволока.час> а не хардвор

Мадиас
Пн, 05 сентября 2016 12:29
HM, это странно.
Многие пользователи здесь (как и я) использовали программное обеспечение и вариант HW I2C. Вариант HW действительно не был закончен Leaflabs из -за проблем (я думаю, что аппаратная ошибка в ядре STM32F1 или что -то в этом роде) - но::
Как я уже говорил, многие из нас используют I2C без ошибок с более сложными/чувствительными модулями, такими как дисплеи.
К сожалению, я не владею DS1624, поэтому я не могу сравнить его с «обычной» платой STM32Duino, такой как Maple Mini Clone. Лично это будет моим следующим шагом: пытаюсь, если DS1624 работает с клоном Maple Mini (или что -то в этом роде) или пробует любое другое устройство I2C на вашей пользовательской плате. Следующей проблемой может быть использованный код . Похоже, он генерирует дополнительные данные на первом и последнем.

Вот общий пример набережного примеров:
http: // форумы.Leaflabs.com/форумы.лист ... л?ID = 74407
Может быть, старый форум Leaflabs может стать хорошим моментом для исследований I2C -задач.

Редактировать: Вот оригинальные документы Leaflabs о I2C:
http: // docs.Leaflabs.com/static.Leaflab ... я/i2c.HTML

Edit2:
Если вы повторяете последовательность I2C более 5 раз: всегда ли шипы в одном и том же положении?

Эдогальдо
Пн сентября 05, 2016, 14:59
@Signal32: какую плату STM вы используете?
Разве это не может быть светодиодный штифт?
В вашем эскизе я вижу: #define LED 15

Мадиас
Пн, 05 сентября 2016 г., 15:49
Эдогальдо написал:@Signal32: какую плату STM вы используете?
Разве это не может быть светодиодный штифт?
В вашем эскизе я вижу: #define LED 15

Эдогальдо
Пн, 05 сентября 2016 г., 15:55
Но, может быть, #ifdef, наверное, не сработает... Это зависит от вариантов компиляции..

Racemaniac
Пн, 05 сентября 2016 г., 15:59
В своих проектах я также сделал несколько очень мощных вещей, используя аппаратный i2c, так что, по крайней мере, можно использовать и известно, что он работает.
И если это программное обеспечение I2C, которое вы используете, то это не может быть проблемой Maple Mini, так как мы можем быть уверены, что базовые манипуляции с портами работают >_<.

Мадиас
Пн сентября 05, 2016, 16:00
ОК, просто дальнейшее размышление:
Использование «int» в качестве общей переменной (и дополнительного переключения битов, как в этом коде), не лучший способ справиться с AVR и кодом ARM, потому что:
На avr int = int16_t
на руке int = int32_t
Возможно (или наверняка) это не будет проблемой здесь, но я всегда использую строго определенные переменные (например, int16_t), так как я написал код для обеих платформ.

Сигнал32
Пн, 05 сентября 2016 г., 16:04
Я сделаю клон Maple Mini.
Что касается светодиода, это не проблема. Я уверен, что это #ifdef __stm32f1______ взят (я вставил случайный текст внутри, чтобы увидеть, вызывает ли он ошибки) плюс я попробовал несколько вариантов без светодиодного кода и без последовательного.
Если я сделаю петлю инициатора1624, шипы находятся в одном и том же положении, все последовательно.
Обратите внимание, что первый всплеск возникает до начала i2c.
Я также попробую аппаратный сериал с Maple Mini, чтобы увидеть, работает ли он.
Да, я знал о разнице в размере размера 2/4 байта и не думаю, что это проблема здесь.

Эдогальдо
Пн, 05 сентября 2016 г., 16:09
Итак, суммируя это только чтения I2C, которые различаются, правильно?
Можете ли вы опубликовать схемы сравнения чтения?

Мадиас
Пн, 05 сентября 2016 г., 17:46
Ваш #Define Wire Hwire действительно странный. В папке библиотеки I2C есть два примера кода, один для Hwire, и один для Softwire вы должны взглянуть на них.

Сигнал32
Вторник 06 сентября 2016 г. 3:52 утра
Мадиас написал:Ваш #Define Wire Hwire действительно странный. В папке библиотеки I2C есть два примера кода, один для Hwire, и один для Softwire вы должны взглянуть на них.

Эдогальдо
Вторник 06 сентября 2016 г. 6:35 утра
@Signal32,
Ваши температурные чтения FF 80, верно? Если да, исходя из таблицы, это будет означать температуру -0.5с.
Кстати, на основе таблицы, мне кажется, что вы читаете данные в неправильном порядке, должен быть правильный порядок:
1. LSB
2. MSB


Моя ошибка, заказ данных кажется правильным, но число должно быть интерпретировано как целое число комплемента, поэтому FF --1
Лучший, e.

Мадиас
Вторник 06 сентября 2016 г., 7:01
Пожалуйста, распечатайте на обеих платформах (AVR и STM32) значения MSB и LSB отдельно. Я подозреваю ошибку здесь.

Стивестронг
Вторник 06 сентября 2016 г., 7:03 утра
Signal32 написал: Обратите внимание на красные треугольники:
Изображение

Сигнал32
Вторник 06 сентября 2016 г. 7:05 утра
Мадиас написал:Пожалуйста, распечатайте на обеих платформах (AVR и STM32) значения MSB и LSB отдельно. Я подозреваю ошибку здесь.

Стивестронг
Вторник 06 сентября 2016 г., 7:12 утра
Когда показания идентичны, разница может быть только интерпретациями чтения данных, как сказал Эдогальдо. Эндианесс?

Эдогальдо
Вторник 06 сентября 2016 г., 7:13 утра
Вы проверяли значения регистров конфигурации?
Кстати, вы используете один и тот же чип с обеими платформами, а не с двумя разными чипами, верно?

Сигнал32
Вторник 06 сентября 2016 г., 7:15 утра
Стивестронг написал:Когда показания идентичны, разница может быть только интерпретациями чтения данных, как сказал Эдогальдо. Эндианесс?

Сигнал32
Сб 10 сентября 2016 г. 8:18 утра
Нашел проблему.
Это была не последовательность инициализации. Кажется, в коде провода есть ошибка ... возможно ?

Следующий код - это тот, который имеет проблему: Wire.beginTransmission(0x4F); Wire.write(0xAA); Wire.requestFrom(0x4F, 2); tempmsb = Wire.read(); templsb = Wire.read(); Wire.endTransmission();

Пито
Сб 10 сентября 2016 г. 10:30 утра
Дважды проверьте, что говорит таблица данных - стр. 11 - Чтение температуры..

Сигнал32
Сб 10 сентября 2016 г. 16:35
Пито написал:Дважды проверьте, что говорит таблица данных - стр. 11 - Чтение температуры..

Пито
Сб 10 сентября 2016 г. 16:44
Мой опыт работы с различными LIBS i2.
В таблице данных говорится: Wire.beginTransmission(0x4F); Wire.write(0xAA); // Wire.endTransmission(0x4F); // I need to add a endTransmission and an beginTransmission here Wire.beginTransmission(); // After this the code will work Wire.requestFrom(0x4F, 2); tempmsb = Wire.read(); templsb = Wire.read(); Wire.endTransmission();