Инициализирую 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 взял отсюда: