Зарегистрирован: Чт мар 22, 2012 20:28:49 Сообщений: 82
Рейтинг сообщения:0
Всем привет! Может кто сталкивался... Короче, работаю с МК STM32F103C8, кроме всего прочего прикрутил к нему микросхему EEPROM M24C08 (работает по I2C). Написал под неё две функции на запись и чтение по произвольному адресу. Потестировал - работает. Попробовал использовать данные функции в программе под FreeRTOS и тут-то очень удивился - программа зависает уже на этапе отправки старт бита на I2C. Т.е. если подробнее: внутри тела одного из тасков вызываю функцию, например, чтения одного байта из EEPROM. Функция начинает работать, отправляет старт бит на I2C и ждет выставления флага перехода в режим Master, но дождаться его не может. Интересный факт: если в режиме отладки остановить выполнение программы и выполнять функцию пошагово, то все работает. Если вызвать те же функции НЕ в теле таска, тоже все работает на УРА.
Пробовал поиграться с частотой системных тиков - не помогло. Функция чтения ниже.
void Recieve_from_I2C(char* bufer, int address, int byte_count) { char addr;
1. И самое важное. Есть блок [code] [/code], в который принято вставлять код проекта, чтобы его не ломало парсером.
2. Вызывают ли разные потоки одни и те же функции доступа к микросхеме памяти? Может ли это происходить одновременно? Происходит ли хоть один успешный доступ к внешней памяти при работе RTOS?
3. На каком моменте зависает при запуске из-под RTOS?
Заголовок сообщения: Re: Работа с EEPROM под FreeRTOS
Добавлено: Пн апр 29, 2019 12:35:59
Встал на лапы
Зарегистрирован: Чт мар 22, 2012 20:28:49 Сообщений: 82
Рейтинг сообщения:0
AlanDrakes писал(а):
2. Вызывают ли разные потоки одни и те же функции доступа к микросхеме памяти? Может ли это происходить одновременно? Происходит ли хоть один успешный доступ к внешней памяти при работе RTOS?
Нет - не вызывают. Не одного успешного доступа не происходит.
AlanDrakes писал(а):
3. На каком моменте зависает при запуске из-под RTOS?
При первом же обращении к памяти
Код:
void Recieve_from_I2C(char* bufer, int address, int byte_count) { char addr;
Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ очень важен контроль процесса заряда и разряда для избегания воздействия внешнего зарядного напряжения после достижения 100% заряда. Инженеры КОМПЭЛ подготовили список таких решений от разных производителей.
Нет - не вызывают. Не одного успешного доступа не происходит.
AlanDrakes писал(а):
3. На каком моменте зависает при запуске из-под RTOS?
При первом же обращении к памяти
Уже хорошо. Но всё же, хотелось бы увидеть, на какой именно инструкции происходит останов.
У меня из предположений сейчас: 1. Проблема с запуском шины из-за неправильного начального состояния (нед единиц на проводах SDA/SCL при генерации START). 2. Нет ответа от устройства, но ожидается байт 3. Нет начала работы модуля (не инициализирован модуль I2C) 4. Не инициализирован GPIO порт (аналогично, будет висеть на START)
Кстати, это весь код проекта? Инициализацию периферии производите ДО запуска RTOS?
Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре.
Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.
Заголовок сообщения: Re: Работа с EEPROM под FreeRTOS
Добавлено: Вт апр 30, 2019 10:38:11
Встал на лапы
Зарегистрирован: Чт мар 22, 2012 20:28:49 Сообщений: 82
Рейтинг сообщения:0
AlanDrakes писал(а):
Уже хорошо. Но всё же, хотелось бы увидеть, на какой именно инструкции происходит останов.
I2C_GenerateSTART(I2C1, ENABLE); while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT));
Вот из цикла while не выходит. Но если остановить выполнение и в отладочном режиме ручками пошагово выполнить, то выходит и нормально отрабатывает вся функция шаг за шагом. Как только опять пускаешь на выполнение останавливается.
AlanDrakes писал(а):
2. Нет ответа от устройства, но ожидается байт
Возможно, но почему это проявляется именно под FreeRTOS. Я же говорю, в обычном коде ТЕ же функции отрабатывают на УРА. Остальные пункты проверял. Все нормально, опять же не работает именно под RTOS. Тайминги какие-то что ли нарушаются....
Инициализацию периферии провожу до запуска шедуллера.
Здесь у меня процедуры чтения регистра и записи регистра. Оба варианта - 8-ми битные. В условиях RTOS не сбоят. Во всяком случае, у меня. Если не заработает - проверяйте остальное - не теряется ли тактирование, правильная ли подтяжка на порту. Да в конце концов, возьмите самый дешёвый китайский логический анализатор с Али (logic analyzer). Он действительно помогает разобраться с проблемой.
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 9
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения