Warning: touch() [function.touch]: Unable to create file /home/starterkit/starterkit.ru/html/error.log because Permission denied in /home/starterkit/starterkit.ru/html/errorhandler.php on line 51
устройство по I2C - Embedded Linux - Форум - starterkit.ru
Ник:
Пароль:

Контакты

E-mail: info@starterkit.ru
тел.: +7 922 680-21-73
тел.: +7 922 680-21-74
Телеграм: t.me/starterkit_ru
Партнеры:
otladka.com.ua - г.Киев

Способы оплаты

User Info


Добро пожаловать,
Guest

Регистрация или входРегистрация или вход
Потеряли пароль?Потеряли пароль?

Ник:
Пароль:

ПользователейПользователей:0
Поисковых ботовПоисковых ботов:3
ГостейГостей:1

ОбновитьПодробнееВсегоВсего:4
Форум » starterkit.ru » Embedded Linux
устройство по I2C
microsha
Добавлено 01.12.2010 13:28 Сообщение: 31
microsha
0

Пункты: 282
Регистрация: 26.11.2009
Объясните пожалуйста подробней, как работать с I2C.
У меня AT91SAM9260 нужно подключить две мкросхемы по I2C: PCF8563T и PCA95554D.
В \arch\arm\mach-at91\board-sam9260ek.c добавил:
Код
static struct i2c_board_info __initdata ek_i2c_devices[] = {
{
I2C_BOARD_INFO("PCA95554D", 0x4E),
},
{
I2C_BOARD_INFO("PCF8563T", 0xA2),
},
/* more devices can be added using expansion connectors */
};

и

at91_add_device_i2c(ek_i2c_devices, ARRAY_SIZE(ek_i2c_devices));


В ядре включил I2C_GPIO.
В итоге в /dev/ появилось i2c-0 (89 0).
Теперь если выполнить echo "2">i2c-0, то на SDA и SCL видим передачу четырех байтов 0x01. Разве это правильно?
Если в программе обратиться так:
Код
fd = open("/dev/i2c-0", O_RDWR);
if (fd == -1){
printf("error on open device,%d\n",fd);
return -1;
}

int adr = 0xA2; // The I2C address

if (ioctl(fd, I2C_SLAVE, adr) < 0) {
/* ERROR HANDLING; you can check errno to see what went wrong */
printf("I2C_SLAVE - No Ok, %d\n", fd);
return -1;
}

buf[0] = 0x01;

if (write(fd, buf, 1)!=1)
{
/* ERROR HANDLING: i2c transaction failed */
printf("Error write!!!\n");
}

то функция ioctl(fd, I2C_SLAVE, adr) возращает -1.
Что я делаю не правильно?
Спуститься к концу Подняться к началу
Персональная информация
microsha
Добавлено 01.12.2010 14:34 Сообщение: 32
microsha
0

Пункты: 282
Регистрация: 26.11.2009
Если в ioctl(fd, I2C_SLAVE, adr) adr сделать 0x4e, то данную функцию проходит нормально, а вот с 0xA2 не хочет.
Спуститься к концу Подняться к началу
Персональная информация
microsha
Добавлено 01.12.2010 15:02 Сообщение: 33
microsha
0

Пункты: 282
Регистрация: 26.11.2009
Похоже разобрался сам. Неправильно задавал адреса. Надо было не 0xA2, a 0x51. Но все равно хотелось бы выслушать мнения специалистов, все ли я правильно делаю для работы с I2C.
Спуститься к концу Подняться к началу
Персональная информация
klon4uk
Добавлено 08.10.2012 12:36 Сообщение: 34
klon4uk
5

Пункты: 5960
Регистрация: 20.06.2012
Обращаюсь к знатокам, так как с шиной i2c сталкиваюсь впервые...
нужно соединить 2 платы на at91sam9xe512 по шине i2c.
почитав эту темку понял что нужно описать в файле борды адреса...
Цитата

static struct i2c_board_info __initdata ek_i2c_devices[] = {
{
I2C_BOARD_INFO("PCA95554D", 0x4E),
},
{
I2C_BOARD_INFO("PCF8563T", 0xA2),
},
/* more devices can be added using expansion connectors */
};

только подставить адреса те которые мне нужны...
и потом читать и писать как в обычный файл с помощью read, write
я так полагаю это будет мастер ...

а со слейвом что делать ?
Спуститься к концу Подняться к началу
Персональная информация
Jury093
Добавлено 08.10.2012 13:06 Сообщение: 35
Jury093
4.5

Пункты: 54233
Регистрация: 25.05.2009
Пол: Мужчина
Из: Санкт-Петербург
читаем в Documentation/i2c/summary:

At this time, Linux only operates I2C (or SMBus) in master mode; you can't use these APIs to make a Linux system behave as a slave/device, either to speak a custom protocol or to emulate some other device.

а то, что вы желаете - это вообще мультимастеринг, имхо, самый клинический случай на несчастной шинке..

На любой вопрос есть любой ответ.
Спуститься к концу Подняться к началу
Персональная информация
klon4uk
Добавлено 08.10.2012 14:01 Редактировалось 08.10.2012 14:03 Сообщение: 36
klon4uk
5

Пункты: 5960
Регистрация: 20.06.2012
ну мне надо что бы 2 плата была ведомая...
а для мастера я все правильно понял ?

а насчет мултимастеринга можно там же почитать ???

и как его реализовывать ?
и как ещё в линуксе можно это реализовать кроме ядра ?
обращаться на регистры проца мне тоже не дадут ?
Спуститься к концу Подняться к началу
Персональная информация
Jury093
Добавлено 08.10.2012 14:34 Сообщение: 37
Jury093
4.5

Пункты: 54233
Регистрация: 25.05.2009
Пол: Мужчина
Из: Санкт-Петербург
Цитата
а для мастера я все правильно понял ?

да

Цитата
ну мне надо что бы 2 плата была ведомая...

не владею информацией.. могу добавить, что например у семейства pxa3хх существует поддержка режима slave, но реализация и жизнеспособность мне неизвестна..
смотрите исходники ядра в разделе drivers/i2c

Цитата
обращаться на регистры проца мне тоже не дадут ?

что значит "не дадут"? в эмбеддед системе рут - это царь и бог, и может завалить АРМ одним движением.. читайте о mmap

На любой вопрос есть любой ответ.
Спуститься к концу Подняться к началу
Персональная информация
klon4uk
Добавлено 18.10.2012 15:02 Редактировалось 18.10.2012 15:40 Сообщение: 38
klon4uk
5

Пункты: 5960
Регистрация: 20.06.2012
хмм обновил ядро до 2.6.39
и походу i2c шина пропала
делаю # echo 2 > /dev/i2c-0
sh: write error: No such device or address
устройств на шине, если я правильно понял пока нету...
в ядре вроде i2c включена ...
куда копать ?
для начала хочеться просто асцилом увидеть что на пинах что то происходит...
и ещё какая конфигурация для наших плат для i2c должна быть в ядре ?
Спуститься к концу Подняться к началу
Персональная информация
klon4uk
Добавлено 22.10.2012 15:10 Сообщение: 39
klon4uk
5

Пункты: 5960
Регистрация: 20.06.2012
уважаемые , все таки если на конце устройства нету i2c плата должна или нет посылать байты...
скопипастил и изменил кое что...
Цитата

#include <stdio.h>
#include <fcntl.h>
#include <linux/i2c-dev.h>
void main(void) {
int fd;
printf("Hello world!");
fd = open("/dev/i2c-0", O_RDWR);
if (fd == -1){
printf("error on open device,%d\n",fd);
//return -1;
}

int adr = 0x50; // The I2C address

if (ioctl(fd, I2C_SLAVE, adr) < 0) {
/* ERROR HANDLING; you can check errno to see what went wrong */
printf("I2C_SLAVE - No Ok, %d\n", fd);
//return -1;
}
char buf[10];
buf[0] = 0x01;

if (read(fd, buf, 1) != 1) {
/* ERROR HANDLING: i2c transaction failed */
printf("Error read!!!\n");
}
else {
// printf(buf[0]"\n");
/* buf[0] contains the read byte */
}


if (write(fd, buf, 1)!=1)
{
/* ERROR HANDLING: i2c transaction failed */
printf("Error write!!!\n");
}

}


в принцыпе девайс открывает и слейв присваивает...
ругаеться только на чтение, запись...
вот как то так...
чу все так сложно с мульти мастерингом Т___Т
Спуститься к концу Подняться к началу
Персональная информация
Форум » starterkit.ru » Embedded Linux