хочу поделиться результатами подключения PCI-платы (двух канальный
CAN-контроллер) с нашей h128can.
Исходно было два компонента:
- отладочная платы с микроконтроллером at90can128:
http://www.olimex.com/dev/avr-h128can.html
- плата PCI-1680, подключенная к ПК:
http://www.advantech.gr/products/Model_Detail.asp-model_id=1-23I1G8&BU=&PD=ICOM.htm
Первоначально, я отложил вопрос об аппаратной стыковке
микроконтроллера с физической средой, предполагая, что ничего
дополнительно не потребуется. Но, как выяснилось "потом", возник
промежуточный объект - CAN-трансивер на базе микросхемы PCA82C250.
Распиновка этого устройства, как это не удивительно, сразу раскрывала
назначение выводов с разными названиями (CAN_H и CAN_L с одной
стороны, и RXCAN и TXCAN - с другой).
Выяснил, правда, я это после 6-ти часовой, бесплодной попытки
запустить связь между контроллером и платой, обнаружив, в итоге, схему
соответствующей отладочной платы от Atmel:
http://www.bravekit.com/AVR_CAN_ATMEL_AT90CAN128_prototype_board_JTAG_ISP_RS232_UART
Сегодня я приобрёл четыре микросхемы PCA82C250 в DIP корпусе,
смонтировал и запустил связь через, полученный CAN-трансивер. Нашёл, я
чтот чип вроде есть вот здесь (бывший магазин Интерес, ныне Элкосар):
http://elkosar.ru/contacts
http://elkosar.ru/search_results?search=82C250
Теперь остаётся решить вопрос об организации CAN-сети в лаборатории.
Кстати, я проверил, работоспособность нового драйвера, представляющего
CAN-контроллер, как сетевой интерфейс. Подробности будут опубликованы
в дипломе Паши Самаркина (это он написал драйвер).
Код драйвера и примеры тестов лежат здесь:
http://git.toiit.sgu.ru/people/samarkinpa/public/adv_pci.git
http://git.toiit.sgu.ru/people/samarkinpa/public/SocketCAN.git
http://git.toiit.sgu.ru/people/sin/public/SocketCAN.git (ветка hardloopcycle)
А вот пример их запуска:
[sin@inf SocketCAN]$ ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
2: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast
state UP qlen 1000
link/ether 00:1e:58:48:3c:38 brd ff:ff:ff:ff:ff:ff
inet 192.168.3.12/24 brd 192.168.3.255 scope global eth1
3: eth0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN qlen 1000
link/ether 00:19:db:e5:75:0f brd ff:ff:ff:ff:ff:ff
124: can0: <NOARP,ECHO> mtu 16 qdisc noop state DOWN qlen 10
link/can
125: can1: <NOARP,ECHO> mtu 16 qdisc noop state DOWN qlen 10
link/can
[sin@inf SocketCAN]$ sudo ../adv_pci/init.sh can1 125000
ip link set can1 type can bitrate 125000
ip link set can1 type can restart-ms 1000
ifconfig can1 up
[sin@inf SocketCAN]$ ./waitercycle
Сокет готов
Читаю с can1...
Сообщение, длина 3: [0x39, 0x30, 0x30, "900" ]
Сообщение, длина 3: [0x30, 0x30, 0x30, "000" ]
Сообщение, длина 3: [0x31, 0x30, 0x30, "100" ]
Сообщение, длина 3: [0x32, 0x30, 0x30, "200" ]
Сообщение, длина 3: [0x33, 0x30, 0x30, "300" ]
Сообщение, длина 3: [0x34, 0x30, 0x30, "400" ]
^C
[sin@inf SocketCAN]$ ip -details link show can1
125: can1: <NOARP,UP,LOWER_UP,ECHO> mtu 16 qdisc pfifo_fast state
UNKNOWN qlen 10
link/can
can state ERROR-ACTIVE restart-ms 1000
bitrate 125000 sample-point 0.875
tq 500 prop-seg 6 phase-seg1 7 phase-seg2 2 sjw 1
sja1000: tseg1 1..16 tseg2 1..8 sjw 1..4 brp 1..64 brp-inc 1
clock 8000000
[sin@inf SocketCAN]$ /sbin/ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
2: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast
state UP qlen 1000
link/ether 00:1e:58:48:3c:38 brd ff:ff:ff:ff:ff:ff
inet 192.168.3.12/24 brd 192.168.3.255 scope global eth1
3: eth0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN qlen 1000
link/ether 00:19:db:e5:75:0f brd ff:ff:ff:ff:ff:ff
124: can0: <NOARP,ECHO> mtu 16 qdisc noop state DOWN qlen 10
link/can
125: can1: <NOARP,UP,LOWER_UP,ECHO> mtu 16 qdisc pfifo_fast state
UNKNOWN qlen 10
link/can
[sin@inf SocketCAN]$ /sbin/ip a show dev can1
125: can1: <NOARP,UP,LOWER_UP,ECHO> mtu 16 qdisc pfifo_fast state
UNKNOWN qlen 10
link/can
Код программы на контроллере выглядит вот так:
#include <avrlib.h>
#include <avrlib/portio.h>
#include <avrlib/can.h>
#include <util/delay.h>
#define CONF_CANBT1 0x0e
#define CONF_CANBT2 0x0c
#define CONF_CANBT3 0x37
using namespace AVRLIB;
typedef Output<IO::port_A, IO::bit_0, false> led;
typedef CAN::StdId CanId;
typedef CAN::StdMOb CanMOb;
typedef CAN::IO<CanMOb> CanIO;
typedef CAN::Msg CanMsg;
typedef CAN::StaticMsg<3> CanStaticMsg;
typedef CAN::Interface Can;
uint8_t data[3] = { '0', '0', '0' };
CanMsg msg(data, 3);
void send ()
{
CanMOb mob(0);
CanIO::send_sync(mob, 128, msg);
data[0]++;
if(data[0] > '9')
data[0] = '0';
}
void blink ()
{
static bool state = true;
led::set(state);
state = state ? false : true;
}
int main (void)
{
led::init();
Can::init(CONF_CANBT1, CONF_CANBT2, CONF_CANBT3);
while(!Can::is_ready());
blink();
while(true)
{
send();
blink();
_delay_ms(1000);
}
}
Я всё-таки начал преобразование проекта avrlibcpp в тот вид, каким я
его хочу видеть. Кстати, мы долго провозились с разбором аппаратной
архитектуры AT90CAN128. Но примеры, которые у нас получились со
студентами 2 курса за брал за основу:
http://git.toiit.sgu.ru/people/samhane/public/can_test.git
http://git.toiit.sgu.ru/people/nikishovda/public/can_test.git
--
Sin (Sinelnikov Evgeny)
Etersoft