|
STM32F100C6T6 и 1-wire, не отладить в IAR EWARM v6.30.4 |
|
|
|
Jan 21 2012, 19:58
|

Профессионал
    
Группа: Свой
Сообщений: 1 175
Регистрация: 5-01-05
Пользователь №: 1 807

|
К STM32F100C6T6 подключен DS18B20. Со времен AVR есть отлаженные исходники для 1-wire bus. Думалось, что все будет просто при наладке портированных исходников, но затык случился конкретный: отладить и проверить работу подключенного DS18B20 практически не удалось. Разбор полетов указал на... странную работу портов и решения или ошибки что-то никак не увидел. Пришлось упростить до одного файла main.c, в котором приведены два упражнения (примера). Как вывести из IAR (Win7 64) с русскими комментами вместо крякозябр - не знаю, потому см. аттач.
main.pdf ( 26.04 килобайт )
Кол-во скачиваний: 603Разочарований в STM32F100 два: 1. При частоте HCLK 24MHz максимальная частота ногодрыгания ~1.78Mhz. При макс оптимизации! Это катастрофа! Возможно, что-то сделано не так в системе тактирования? Неужели STM32 такие медленные? 2. Отладить простую процедуру сброса 1-wire не смог! Осциллом смотрю - все очень безоблачно: сначала вижу отриц импульс на 500us, потом проц освобождает шину, датчик ждет 35us и удерживает ее в нуле еще на 60-120us, т. е. с момента окончания отриц импульса до момента получения значения состояния шины я заложил 80us - вполне достаточно. Каково же было мое удивление, когда выяснилось, что проц читает это состояние как 1, хотя судя по осциллу явно должен быть 0. Проверил отладкой в EWARM через J-Link Ultra, что если вручную перед чтением установить на шине 0, то это состояние софтом читается правильно. Все дело в скорости чтения... Проц почему-то не может получить значение пина за несколько us. Стало ясно, почему и прочие процедуры чтения ключа и т. п. не работали... Попытки отключить USE_FULL_ASSERT, манипуляции оптимизацией ни к чему не привели, библиотечные функции проверены. Система тактирования проверена частично через вывод на пин MCO - Fhclk=24MHz. Нужна помощь...
|
|
|
|
|
 |
Ответов
|
Jan 25 2012, 07:05
|

Профессионал
    
Группа: Свой
Сообщений: 1 175
Регистрация: 5-01-05
Пользователь №: 1 807

|
Код Почитал дискусиию и решил проверить действительно ли такие траблы... Если вы внимательно читали, то понимаете, что суть темы не в том, чтобы подключить датчик DS18B20 к STM32F100 как таковой - он у меня уже давно работает именно на софтовых задержках, реализации которых в принципе достаточно для большинства проектов. Я бы даже сказал, что нет необходимости эту реализацию задержек как-то переделывать, т. к. на время работы с шиной 1-wire все равно придется приостанавливать большинство других софтверных задач, т. к. времянка слишком жесткая... Мое неудачное портирование исходников 1-wire на STM32F100 было связано с попыткой использования для счета задержек systick таймера ядра. Опять же, я осознаю, что это излишне и не нужно - по сути ничего не дает, но поведение этого таймера на счете "мелких" задержек вызвало мое непонимание его работы. Вот это и напрягает... Я был бы признателен тому, кто смог бы выделить время и проверить, в чем тут может быть проблема... Повторюсь, в чем проблема... После счета задержки на основе этого таймера состояние шины 1-wire не может быть достоверно прочитано в рамках, например, сброса/проверки этой шины: Код // генератор прецизионных таймингов для 1wire (Tmax[sec]=2^24/Fhclk) __INLINE void Delay1wire(unsigned int Ticks){ SysTick->LOAD = Ticks - 1;// возможна подстройка для точности SysTick->CTRL = 0x00000005;// запуск таймера while(!BITCHK(SysTick->CTRL,SysTick_CTRL_COUNTFLAG));// пока не установится COUNTFLAG SysTick->CTRL = 0x00000004;// останов таймера }
// пин C15 настроен как GPIO_Mode_Out_OD ( эмуляция 1-wire) // к пину C15 припаян внешний pull-up 5k с датчиком DS18B20 // пин A11 тестовый , настроен как GPIO_Mode_Out_PP Work: GPIOC->BRR=GPIO_BRR_BR15;// сбросить С15 (шина в состояние "0") Delay1wire(500*us); __istate_t s = __get_interrupt_state(); __disable_interrupt(); GPIOC->BSRR=GPIO_BSRR_BS15;// установить C15 (шина в состояние "1") Delay1wire(80*us); tmp=(GPIOC->IDR >> 15)&1;// получить текущее состояние шины(должен быть "0" при испр датчике __set_interrupt_state(s); GPIOA->BSRR=tmp?GPIO_BSRR_BS11:GPIO_BSRR_BR11;// тестовый пин(при подкл исправном датчике) всегда = 1 = ошибка !!!!!! Delay1wire(420*us); goto Work; В вышеприведенном коде не удается правильно прочитать состояние шины. Далее, для поиска возможной ошибки, я упростил процедуру максимально: Код // пин C15 настроен как GPIO_Mode_Out_OD ( эмуляция 1-wire) // к пину C15 припаян внешний pull-up 5k с датчиком DS18B20 Work: GPIOC->BRR=GPIO_BRR_BR15;// сбросить С15 Delay1wire(500*us); GPIOC->BSRR=GPIO_BSRR_BS15;// установить C15 Delay1wire(80*us); Delay1wire(420*us); goto Work; По идее, этот код должен давать на С15 сигнал импульс/пауза 500us/500us. У меня он почему-то дает 600us/400us. Естественно все прерывания запрещены. Хотелось бы понять причину такого несоответствия... Возможно, это поможет понять почему исходно не читается правильно состояние шины...
|
|
|
|
|
Jan 26 2012, 05:28
|
Местный
  
Группа: Участник
Сообщений: 313
Регистрация: 2-07-11
Пользователь №: 66 023

|
Цитата(ivainc1789 @ Jan 25 2012, 11:05)  Повторюсь, в чем проблема... После счета задержки на основе этого таймера состояние шины 1-wire не может быть достоверно прочитано в рамках, например, сброса/проверки этой шины: Код // генератор прецизионных таймингов для 1wire (Tmax[sec]=2^24/Fhclk) __INLINE void Delay1wire(unsigned int Ticks){ SysTick->LOAD = Ticks - 1;// возможна подстройка для точности SysTick->CTRL = 0x00000005;// запуск таймера while(!BITCHK(SysTick->CTRL,SysTick_CTRL_COUNTFLAG));// пока не установится COUNTFLAG SysTick->CTRL = 0x00000004;// останов таймера } Замените SysTick->LOAD на SysTick->VAL. SysTick->LOAD переписывается в SysTick->VAL доходит до 0. Когда задержка делается первый раз, то она заканчивается с SysTick->VAL равным SysTick->LOAD или немного меньше. Следующая задержка таким образом будет на столько тактов сколько в SysTick->VAL осталось с прошлго раза, то есть на величину предыдущей задержки. Вероятно нужно так: Код __INLINE void Delay1wire(unsigned int Ticks){ SysTick->VAL = Ticks - 1;// возможна подстройка для точности SysTick->CTRL = 0x00000005;// запуск таймера while(!BITCHK(SysTick->CTRL,SysTick_CTRL_COUNTFLAG));// пока не установится COUNTFLAG SysTick->CTRL = 0x00000004;// останов таймера }
|
|
|
|
Сообщений в этой теме
ivainc1789 STM32F100C6T6 и 1-wire Jan 21 2012, 19:58 Aner 1-wire bus довольно жесткий к времянке, не каждый ... Jan 21 2012, 23:53 ivainc1789 Цитата(Aner @ Jan 22 2012, 03:53) 1-wire ... Jan 22 2012, 00:30 Aner Без опыта преждних разработок и внимательного пони... Jan 22 2012, 14:42 sparcmaster Цитата(Aner @ Jan 22 2012, 18:42) Все из ... Jan 23 2012, 04:35 zoddy не знаю, что у Вас там не получается... но у меня ... Jan 22 2012, 15:56 skripach ЦитатаВсе из себя 32 битные. Но вот как только дел... Jan 22 2012, 16:44 ivainc1789 Цитата(Aner @ Jan 22 2012, 18:42) Без опы... Jan 22 2012, 17:28 maksimp Цитата(ivainc1789 @ Jan 22 2012, 21:28) п... Jan 23 2012, 05:54 lexanet Я тоже так и не смог подключить DS18B20 к дисковер... Jan 23 2012, 03:17 ivainc1789 ЦитатаЭто вы программно делаете 1-wire?Ну да. А чт... Jan 23 2012, 05:33 lexanet Цитата(ivainc1789 @ Jan 23 2012, 08:33) И... Jan 23 2012, 06:12 ivainc1789 ЦитатаМожно, дёргая какую-нибудь ногу до и после, ... Jan 23 2012, 08:05 maksimp Цитата(ivainc1789 @ Jan 23 2012, 12:05) И... Jan 23 2012, 08:45 lexanet Для проверки живости датчика и работоспособности п... Jan 23 2012, 08:19 ivainc1789 ЦитатаДостаточно на глаз настроить...а если частот... Jan 23 2012, 08:32 lexanet Цитата(ivainc1789 @ Jan 23 2012, 11:32) а... Jan 23 2012, 10:06  maksimp Цитата(lexanet @ Jan 23 2012, 14:06) то ж... Jan 23 2012, 13:04   lexanet Цитата(maksimp @ Jan 23 2012, 16:04) Такт... Jan 23 2012, 13:33    maksimp Цитата(lexanet @ Jan 23 2012, 17:33) Такт... Jan 23 2012, 18:33     lexanet Цитата(maksimp @ Jan 23 2012, 21:33) Убер... Jan 24 2012, 02:59      maksimp Цитата(lexanet @ Jan 24 2012, 06:59) Подт... Jan 24 2012, 05:32 ivainc1789 Провел серию экспериментов как вы советовали... В ... Jan 23 2012, 19:26 ivainc1789 Уже здесь возникают вопросы... Такой цикл выдает н... Jan 24 2012, 08:19 maksimp Цитата(ivainc1789 @ Jan 24 2012, 12:19) Т... Jan 24 2012, 09:00 ivainc1789 ЦитатаПрерывания разрешены или запрещены? Если раз... Jan 24 2012, 11:14 maksimp Цитата(ivainc1789 @ Jan 24 2012, 15:14) т... Jan 24 2012, 12:34 shista Почитал дискусиию и решил проверить действительно ... Jan 24 2012, 17:39 lexanet Цитата(shista @ Jan 24 2012, 20:39) Кому ... Jan 25 2012, 04:55  ivainc1789 Цитата(maksimp @ Jan 26 2012, 09:28) Заме... Jan 26 2012, 07:17 shista ЦитатаМое неудачное портирование исходников 1-wire... Jan 25 2012, 13:52 ivainc1789 ЦитатаА можно весь проект?
Конечно. Все подготовил... Jan 25 2012, 17:27 shista Посмотреть смогу не раньше пятницы, в четверг в ко... Jan 25 2012, 19:01 ivainc1789 Цитата(shista @ Jan 25 2012, 23:01) Посмо... Jan 25 2012, 23:30 ivainc1789 Ну и наконец, из-за особенностей регистра VAL SysT... Jan 26 2012, 13:26 Сергей Борщ QUOTE (ivainc1789 @ Jan 26 2012, 15:26) Н... Jan 31 2012, 11:01  maksimp Цитата(Сергей Борщ @ Jan 31 2012, 14:01) ... Jan 31 2012, 11:39   Сергей Борщ QUOTE (maksimp @ Jan 31 2012, 13:39) Непр... Jan 31 2012, 12:05 EugenyAM Когда-то делал на AVR асинхронный обмен по 1-wire ... Jan 31 2012, 09:06 iPKM При копировании функции _delay_loop из архива Bli... Feb 2 2012, 10:15 shista Замените
Кодasm("BNE loop \n"... Feb 2 2012, 14:47 toweroff Я делал 1-wire на lpc2103 через SSP с длиной, помн... Feb 2 2012, 17:01 smk У STM есть особенность настройки выводов портов, о... Feb 3 2012, 06:25
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|