Перейти к содержанию
    

BF561 и micron sensor mt9v022

Нашел в интернете готовый проект считывания кадра снимка с сенсора 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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1. Выбросить всю эту "инициализацию" и конфигурировать только те регистры, которые нужны вам (для начала вообще можно ничего не настраивать - сенсор со значениями по умолчанию прекрасно работает с фином).

2.1. Проверить адрес сенсора на I2C шине - у микроновских сенсоров есть ножки, позволяющие задавать им разные адреса.

2.2. Сигнал reset сенсора случайно не установлен?

2.3. Смотреть осциллографом что именно происходит на шине.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

проверить работоспособность i2c, прочитав какие-нибудь статусные регистры и убедиться что оттуда читается то что надо. Записать в любой нормальный регистр (типа sizeX) какое-нибудь значение, прочитать его же и убедиться что читается то что было записано.

 

i2c.rar тут вот еще одна программная реализация i2c, совсем тупо - без таймеров, используется while (delay--) asm("nop"); для пауз между битами.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В общем, уважаемые, проблема в следующем. Имеется отладочная плата с установленной на ней микросхемой сенсора mt9v022. В документации по плате указано, что на ножки сенсора, которыми задается адрес i2c-раба, подается 3.3 В - соответственно адрес записи = 0xB8. Сенсор нормально работает, в режиме сброса НЕ находится. Тактовая частота - 27 МГц. В соответствии с документацией на интерфейс I2C написал программу, формирующую необходимую временную. Правильность временной проверена осциллографом. Процедура записи начинается со СТАРТА, далее записывается 8 бит адреса записи 0xB8 начиная со СТАРШЕГО бита (10111000), а ACKNOWLEDGE от раба не выдается. Что тут не так - никак не пойму. Кто сталкивался с подобной проблемой????????????????? :help:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В документации по плате указано, что на ножки сенсора, которыми задается адрес i2c-раба, подается 3.3 В - соответственно адрес записи = 0xB8.

В соответствии с документацией на интерфейс I2C написал программу, формирующую необходимую временную. Правильность временной проверена осциллографом.

"Верить нельзя никому, даже себе. Мне - можно" (с) :)

Проверить по другим адресам, их там вроде всего 4.

Прикреплённая выше реализация I2C вполне успешно работала как раз с mt9v022. блэкфин правда 532й был, но это не принципиально.

+ может быть блэкфин не отпускает SDATA вот акноледжа и нет?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

"Верить нельзя никому, даже себе. Мне - можно" (с) :)

Проверить по другим адресам, их там вроде всего 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", если речь идет о подчиненном устройстве? Ведь мастер - это процессор?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

...выставляю на линии SDATA высокий уровень...

А вы SDATA переводите в режим входа?

Это фраза из официальной документации по сенсору mt9v022. Насколько я понимаю, для обработки поступающей информации сенсору необходимо некоторое время, которое выражается в количестве тактов. Но почему "master clock cycles", если речь идет о подчиненном устройстве? Ведь мастер - это процессор?

Под фразой "master clock" имеется ввиду тактовый генератор для сенсора работающий на nn МГц. Там речь идет о десяках нс.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А вы SDATA переводите в режим входа?

 

Под фразой "master clock" имеется ввиду тактовый генератор для сенсора работающий на nn МГц. Там речь идет о десяках нс.

 

Черт возьми, спасибо! =) Ну да, сенсор работает на 27 МГц.

А SDATA я в режим ввода не перевожу, поскольку определяю наличие ACKNOWLEDGE не программно, а с помощью осциллографа. Во время ACK сенсор прижимает линию SDATA к земле, и уровень на линии упадет до нулевого вне зависимости - вход ли SDATA или выход. Или я неправ?

Изменено пользователем Мухаммор

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Все! Нашел в чем причина. Оказывается, неким непонятным образом не работает i2c-буфер PCA9543APW-T на отладочной плате Micron.

Изменено пользователем Мухаммор

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Во время ACK сенсор прижимает линию SDATA к земле, и уровень на линии упадет до нулевого вне зависимости - вход ли SDATA или выход. Или я неправ?

Может прижмет. А может и нет. Смотря у кого выходной драйвер сильнее. В любом случае так лучше не делать. Нехорошо (мягко говоря) когда линией пытаются управлять два устройста.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Убицца веником! На плате есть i2c буфер PCA9543APW-T, который, оказывается, нужно сперва активировать, послав ему адрес и настроечный регистр. Только потом он коммутирует микропроцессор и сенсор. Что ж вы сразу-то не сказали! :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...