Добрый день !
Есть вот такая отладочная плата:
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" в нуле и не отпускает. Шина "залипает", и исправляется это только перезагрузкой.
Кто подскажет, в чем тут дело ?