Инициализирую 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 взял отсюда: . Там для LPC2106, я линкер-скрипт подогнал под свой LPC2103.



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