Ник:
Пароль:

Контакты

E-mail: info@starterkit.ru
тел.: +7 922 680-21-73
тел.: +7 922 680-21-74
Телеграм: t.me/starterkit_ru

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

User Info


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

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

Ник:
Пароль:

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

ОбновитьПодробнееВсегоВсего:9
Форум » starterkit.ru » Embedded Linux
AT91SAM9260 работа с CAN
CerJo
Добавлено 21.07.2011 15:08
0
Сообщение: 1
CerJo
5

Пункты: 365
Регистрация: 01.02.2011
Всем доброго времени суток.

Есть плата AT91SAM9260, на которой установлен Linux-2.6.38. В линуксе включили поддержку CAN-шины, скомпиллировали программу, работающую с CAN, запустили.

Код
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/ioctl.h>
#include <net/if.h>

#include <linux/can.h>
#include <linux/can/raw.h>
#include <string.h>

/* At time of writing, these constants are not defined in the headers */
#ifndef PF_CAN
#define PF_CAN 29
#endif

#ifndef AF_CAN
#define AF_CAN PF_CAN
#endif
void main()
{
/* ... */

/* Somewhere in your app */

/* Create the socket */
int skt = socket( PF_CAN, SOCK_RAW, CAN_RAW );
if(skt<=0)printf("skt<=0");
/* Locate the interface you wish to use */
struct ifreq ifr;
strcpy(ifr.ifr_name, "can0");
ioctl(skt, SIOCGIFINDEX, &ifr); /* ifr.ifr_ifindex gets filled
* with that device's index */
printf("device index=%i",ifr.ifr_ifindex);
/* Select that CAN interface, and bind the socket to it. */
struct sockaddr_can addr;
addr.can_family = AF_CAN;
addr.can_ifindex = ifr.ifr_ifindex;
bind( skt, (struct sockaddr*)&addr, sizeof(addr) );

/* Send a message to the CAN bus */
struct can_frame frame;
frame.can_id = 0x123;
strcpy( frame.data, "foo" );
frame.can_dlc = strlen( frame.data );
int bytes_sent = write( skt, &frame, sizeof(frame) );

/* Read a message back from the CAN bus */
int bytes_read = read( skt, &frame, sizeof(frame) );
}


Исходная программа сначала посылает сообщение CAN, затем ждёт ответа. Запустив её, программа завершиться не смогла, как и должно быть, т.к. CAN подключён к ней не был. Закомментировав строку ожидания ответа от CAN, программа была успешно завершена. Следующим шагом стало подключение осциллографа к портам платы. Меряли сигнал между GND и PIN10 (MOSI) - тишина. Между GND и PIN11 (SPCK) - тишина.
Ядро с подключенным CAN собирается успешно

CAN device driver interface
can: controller area network core (rev 20090105 abi 8)
can: raw protocol (rev 20090105)
can: broadcast manager protocol (rev 20090105 t)

Подскажите, пожалуйста, что можно сделать, чтобы сигналы отсылались, и тишины на портах не было.

P.S. 1) строка f(skt<=0)printf("skt<=0"); skt<=0 не выводится;
2) строка printf("device index=%i",ifr.ifr_ifindex); выводится следующее: device index=0.
Спуститься к концу Подняться к началу
Персональная информация
sasamy
Добавлено 21.07.2011 18:21 Редактировалось 21.07.2011 18:28 Сообщение: 2
sasamy
4.71

Пункты: 83542
Регистрация: 14.08.2009
Цитата

Есть плата AT91SAM9260, на которой установлен Linux-2.6.38. В линуксе включили поддержку CAN-шины


У AT91SAM9260 нет набортного CAN, я так понимаю по spi что-то хотите подключить ? тогда нужно прописать это устройство в таблице spi-устройств в board-файле своей платы. Для примера как тут
arch/arm/mach-at91/board-yl-9200.c

Код

/*
* SPI devices
*/
static struct spi_board_info yl9200_spi_devices[] = {
#if defined(CONFIG_TOUCHSCREEN_ADS7846) || defined(CONFIG_TOUCHSCREEN_ADS7846_MODULE)
{ /* Touchscreen */
.modalias = "ads7846",
.chip_select = 0,
.max_speed_hz = 5000 * 26,
.platform_data = &ads_info,
.irq = AT91_PIN_PB11,
},
#endif
{ /* CAN */
.modalias = "mcp2510",
.chip_select = 1,
.max_speed_hz = 25000 * 26,
.irq = AT91_PIN_PC0,
}
};
Спуститься к концу Подняться к началу
Персональная информация
Форум » starterkit.ru » Embedded Linux