реклама на сайте
подробности

 
 
> Обращение к I2C - устройству через /dev - интерфейс, работаю с индикатором, подключенным к отладочной плате на i.MX53
kovigor
сообщение Dec 25 2012, 18:19
Сообщение #1


Гуру
******

Группа: Свой
Сообщений: 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" в нуле и не отпускает. Шина "залипает", и исправляется это только перезагрузкой.

Кто подскажет, в чем тут дело ?
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th July 2025 - 16:12
Рейтинг@Mail.ru


Страница сгенерированна за 0.01279 секунд с 7
ELECTRONIX ©2004-2016