понедельник, 12 января 2015 г.

CAN интерфейс и контроллер pic18f2550 (XC8). Модуль MCP2515

<< Назад к оглавлению

Старую версию для компилятора C18 можно найти здесь
Мы будем говорить о контроллере pic18f2550, поскольку только он сейчас есть у меня перед глазами. Но все нижесказанное должно быть справедливо и для pic18f4550.
В этом контроллере есть специальные встроенные возможности общаться с периферией, но нету возможности создать сеть штатными средствами.
Предположим, что необходимо создать связь между несколькими отдаленными контроллерами. Можно конечно продумать то, как они будут общаться, написать для этого программу и установить усилители сигналов, чтобы их можно было передать на дальние расстояния. Но не много ли работы?
Есть множество готовых решений, с помощью которых можно это сделать.
Мы будем рассматривать CAN интерфейс. Он изначально был предложен фирмой Bosch и в сети есть множество информации, описывающей can интерфейс.
В двух словах о нем.
- передача идет по двум проводам
- настраивается скорость передачи информации
- существует механизм проверки сообщений
- гарантированная доставка сообщений.
На самом деле мне кажется абсолютно неважным описывать что-то столько раз документированное.
http://ru.wikipedia.org/wiki/Controller_Area_Network
Так же официальная спецификация на стандарт CAN 2.0
http://www.bosch-semiconductors.de/media/pdf_1/canliteratur/can2spec.pdf

Есть специальный интерфейсный контроллер CAN от фирмы microchip MCP2515
http://ww1.microchip.com/downloads/en/DeviceDoc/21801G.pdf
Это специальное "добавление" к контроллеру, осуществляющее реализацию сети CAN. И для этого контроллера еще нужен будет передатчик MCP2551
http://ww1.microchip.com/downloads/en/DeviceDoc/21667f.pdf
Ниже показано подключение pic18f2550 к MCP2515
Файлы проекта:
здесь
Проект рассчитан на то, чтобы быть прошитым через bootloader. Если вы прошиваете через программатор, то необходимо сделать следующее: удалите строку в File->project properties->XC8 global options->additional options. Она задает смещение кода для бутлоадера

Общение между pic18f2550 и MCP 2515 происходит с помощью протокола SPI, созданного для общения с периферийными устройствами.
Для SPI используются соответствующие ноги SDI SDO SCK и CS
причем SDI (input) mcp2515 нужно подключить к SDO (output) pic18f2550. А в качестве CS используется любой цифровой вывод контроллера.

В проекте следующие файлы
main.c - основной файл команды
io.h - файл, в котором настроены вводы выводы pic18f2550
mcp2515.h - адреса регистров и команд внутри модуля MCP2515
spi_functions.h - файл для работы со SPI интерфейсом
config.h - конфигурационные биты

Все необходимые комментарии даны непосредственно в коде программы

В программе используются следующие специфические комманды

Настройка контроллера производится в функции userinit(); и в последствии в CANinit();
нужно выставить соответствующие пины контроллера на вывод (SDO,SCK) и ввод (SDI) - читай подробнее в комментариях к контроллеру.

потом идет перезагрузка контроллера и модуль CAN переводится в конфигурационный режим. Все основные настройки можно делать только в этом режиме. Настраиваются соответствующие конфигурационные регистры. Во-первых bit-timing (CNF1,CNF2,CNF3). Все узлы сети CAN должны работать на одной тактовой частоте.

Потом настраиваются маски и фильтры передачи. Грубо говоря это адреса, который наш узел будет принимать. Читайте подробнее в документации.
Настраивается идентификатор передачи. - это адрес, с которым будет передаваться сообщение от этого узла.

У контроллера MCP2515 есть возможность отправлять сообщение при высоком сигнале на входах RTS. Мы отключаем их. Будем отправлять с помощью команд, передаваемых через SPI.
настраиваем прерывания. Например, когда контроллер увидит сеть CAN вывод INT будет нулем. По умолчанию на нем будет 1.
Так же настраиваются RX0BF и RX1BF. Когда буфер 0 будет заполнен, на RX0BFпропадет напряжение.
Потом мы включаем нормальный режим, в котором контроллер работает.

А потом передаем сообщение (по факту передастся при первой возможности - подключении к CAN сети). И просто мигаем светодиодом на RA2 когда сообщение передано

Проверить работу вы сможете, когда у вас 2 таким образом сконфигурированных контроллера, или другой узел CAN. Светодиод будет мерцать после передачи сообщения. Если он просто горит - то не проходит конфигурация модуля MCP2515


У модуля CAN есть множество возможностей. Советую почитать спецификацию CAN и техническое описание MCP2515.

Подключение узлов осуществляется следующим образом.

То, что указано на схеме подключения имеет выводы CANH и CANL это и должно быть подключено к сетевым линиям.

Прошу спрашивать, если что-либо непонятно или требует дополнительного рассмотрения.

Файл настроен на работу 125Кб/с
Рассчитывается скорость работы CAN (NBR) модуля следующим образом:
TQ=2*(BRP+1)/Fosc
Fosc - частота генератора на MCP2515
BRP - Делитель частоты. Задается в коде
Tbit=Tsync+Tprop+TPS1+TPS2
Tsync=TQ
Остальные же величины задаются а коде программы
NBR=1/Tbit

5 комментариев:

  1. Спасибо вам за хорошую статейку

    ОтветитьУдалить
  2. Подскажите, в программе прописал два айди, программу делал сам, анализатором гляжу и отправляется только один айди, второго нет, если поменять местами в коде то теперь второй отправляется а первый нет. Может как то буфер надо очищать? и вообше как МК понимает что сообщение доставлено? пока на очень слабом уровне понимаю как работает CAN

    ОтветитьУдалить
    Ответы
    1. Отвечу себе из будущего. Ты чего то накосячил, не помню чего. Мк не понимает что сообщение доставлено, этим рулит MCP2515 в зависимости от конфигурации.

      Удалить
  3. Ничего вы под новый год чем занимаетесь)
    Попробуйте выключить прерывания модуля, это раз, а во-вторых, наверное нужно выставить единицу в TXB0CTRL.TXREQ

    ОтветитьУдалить