Manhoso 0 10 января, 2009 Опубликовано 10 января, 2009 · Жалоба Нашел в интернете готовый проект считывания кадра снимка с сенсора mt9v022. Программирование микросхемы mt9v022 производится по интерфейсу i2c. Для работы с i2c реализованы функция записи - i2c_wr(slave_addr, reg_subaddr, hivalue,lowvalue) где slave_addr - адрес микросхемы, reg_subaddr - адрес регистра сенсора, в который происходит запись данных, представленных hivalue и lowvalue. У меня к Вам два вопроса: 1. Функция micron_config(), в которой происходит настройка сенсора, содержит непонятный мне код: I2C_wr(MI350WR, 0x0D, 0x00, 0x30); while(SCCB_In_Progress){}; I2C_wr(MI350WR, 0x0F, 0x00, 0x11); while(SCCB_In_Progress){}; I2C_wr(MI350WR, 0x10, 0x00, 0x40); while(SCCB_In_Progress){}; I2C_wr(MI350WR, 0x15, 0x7F, 0x32); while(SCCB_In_Progress){}; I2C_wr(MI350WR, 0x1C, 0x00, 0x02); while(SCCB_In_Progress){}; I2C_wr(MI350WR, 0x20, 0x01, 0xD1); while(SCCB_In_Progress){}; I2C_wr(MI350WR, 0x2B, 0x00, 0x03); while(SCCB_In_Progress){}; I2C_wr(MI350WR, 0x32, 0x00, 0x1a); while(SCCB_In_Progress){}; I2C_wr(MI350WR, 0x70, 0x00, 0x04); while(SCCB_In_Progress){}; I2C_wr(MI350WR, 0xAF, 0x00, 0x03); while(SCCB_In_Progress){}; I2C_wr(MI350WR, 0x73, 0x02, 0xF7); while(SCCB_In_Progress){}; I2C_wr(MI350WR, 0xC2, 0x00, 0x40); while(SCCB_In_Progress){}; I2C_wr(MI350WR, 0x31, 0x00, 0x1f); while(SCCB_In_Progress){}; I2C_wr(MI350WR, 0x33, 0x00, 0x12); while(SCCB_In_Progress){}; I2C_wr(MI350WR, 0x01, 0x00, 0x01); while(SCCB_In_Progress){}; I2C_wr(MI350WR, 0x02, 0x00, 0x04); while(SCCB_In_Progress){}; I2C_wr(MI350WR, 0x03, 0x01, 0xe0); while(SCCB_In_Progress){}; I2C_wr(MI350WR, 0x04, 0x02, 0x80); while(SCCB_In_Progress){}; I2C_wr(MI350WR, 0x05, 0x01, 0xB8); while(SCCB_In_Progress){}; I2C_wr(MI350WR, 0x06, 0x02, 0x08); while(SCCB_In_Progress){}; I2C_wr(MI350WR, 0xbd, 0x00, 0x40); while(SCCB_In_Progress){}; I2C_wr(MI350WR, 0xa5, 0x00, 0x37); while(SCCB_In_Progress){}; I2C_wr(MI350WR, 0xbe, 0x00, 0x3F); while(SCCB_In_Progress){}; I2C_wr(MI350WR, 0x35, 0x00, 0x03); while(SCCB_In_Progress){}; Дело в том, что половина из этих регистров значатся в описании сенсора mt9v022 как reserved (например 0x10), а данные, записываемые в действующие регистры не должны ни на что влиять (например в 0x0F (регистр называется pixel operation mode) запись значения 0x0011 абсолютно ничего не даст) 2. Запись в существующий регистр необходимых данных также успеха не принесло. Записал в регистр 0x1B значение 0x0001, что должно судя по описанию микросхемы привести к отключению сигнала LED_OUT, который принимает значение "1" при экспозиции. Но сигнал так и не отключился. Осциллографом смотрел, какая-то запись идет. Что делать-то? Я в тупике. :cranky: Архив проекта прилагается. ADSP_BF561_MicronSensorExample_I2C_ASM_in_C_rev2.zip Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vik0 0 10 января, 2009 Опубликовано 10 января, 2009 · Жалоба 1. Выбросить всю эту "инициализацию" и конфигурировать только те регистры, которые нужны вам (для начала вообще можно ничего не настраивать - сенсор со значениями по умолчанию прекрасно работает с фином). 2.1. Проверить адрес сенсора на I2C шине - у микроновских сенсоров есть ножки, позволяющие задавать им разные адреса. 2.2. Сигнал reset сенсора случайно не установлен? 2.3. Смотреть осциллографом что именно происходит на шине. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_pv 74 12 января, 2009 Опубликовано 12 января, 2009 · Жалоба проверить работоспособность i2c, прочитав какие-нибудь статусные регистры и убедиться что оттуда читается то что надо. Записать в любой нормальный регистр (типа sizeX) какое-нибудь значение, прочитать его же и убедиться что читается то что было записано. i2c.rar тут вот еще одна программная реализация i2c, совсем тупо - без таймеров, используется while (delay--) asm("nop"); для пауз между битами. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Manhoso 0 16 января, 2009 Опубликовано 16 января, 2009 · Жалоба В общем, уважаемые, проблема в следующем. Имеется отладочная плата с установленной на ней микросхемой сенсора mt9v022. В документации по плате указано, что на ножки сенсора, которыми задается адрес i2c-раба, подается 3.3 В - соответственно адрес записи = 0xB8. Сенсор нормально работает, в режиме сброса НЕ находится. Тактовая частота - 27 МГц. В соответствии с документацией на интерфейс I2C написал программу, формирующую необходимую временную. Правильность временной проверена осциллографом. Процедура записи начинается со СТАРТА, далее записывается 8 бит адреса записи 0xB8 начиная со СТАРШЕГО бита (10111000), а ACKNOWLEDGE от раба не выдается. Что тут не так - никак не пойму. Кто сталкивался с подобной проблемой????????????????? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_pv 74 17 января, 2009 Опубликовано 17 января, 2009 · Жалоба В документации по плате указано, что на ножки сенсора, которыми задается адрес i2c-раба, подается 3.3 В - соответственно адрес записи = 0xB8. В соответствии с документацией на интерфейс I2C написал программу, формирующую необходимую временную. Правильность временной проверена осциллографом. "Верить нельзя никому, даже себе. Мне - можно" (с) :) Проверить по другим адресам, их там вроде всего 4. Прикреплённая выше реализация I2C вполне успешно работала как раз с mt9v022. блэкфин правда 532й был, но это не принципиально. + может быть блэкфин не отпускает SDATA вот акноледжа и нет? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Manhoso 0 19 января, 2009 Опубликовано 19 января, 2009 · Жалоба "Верить нельзя никому, даже себе. Мне - можно" (с) :) Проверить по другим адресам, их там вроде всего 4. Прикреплённая выше реализация I2C вполне успешно работала как раз с mt9v022. блэкфин правда 532й был, но это не принципиально. + может быть блэкфин не отпускает SDATA вот акноледжа и нет? Проверял по другим адресам - без толку. После записи последнего бита адреса я выставляю на линии SDATA высокий уровень, потом выставляю на SCLK высокий уровень, потом низкий - а потом смотрю осциллографом линию SDATA. По документации к mt9v022 после этой процедуры сенсор должен выставить на линии SDATA НИЗКИЙ уровень. Но этого не происходит, млять. :crying: Да, объясните мне, пожалуйста, что это значит? "The two-wire serial bus operation requires certain minimum master clock cycles between transitions. These are specified in the following diagrams in master clock cycles" Это фраза из официальной документации по сенсору mt9v022. Насколько я понимаю, для обработки поступающей информации сенсору необходимо некоторое время, которое выражается в количестве тактов. Но почему "master clock cycles", если речь идет о подчиненном устройстве? Ведь мастер - это процессор? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vik0 0 19 января, 2009 Опубликовано 19 января, 2009 · Жалоба ...выставляю на линии SDATA высокий уровень... А вы SDATA переводите в режим входа? Это фраза из официальной документации по сенсору mt9v022. Насколько я понимаю, для обработки поступающей информации сенсору необходимо некоторое время, которое выражается в количестве тактов. Но почему "master clock cycles", если речь идет о подчиненном устройстве? Ведь мастер - это процессор? Под фразой "master clock" имеется ввиду тактовый генератор для сенсора работающий на nn МГц. Там речь идет о десяках нс. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Manhoso 0 19 января, 2009 Опубликовано 19 января, 2009 (изменено) · Жалоба А вы SDATA переводите в режим входа? Под фразой "master clock" имеется ввиду тактовый генератор для сенсора работающий на nn МГц. Там речь идет о десяках нс. Черт возьми, спасибо! =) Ну да, сенсор работает на 27 МГц. А SDATA я в режим ввода не перевожу, поскольку определяю наличие ACKNOWLEDGE не программно, а с помощью осциллографа. Во время ACK сенсор прижимает линию SDATA к земле, и уровень на линии упадет до нулевого вне зависимости - вход ли SDATA или выход. Или я неправ? Изменено 19 января, 2009 пользователем Мухаммор Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Manhoso 0 19 января, 2009 Опубликовано 19 января, 2009 (изменено) · Жалоба Все! Нашел в чем причина. Оказывается, неким непонятным образом не работает i2c-буфер PCA9543APW-T на отладочной плате Micron. Изменено 19 января, 2009 пользователем Мухаммор Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vik0 0 19 января, 2009 Опубликовано 19 января, 2009 · Жалоба Во время ACK сенсор прижимает линию SDATA к земле, и уровень на линии упадет до нулевого вне зависимости - вход ли SDATA или выход. Или я неправ? Может прижмет. А может и нет. Смотря у кого выходной драйвер сильнее. В любом случае так лучше не делать. Нехорошо (мягко говоря) когда линией пытаются управлять два устройста. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Manhoso 0 20 января, 2009 Опубликовано 20 января, 2009 · Жалоба Убицца веником! На плате есть i2c буфер PCA9543APW-T, который, оказывается, нужно сперва активировать, послав ему адрес и настроечный регистр. Только потом он коммутирует микропроцессор и сенсор. Что ж вы сразу-то не сказали! :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться