воскресенье, 29 июня 2014 г.

CAN интерфейс и контроллер pic18f2550

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

ЭТО УСТАРЕВШАЯ ВЕРСИЯ. НОВУЮ МОЖНО НАЙТИ Здесь
Мы будем говорить о контроллере 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
Файлы проекта:
https://yadi.sk/d/7MknbTTtVNWJD
Проект рассчитан на то, чтобы быть прошитым через bootloader.

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

В проекте следующие файлы
2550can.c - основной файл команды
io.h - файл, в котором настроены вводы выводы pic18f2550
mcp2515address.h - адреса регистров внутри модуля MCP2515
spi.h - файл для работы со SPI интерфейсом

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

OpenSPI(SPI_FOSC_16, MODE_00, SMPMID)  - Настройка регистров, связанных со SPI модулем

WriteSPI(msg)  - записать через SPI интерфейс сообщение msg

ReadSPI(msg)  - Возвращает прочитанный байт через SPI
в коде программы определены следующие функции, выполняющие действия с контроллером MCP2515

SPIByteRead(адрес) - прочитать регистр по адресу
SPIReset() - перезагрузить
SPImsg() - передать через SPI одно сообщение
SPIByteWrite(адрес,сообщение) - записать в адрес сообщение
transmitmsg() - передать сообщение

Настройка контроллера производится в функции 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. И проверять пропадание напряжения на RX0BF и INT.
Если ни один из этих пинов не имеет напряжения даже без сети, значит проблема с реализацией SPI интерфейса.

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

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

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

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