roboforum.ru

Технический форум по робототехнике.

I2C в LPC2103, дальше start-бита не идет

I2C в LPC2103, дальше start-бита не идет

artymen » 06 мар 2010, 04:46

Несколько дней мучаюсь, весь мозг сломал, не могу заставить элементарно работать 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

Ты попробуй на стеке сделать, по прерываниям. И лучше всего сразу отладить в симуляторе периферии Keil.

Re: I2C в LPC2103, дальше start-бита не идет

artymen » 06 мар 2010, 19:30

что значит на стеке ?
и зачем мне в симуляторе каком-то ловить глюки, когда в реальном железе мне уже хватает :)

Добавлено спустя 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-бита не идет

galex1981 » 06 мар 2010, 20:58

Слушай, у меня аналогичная проблема была (МК LPC2368) - висел по посылке старта по I2C. Проблема была в дохлом девайсе, подключенном к шине I2C.

Re: I2C в LPC2103, дальше start-бита не идет

artymen » 06 мар 2010, 22:04

Вот этого я и боюсь ! :shock: Но во мне теплится надежда, что девайс в порядке, потому как если я все правильно понял из спецификации i2c, то висеть не должно даже при отключенном или не реагирующем девайсе. Мастер дожидается, когда шина освободится. Шина свободна, если никакое устройство не прижимает сигналы до нуля (подключения ведь по монтажному "И"), затем мастер прижимает SDA в ноль, выдерживает короткую паузу, прижимает SCL, на что слейв никак не обязан отвечать, после чего устанавливается состояние 0х8 и мастер может посылать адрес, но это пока лишь голубые мечты...
Вероятно в твоем случае дохлый девайс прижимал шину к нулю, не позволяя микроконтроллеру провозгласить себя мастером... йода и зеленки... другого объяснения я не нахожу....

Re: I2C в LPC2103, дальше start-бита не идет

galex1981 » 06 мар 2010, 22:07

А у тебя есть 24С0Х Flash? Я ими проверяю. Подключаю к шине, записываю какое нить число по адресу, потом считываю его. Без девайса будет висеть программа - действительно дожидаться ответа будет.

Re: I2C в LPC2103, дальше start-бита не идет

artymen » 06 мар 2010, 22:24

Хех, да все проще, на МК есть еще один I2C. Но для начала я хочу добиться уверенности в том, что мой код в принципе компилируется и исполняется корректно, чтобы со стеком всяких фокусов не было и т.п.

Re: I2C в LPC2103, дальше start-бита не идет

galex1981 » 06 мар 2010, 22:26

Я понимаю что ты хочешь подключить 1 I2C к другому, но проблемы могут быть разного характера - вплоть до того что неверно написан код, а стандартная флешка - тупое устройство железно работающее по протоколу, потому ей проще отладить код. Но это мое личное мнение

Re: I2C в LPC2103, дальше start-бита не идет

artymen » 07 мар 2010, 00:10

согласен, но у меня нет под рукой ни одного i2c-девайса, в работоспособности которого я уверен. да и к тому же глупо будет еще промучаться над их спариванием, когда у меня в программе черте что творится )

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

Re: I2C в LPC2103, дальше start-бита не идет

galex1981 » 07 мар 2010, 00:12

Слушай, вектор начала программы ты указываешь при прошивке вообще, проверь опции прошивальщика

Re: I2C в LPC2103, дальше start-бита не идет

artymen » 07 мар 2010, 01:53

вот я балбес ! я всегда 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-бита не идет

AndreiSk » 07 мар 2010, 02:20

Как там диплом продвигается?

Re: I2C в LPC2103, дальше start-бита не идет

artymen » 07 мар 2010, 03:09

а вот так вот и продвигается :D сижу сутками втупляю, в элементарных вещах с трудом добиваюсь успеха, у меня послепослезавтра госы, а я все никак не могу оторваться от этой проблемы... ой, уже 5 часов утра, значит уже послезавтра госы :durak: надо готовиться... ну все пожалуй, код работает корректно, прерывания тоже работают (по кнопке проверял), хоть какой то успех, можно переключить внимание на подготовку к госам, и начну пожалуй с крепкого сна %)

Re: I2C в LPC2103, дальше start-бита не идет

artymen » 09 мар 2010, 21:47

подключил ко второму I2C, все так же не работает.

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

Re: I2C в LPC2103, дальше start-бита не идет

galex1981 » 10 мар 2010, 00:13

Значит на самом пине 0 и если он меняется, то следует просмотреть от чего


Rambler\'s Top100 Mail.ru counter