<< Назад к оглавлению
ЭТО УСТАРЕВШАЯ ВЕРСИЯ. НОВУЮ МОЖНО НАЙТИ Здесь
Мы будем говорить о контроллере 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
в коде программы определены следующие функции, выполняющие действия с контроллером MCP2515SPIByteRead(адрес) - прочитать регистр по адресу
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 это и должно быть подключено к сетевым линиям.
Прошу спрашивать, если что-либо непонятно или требует дополнительного рассмотрения.