roboforum.ru

Технический форум по робототехнике.
Текущее время: 26 ноя 2024, 21:34

Часовой пояс: UTC + 4 часа




Начать новую тему Ответить на тему  [ Сообщений: 18 ]  На страницу 1, 2  След.
Автор Сообщение
 Заголовок сообщения: I2C в LPC2103, дальше start-бита не идет
СообщениеДобавлено: 06 мар 2010, 04:46 
Не в сети
Аватара пользователя

Зарегистрирован: 06 окт 2009, 10:44
Сообщения: 353
Откуда: Омск
Skype: artymen1
ФИО: Артем Константинович
Несколько дней мучаюсь, весь мозг сломал, не могу заставить элементарно работать I2C на отладочной плате Olimex LPC-H2103. Весь инет перерыл, чуть ли не всю спецификацию I2C изучил. Я даже от шины отключил slave-девайс, т.е. она свободна.
Инициализирую I2C0 в master transmitter mode, посылаю start-бит, после чего в цикле проверяю регистр состояния в ожидании вообще какой либо смены состояния (должно стать 0x8, после чего можно передавать адрес) - ничего, висит себе и все. Замерил мультиметром уровни на линиях, обе в нуле, значит стартовый бит послан, только непонятно, какого черта МК чего-то ждет ???
Eclipse
Zylin Embedded CDT debug plugin 4.10.1 (для отладки через gdb)
YAGARTO GNU ARM toolchain, сборка 23.12.2009 (Binutils-2.20, Newlib-1.18.0, GCC-4.4.2, GDB-7.0.1)
OpenOCD 0.4.0

Проц работает на частоте ~60МГц, частота периферии в 4 раза меньше. Регистр PCONP проверил - I2C0 включен. Провода/дорожки проверил, все подключено нормально. Errata посмотрел, там с I2C0 вроде все чисто.

Компиляция:
Код:
arm-elf-gcc -I"Z:\Projects\DemoVisionRobot\primary_program\include" -O0 -fpack-struct -fshort-enums -ffunction-sections -fdata-sections -Wall -std=gnu99 -c -fmessage-length=0 -funsigned-char -MMD -MP -MF"$(@:%.o=%.d)" -MT"$(@:%.o=%.d)" -mcpu=arm7tdmi-s -g3 -gdwarf-2 -o"$@" "$<"

Линковка:
Код:
arm-elf-g++ -T"Z:\Projects\DemoVisionRobot\primary_program\lpc2103-ROM.ld" -nostartfiles -Wl,-Map,DemoVisionRobot.map -mcpu=arm7tdmi-s -g3 -gdwarf-2 -o"DemoVisionRobot.elf" $(OBJS) $(USER_OBJS) $(LIBS)


Код:
// setup SCL pin P02
PINSEL0 &= ~(3<<4);
PINSEL0 |=   1<<4;
// setup SDA pin P03
PINSEL0 &= ~(3<<6);
PINSEL0 |=   1<<6;
// disable and reset interface
I2C0CONCLR = 0x6C;
// пущай поменьше частота будет, о чем то большем, чем просто завести шину, и не мечатаю даже
I2C0SCLL = 1000;
I2C0SCLH = 1000;
// enable interface and send start bit
I2C0CONSET = 0x60;
while(I2C0STAT == 0xF8); // висит.... а я сижу и жду 0x8...

В NXPшном аппноуте все точно так же, с тем исключением, что там прерывания рулят. У других вроде без прерываний все нормально работает.
Линкер-скрипт и startup-code взял отсюда: http://www.siwawi.arubi.uni-kl.de/avr_p ... 041214.zip. Там для LPC2106, я линкер-скрипт подогнал под свой LPC2103.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: I2C в LPC2103, дальше start-бита не идет
СообщениеДобавлено: 06 мар 2010, 16:25 
Не в сети

Зарегистрирован: 29 дек 2004, 23:15
Сообщения: 3744
Откуда: Санкт-Петербург
прог. языки: C, C++, C#, Asm
ФИО: Кашликов Сергей
Ты попробуй на стеке сделать, по прерываниям. И лучше всего сразу отладить в симуляторе периферии Keil.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: I2C в LPC2103, дальше start-бита не идет
СообщениеДобавлено: 06 мар 2010, 19:30 
Не в сети
Аватара пользователя

Зарегистрирован: 06 окт 2009, 10:44
Сообщения: 353
Откуда: Омск
Skype: artymen1
ФИО: Артем Константинович
что значит на стеке ?
и зачем мне в симуляторе каком-то ловить глюки, когда в реальном железе мне уже хватает :)

Добавлено спустя 52 минуты 33 секунды:
действительно, все очень сложно. я весь день бьюсь, пытаясь скомпилировать тупо РАБОТАЮЩИЙ и отлаживающийся код, я перепробовал различные тулчейны в комбинации с различными линкер-скриптами/startup-code, и по различным причинам мне не удалось добиться вообще какой-либо работоспособности кода ! и у меня все более-менее работает только лишь при одной комбинации: это последние yagarto и openocd. и даже в этом случае, все равно что-то не так. например, если я уберу опции оптимизации, такие как -function-sections, -fdata-sections, то при вызове функции генерируется исключение, что какой то там symbol 0xfffffff4 что-ли...
а с ассемблерным листингом, похоже что-то не то, вот кусок от последней строки приведенного мною выше кода:
Код:
   while(!(I2C0CONSET & BIT(I2CON_SI)));
524:   e3a0320e    mov   r3, #-536870912   ; 0xe0000000
528:   e2833907    add   r3, r3, #114688   ; 0x1c000
52c:   e5d33000    ldrb   r3, [r3]
530:   e20330ff    and   r3, r3, #255   ; 0xff
534:   e2033008    and   r3, r3, #8
538:   e3530000    cmp   r3, #0
53c:   0afffff8    beq   524 <STACK_SIZE+0x124>

что-то мне подсказывает, что STACK_SIZE это полная чушь, и меня терзают смутные сомнения, что стек прописывается чуть ли не во-флеш памяти ! (а если я компилирую без указанных выше опций оптимизации, то там вообще IRQ_STACK_SIZE написан, а команда load в openocd загружает только секции main и startup функций). я проверил, не изменяется ли флеш-память во время работы (во всяком случае, я так думаю, что проверил): я запустил отладку, сделал дамп флеш-памяти, дошел до этого места, несколько раз прокрутил этот цикл, опять сделал дамп, сравнил, но отличий не было найдено, значит команды не запортились и этот цикл действительно крутится.
еще другая странная вещь: во время отладки я навожу указатель на регистры I2C0CONSET и другие, и мне показываются их значения, причем вполне правдоподобные, т.к. они изменяются по мере пошагового прохождения по строкам, добавляю в монитор памяти просмотр памяти, в которой расположены регистры I2C0, а там нули, и не меняются. очень странно. причем регистры такой периферии как таймеры, там отображаются корректно.
и еще на yagarto.de есть такая инфа:
Цитата:
Information
In case you get some linker errors like:
error: no memory region specified for loadable section `.eh_frame'
you must add the following part to your linker script:
. = ALIGN(4);
.eh_frame :
{
KEEP (*(.eh_frame))
} > ram

у меня итак все рабоатет, но в других тулчейнах выскакивала ошибка подобно этой, которая и лечилась добавлением этих строк

посмотрите, пожалуйста, мои линкер-скрипт и startup-code.
Вложение:
primary_program.zip [2.75 КиБ]
Скачиваний: 1


у уже замучился и просто хочу, чтобы компилировался рабочий код :durak:


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: I2C в LPC2103, дальше start-бита не идет
СообщениеДобавлено: 06 мар 2010, 20:58 
Не в сети
Аватара пользователя

Зарегистрирован: 04 дек 2008, 22:44
Сообщения: 4363
Откуда: Камышин
Skype: galk-aleksandr1
прог. языки: Kotlin, Java, C, C++, Assm, BasCom, VB, php
ФИО: Галкин Александр Владимирович
Слушай, у меня аналогичная проблема была (МК LPC2368) - висел по посылке старта по I2C. Проблема была в дохлом девайсе, подключенном к шине I2C.

_________________
if(!Operate) Read(pDatasheet);


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: I2C в LPC2103, дальше start-бита не идет
СообщениеДобавлено: 06 мар 2010, 22:04 
Не в сети
Аватара пользователя

Зарегистрирован: 06 окт 2009, 10:44
Сообщения: 353
Откуда: Омск
Skype: artymen1
ФИО: Артем Константинович
Вот этого я и боюсь ! :shock: Но во мне теплится надежда, что девайс в порядке, потому как если я все правильно понял из спецификации i2c, то висеть не должно даже при отключенном или не реагирующем девайсе. Мастер дожидается, когда шина освободится. Шина свободна, если никакое устройство не прижимает сигналы до нуля (подключения ведь по монтажному "И"), затем мастер прижимает SDA в ноль, выдерживает короткую паузу, прижимает SCL, на что слейв никак не обязан отвечать, после чего устанавливается состояние 0х8 и мастер может посылать адрес, но это пока лишь голубые мечты...
Вероятно в твоем случае дохлый девайс прижимал шину к нулю, не позволяя микроконтроллеру провозгласить себя мастером... йода и зеленки... другого объяснения я не нахожу....


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: I2C в LPC2103, дальше start-бита не идет
СообщениеДобавлено: 06 мар 2010, 22:07 
Не в сети
Аватара пользователя

Зарегистрирован: 04 дек 2008, 22:44
Сообщения: 4363
Откуда: Камышин
Skype: galk-aleksandr1
прог. языки: Kotlin, Java, C, C++, Assm, BasCom, VB, php
ФИО: Галкин Александр Владимирович
А у тебя есть 24С0Х Flash? Я ими проверяю. Подключаю к шине, записываю какое нить число по адресу, потом считываю его. Без девайса будет висеть программа - действительно дожидаться ответа будет.

_________________
if(!Operate) Read(pDatasheet);


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: I2C в LPC2103, дальше start-бита не идет
СообщениеДобавлено: 06 мар 2010, 22:24 
Не в сети
Аватара пользователя

Зарегистрирован: 06 окт 2009, 10:44
Сообщения: 353
Откуда: Омск
Skype: artymen1
ФИО: Артем Константинович
Хех, да все проще, на МК есть еще один I2C. Но для начала я хочу добиться уверенности в том, что мой код в принципе компилируется и исполняется корректно, чтобы со стеком всяких фокусов не было и т.п.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: I2C в LPC2103, дальше start-бита не идет
СообщениеДобавлено: 06 мар 2010, 22:26 
Не в сети
Аватара пользователя

Зарегистрирован: 04 дек 2008, 22:44
Сообщения: 4363
Откуда: Камышин
Skype: galk-aleksandr1
прог. языки: Kotlin, Java, C, C++, Assm, BasCom, VB, php
ФИО: Галкин Александр Владимирович
Я понимаю что ты хочешь подключить 1 I2C к другому, но проблемы могут быть разного характера - вплоть до того что неверно написан код, а стандартная флешка - тупое устройство железно работающее по протоколу, потому ей проще отладить код. Но это мое личное мнение

_________________
if(!Operate) Read(pDatasheet);


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: I2C в LPC2103, дальше start-бита не идет
СообщениеДобавлено: 07 мар 2010, 00:10 
Не в сети
Аватара пользователя

Зарегистрирован: 06 окт 2009, 10:44
Сообщения: 353
Откуда: Омск
Skype: artymen1
ФИО: Артем Константинович
согласен, но у меня нет под рукой ни одного i2c-девайса, в работоспособности которого я уверен. да и к тому же глупо будет еще промучаться над их спариванием, когда у меня в программе черте что творится )

Добавлено спустя 1 час 36 минут 26 секунд:
охохо, какие интересные вещи открываются, если покопаться в низах. у меня выполнение программы начинается прямо с main, а startup-code где-то в конец прилеплен :D я же говорю, черте что творится ! какой там нафик i2c, надо вообще программу привести в порядок !


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: I2C в LPC2103, дальше start-бита не идет
СообщениеДобавлено: 07 мар 2010, 00:12 
Не в сети
Аватара пользователя

Зарегистрирован: 04 дек 2008, 22:44
Сообщения: 4363
Откуда: Камышин
Skype: galk-aleksandr1
прог. языки: Kotlin, Java, C, C++, Assm, BasCom, VB, php
ФИО: Галкин Александр Владимирович
Слушай, вектор начала программы ты указываешь при прошивке вообще, проверь опции прошивальщика

_________________
if(!Operate) Read(pDatasheet);


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: I2C в LPC2103, дальше start-бита не идет
СообщениеДобавлено: 07 мар 2010, 01:53 
Не в сети
Аватара пользователя

Зарегистрирован: 06 окт 2009, 10:44
Сообщения: 353
Откуда: Омск
Skype: artymen1
ФИО: Артем Константинович
вот я балбес ! я всегда startup-файлы переименовываю в startup.s для гламурности, а в линкер-скриптах то crt0.s остается прописанным первым ! поправил, теперь собирается как надо. и без опций оптимизации соотвественно тоже работает, тобишь все нормально, разве что только memory monitor I2C-регистры не показывает, хотя по watchpoint'ам их значения отслеживаются. но i2c все еще не заводится...

Добавлено спустя 1 час 21 минуту 39 секунд:
да елки-палки, у меня .data не загружалось в ram все это время, т.к. код то выдран с другого проекта, а там в стартапе условная директива стоит, загружать .data или нет в зависимости от объявленной при компиляции директивы ROM_RUN, но я пока глобальных и статических переменных не юзал (соответственно .data вообще не создавалась), а то еще больше косяков было бы :D ну теперь вроде бы все поправил, все в порядке с программой, можно дальше I2C мучать...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: I2C в LPC2103, дальше start-бита не идет
СообщениеДобавлено: 07 мар 2010, 02:20 
Не в сети
Аватара пользователя

Зарегистрирован: 23 апр 2009, 17:03
Сообщения: 2639
Откуда: Москва, Самара
прог. языки: C#
Как там диплом продвигается?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: I2C в LPC2103, дальше start-бита не идет
СообщениеДобавлено: 07 мар 2010, 03:09 
Не в сети
Аватара пользователя

Зарегистрирован: 06 окт 2009, 10:44
Сообщения: 353
Откуда: Омск
Skype: artymen1
ФИО: Артем Константинович
а вот так вот и продвигается :D сижу сутками втупляю, в элементарных вещах с трудом добиваюсь успеха, у меня послепослезавтра госы, а я все никак не могу оторваться от этой проблемы... ой, уже 5 часов утра, значит уже послезавтра госы :durak: надо готовиться... ну все пожалуй, код работает корректно, прерывания тоже работают (по кнопке проверял), хоть какой то успех, можно переключить внимание на подготовку к госам, и начну пожалуй с крепкого сна %)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: I2C в LPC2103, дальше start-бита не идет
СообщениеДобавлено: 09 мар 2010, 21:47 
Не в сети
Аватара пользователя

Зарегистрирован: 06 окт 2009, 10:44
Сообщения: 353
Откуда: Омск
Skype: artymen1
ФИО: Артем Константинович
подключил ко второму I2C, все так же не работает.

Добавлено спустя 1 час 40 минут 50 секунд:
Мда, куда там, дошло до того, что вот что выяснилось: на пине, подтянутом к питанию, ноль, причем стабильный ноль ! и в зависимости от плясок над платой он меняется :%) :durak:


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: I2C в LPC2103, дальше start-бита не идет
СообщениеДобавлено: 10 мар 2010, 00:13 
Не в сети
Аватара пользователя

Зарегистрирован: 04 дек 2008, 22:44
Сообщения: 4363
Откуда: Камышин
Skype: galk-aleksandr1
прог. языки: Kotlin, Java, C, C++, Assm, BasCom, VB, php
ФИО: Галкин Александр Владимирович
Значит на самом пине 0 и если он меняется, то следует просмотреть от чего

_________________
if(!Operate) Read(pDatasheet);


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 18 ]  На страницу 1, 2  След.

Часовой пояс: UTC + 4 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 11


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB
phpBB SEO