|
|
  |
Обращение к I2C - устройству через /dev - интерфейс, работаю с индикатором, подключенным к отладочной плате на i.MX53 |
|
|
|
Dec 25 2012, 18:19
|
Гуру
     
Группа: Свой
Сообщений: 5 273
Регистрация: 30-03-10
Пользователь №: 56 295

|
Добрый день ! Есть вот такая отладочная плата: http://www.freescale.com/webapp/sps/site/p...p?code=IMX53QSBВ файле "~/ltib/rpm/BUILD/linux-2.6.35.3/Documentetion/i2c/dev-interface" написано, что можно работать с моим устройством, подключенным к i2c, через интерфейс "/dev": "Usually, i2c devices are controlled by a kernel driver. But it is also possible to access all devices on an adapter from userspace, through the /dev interface." ... Что я и делаю. Устройство - графический индикатор с адресом 0x70, заведомо исправный, освоенный и проверенный. Естественно, драйвера к нему нет, и, как я понял (см. цитату, приведенную выше), без него можно обойтись. Написал вот такую программку: Код #include <stdio.h> #include <stdlib.h> #include <sys/time.h> #include <sys/types.h> #include <unistd.h> #include <fcntl.h> #include <linux/i2c-dev.h>
//Variables needed for I2C communications int i2c_file; int i2c_adapter_nr = 1; //Indicator address: 0x70 //Content: "0" - "Control", "1" - "Data" //Direction: "0" - "Write", "1" - "Read" int i2c_addr = 0x70; char i2c_filename[20]; char i2c_data_buffer[10]; //Buffer for reading/writing data
/*************************************************************/ //"Main" function int main (int argc, char ** argv) { //I2C bus as file opening snprintf(i2c_filename, 19, "/dev/i2c-%d", i2c_adapter_nr); i2c_file = open(i2c_filename, O_RDWR); if (i2c_file < 0){printf("I2C as file opening error ! Exiting ...\n%d", i2c_file); return(1); } /*sleep(0.1);*/
//Indicator I2C-address transmitting if (ioctl(i2c_file, I2C_SLAVE, 0x70 >> 1) < 0){ printf("device selecting error ! Exiting ...\n"); close(i2c_file); return(1); }
//Writing a data byte to Indicator i2c_data_buffer[0] = 0b11100010; if (write(i2c_file, i2c_data_buffer, 1) != 1){ printf("Writing error ! Exiting ...\n"); close(i2c_file); return(1); }
close(i2c_file); printf("All OK !!!\n"); } Происходит странная вещь - адрес появляется на шине, индикатор его подтверждает (судя по осциллограмме), но сам записываемый байт "0b11100010" на шину не выставляется - мастер шины (т.е., отладочная плата) его просто не отсылает. Вместо этого после отсылки младшего бита адреса при низком уровне на CLK индикатор выставляет бит подтверждения ("0" на линии "Data"; так и должно быть), затем плата взводит CLK в единичку и потом не сбрасывает его в ноль, но оставляет его в состоянии лог. "1" навсегда, а индикатор, видя такое поведение платы, удерживает линию "DATA" в нуле и не отпускает. Шина "залипает", и исправляется это только перезагрузкой. Кто подскажет, в чем тут дело ?
|
|
|
|
|
Dec 26 2012, 11:58
|

Местный
  
Группа: Свой
Сообщений: 290
Регистрация: 17-08-08
Из: Чернигов
Пользователь №: 39 647

|
У меня когда-то была подобная проблема с подключением камеры от мобильного. Камера в системе зарегистрировалась под другим адресом, который не совпадал по даташиту. Все таки попробуйте сделать Код i2cdetect <номер_шины> Утилита покажет на каком точно адресе висит ваше устройство, а потом с помощью i2cdump снимите дамп с "задетекченого" адреса.
|
|
|
|
|
Dec 26 2012, 12:04
|
Гуру
     
Группа: Свой
Сообщений: 5 273
Регистрация: 30-03-10
Пользователь №: 56 295

|
Цитата(xor.kruger @ Dec 26 2012, 15:58)  Код i2cdetect <номер_шины> Пробую ... Сверхстранно !!!!! Запустил "i2cdetect". До адреса 0x70 осциллограф показывает на шине вполне корректные осциллограммы, но после обращения по адресу 0x70 индикатор захватывает шину, как я описал выше: "после отсылки младшего бита адреса при низком уровне на CLK индикатор выставляет бит подтверждения ("0" на линии "Data"; так и должно быть), затем плата взводит CLK в единичку и потом не сбрасывает его в ноль, но оставляет его в состоянии лог. "1" навсегда, а индикатор, видя такое поведение платы, удерживает линию "DATA" в нуле и не отпускает. Шина "залипает", и исправляется это только перезагрузкой.". Чудеса !!!!!!!
|
|
|
|
|
Dec 26 2012, 12:35
|

Местный
  
Группа: Свой
Сообщений: 290
Регистрация: 17-08-08
Из: Чернигов
Пользователь №: 39 647

|
Хм, да уж... Попробуйте включить в ядре всю отладочную информацию по I2C - может ядро успеет что-нибудь вменяемое ответить перед тем как повиснет. Также я бы попробовал включить в ядре GPIO I2C BUS (Опция в ядре - CONFIG_I2C_GPIO), выключил поддержку аппаратной шины и перевесить туда ваше устройство (естественно перед этим поправив файл-платформ). Может поведение будет другим. Ну и еще момент... с подтяжками все нормально ?
|
|
|
|
|
Dec 27 2012, 16:33
|
Гуру
     
Группа: Свой
Сообщений: 5 273
Регистрация: 30-03-10
Пользователь №: 56 295

|
Проблема решилась. Причина ее чисто электротехническая: у индикатора слишком слабый передатчик, чтобы выставлять корректное подтверждение для i.MX53. Я сразу заметил, что все абоненты шины ведут себя, как полагается, и только индикатор выдает лог.0, равный не нулю вольт, а где-то 0.4 ... 0.6 вольт. Очевидно, это не нравилось i.MX53, и происходил сбой. Проблема решилась путем увеличения смонтированных на отладочной плате подтягивающих резисторов с 4.7К до 20К. Вот так. Всем спасибо за помощь ...
P.S. Думал, индикатор неисправный, так нет же. Запаял другой точно такой же RDX0048, и увидел тот же завышенный до ~0.4 ... 0.6 вольт уровень лог.0, идущего от индикатора. При этом у всех прочих абонентов шины этот уровень держится около нуля. Видимо, это такая особенность этого индикатора -своеобразный "подарок разработчиков". Буду иметь в виду ...
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|