<< Назад к оглавлению
Старую версию для компилятора 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
Общение между 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