CAN-200: Библиотека для работы с платами CAN-200PC, CAN-200MP, CAN-200PC104, CAN-200PCI и CAN-200PCIe

CAN-200 1.3.1

Библиотека для работы с платами CAN-200PC, CAN-200MP, CAN-200PC104, CAN-200PCI и CAN-200PCIe

Библиотека функций предназначена для предоставления доступа к ресурсам плат серии CAN-200PC, CAN-200MP, CAN-200PC104, CAN-200PCI, CAN-200-104PCI и CAN-200PCIe.

Условия работы

Установленное оборудование:

- IBM PC совместимый компьютер Pentium II или выше

Программное обеспечение:

- компилятор gcc

Поддерживаемые операционные системы:

- Ubuntu Linux 16.04LTS

Поддерживаемые платы:

- CAN-200PCI
- CAN-200PCIe
- CAN-200PC
- CAN-200MP
- CAN-200PC104
- CAN-200-104PCI

Платы серии CAN-200 содержат два (CAN-200PCI, CAN-200PCIe, CAN-200PC, CAN-200MP, CAN-200PC104) или четыре (CAN-200-104PCI) полностью независимых CAN-канала. Каждый CAN-канал построен на CAN-контроллере PCA82C200 фирмы Philips. Этот CAN-контроллер поддерживает на аппаратном уровне обмен данными по протоколу CAN 2.0 part A. В 2002 году CAN-контроллер PCA82C200 снят с производства и в качестве его замены на платы серии CAN-200 устанавливается CAN-контроллер SJA1000, поддерживающий (в режиме PeliCAN) обмен данными по протоколу CAN 2.0 part B active. Этот CAN-контроллер имеет два режима функционирования: BasicCAN и PeliCAN.

- Режим BasicCAN является режимом, обеспечивающим совместимость с CAN-контроллером PCA82C200. В этом режиме возможен обмен только стандартными кадрами (с 11-битным идентификатором).
- Режим PeliCAN является режимом, обеспечивающим более гибкую настройку CAN-контроллера, удобный мониторинг CAN-сети и предоставляет возможность обмена кадрами с расширенным идентификатором (29-битным).

Драйвер плат CAN-200

Драйвер плат CAN-200 представляет собой модуль ядра и поставляется в исходных кодах. Драйвер поддерживает до 10 плат одновременно.
Запуск драйвера может осуществлятся командой insmod can200.ko [porta0=addr [porta1=arrd...] base_portb0=addr [base_portb1=addr...] irq0=irq [irq1=irq...]] [tx_counter=counter] [hardware_repetition=flag], где
porta0, porta1...porta9 – базовые адреса канала 1 для плат CAN-200PC, CAN-200MP, CAN-200PC104 (до 10 штук);
portb0, portb1...portb9 – базовые адреса канала 2 для плат CAN-200PC, CAN-200MP, CAN-200PC104 (до 10 штук);
irq0, irq1...irq9 – номера прерываний для плат CAN-200PC, CAN-200MP, CAN-200PC104 (до 10 штук);
tx_counter - количество попыток выдачи каждого кадра при программном повторе выдачи (по умолчанию - 128, диапазон 1-256);
hardware_repetition - позволяет настоить выдачу кадров с аппаратным повтором (0 - программный повтор, 1 - аппаратный повтор).

По умолчанию выдача каждого кадра производится однократно, при успешной выдаче драйвер переходит к выдаче следующего кадра. В случает отказа выдачи кадра драйвер уменьшает счетчик повторных попыток выдачи (задаваемых при старте драйвера параметром tx_counter) и повторяет попытку выдачи кадра. При достижении счетчиком значения 0 драйвер формирует отказ выдачи.

При использовании драйвера для плат CAN-200PC, CAN-200MP и CAN-200PC104 обязательно должны указываться параметры базовых портов и номера прерываний для каждой из плат (устанавливаются перемычками на платах). Платы CAN-200PCI, CAN-200-104PCI и CAN-200PCIe настраиваются автоматически. Драйвер поддерживает до 10 плат серии CAN-200. При работе драйвер создает в каталоге /dev файлы вида can200_n (по два файла на каждую плату). Каждый такой файл представляет собой один канал платы серии CAN-200.

Основы использования библиотеки
  1. Открыть требуемую плату для работы
     int hCan;
     hCan = open(file, O_RDWR); // или hCan = open(file, O_RDWR | O_NONBLOCK);
     if (-1 == hCan)
     {
     // Обработка ошибки
     }
     Указание флага O_NONBLOCK в вызове функции open позволяет открыть плату в неблокирующем режиме.
  2. Установить требуемую скорость и режим обмена по шине CAN
     result = CAN200_SetWorkMode(hCan, PeliCAN);
     if (EOK != result)
     {
     // Обработка ошибки
     result = CAN200_SetCANSpeed(hCan, CAN_SPEED_1000);
     if (EOK != result)
     {
     // Обработка ошибки
     }
  3. Установить фильтр для приема кадров
     // Разрешаем прием всех кадров
     result = CAN200_P_SetFilter(hCan, 0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff);
     if (EOK != result)
     {
     // Обработка ошибки
     }
  4. Разрешить работу платы
     // Разрешаем работу платы
     result = CAN200_SetDriverMode(hCan);
     if (EOK != result)
     {
     // Обработка ошибки
     }
  5. С использованием функций
     read, write, select
     организовать прием и выдачу CAN кадров.
     Поведение функций read и write отличается в зависимости от наличия флага O_NONBLOCK при открытии платы.
     Функция read в блокирующем режиме (плата открыта без указания флага O_NONBLOCK) будет ожидать приема указанного пользователем кол-ва CAN пакетов. Возврат из функции возможен в двух случаях: при приеме указанного пользователем кол-ва кадров или при переходе платы в режим BUS-OFF.
     В неблокирующем режиме (плата открыта с указанием флага O_NONBLOCK) функция read вернет столько кадров, сколько есть в буфере приема (но не более чем запросил пользователь). Если в буфере приема нет данных по функция вернет 0.
     Функция write в блокирующем режиме поставит указанное пользователем кол-во CAN кадров в очередь выдачи и будет ожидать окончания их выдачи. Возврат из функции возможен в двух случаях: после окончания выдачи всех переданных ей кадров или при переходе платы в режим BUS-OFF.
     В неблокирующем режиме функция write поставит указанное пользователем кол-во CAN кадров в очередь выдачи и вернет управление не ожидаю окончания выдачи. Для определения окончания выдачи можно использовать функцию CAN200_GetTransmitStatus.
     При попытке выдать следующую порцию данных (в неблокирующем режиме) до окончания выдачи предыдущей функция write вернет код ошибки EAGAIN.
  6. После окончания работы закрыть плату
     result = close(hCan);
     if (0 != result)
     {
     // Обработка ошибки
     }

CAN-200 documentation. Copyright (c) 2012 - 2017 Elcus Corporation. All rights reserved.