Некоторые устройства, такие как GPS, GSM, RFID, датчики и т. д., должны взаимодействовать с микроконтроллером PIC для передачи или получения информации. Для связи с микроконтроллером PIC используются несколько коммуникационных протоколов, таких как RS232, SPI, I2C, CAN и т. д.
По сути, протокол представляет собой набор правил, согласованных как отправителем, так и получателем, отвечающий на вопросы:
- Как упаковываются данные?
- Сколько битов составляет символ?
- Когда данные начинаются и заканчиваются?
Рассмотрим протокол передачи данных USART на примере микроконтроллера PIC18F4550 при подключении его к компьютеру через RS232. Данный материал подойдет для всей серии PIC18.
PIC18F4550 имеет встроенный модуль USART, который полезен для последовательной связи. С его помощью мы можем отправлять/принимать данные на компьютер или другие устройства.
USART также используется для взаимодействия PIC с различными модулями, такими как Wi-Fi (ESP8266), Bluetooth, GPS, GSM и т. д.
Мы увидим, как устанавливается связь между микроконтроллером PIC и ПК через USART с использованием протокола RS232.
Мы также увидим, как взаимодействовать с ноутбуками, которые не имеют порта RS232 и вместо этого используют порт USB.
Начнем с последовательной связи с использованием PIC18F4550.
Асинхронная связь
PIC18F4550 имеет встроенный асинхронный приемник-передатчик. Асинхронность означает, что каждый символ (байт данных) помещается между стартовым и стоповым битами. Стартовый бит всегда равен 0 (низкий), а стоповый бит всегда равен 1 (высокий).
Битрейт и скорость передачи
Битрейт передачи данных при последовательной передаче данных указывается в битах в секунду (bps). Другая широко используемая терминология для бит/с — скорость передачи (baud rate). Она означает количество изменений сигнала в секунду. Здесь сигнал в битах, поэтому битрейт = скорость передачи.
Интерфейс подключения
Для подключения устройств через USART можно использовать разъем DB9. Хотя в разъеме и много контактов, нам не нужны все. Мы используем только контакты RX, TX и GND.
Преобразование уровней USART
ПК имеет уровни RS232, тогда как микроконтроллер PIC имеет уровни TTL. RS232 имеет разные уровни напряжения для логического 0 и 1. Чтобы сделать его совместимым с уровнями напряжения PIC TTL, мы должны использовать микросхему MAX232 или ее аналоги.
Расчет скорости передачи
Как рассчитать скорость передачи в PIC18F4550?
Значение, которое будет загружено в регистр SPBRG (16-разрядный) PIC18F4550 для получения желаемой скорости передачи данных.
Значение SPBRG для требуемой скорости передачи рассчитывается так:
Предположим, Fosc = 8 МГц и скорость передачи = 9600 бит/с.
Тогда
Следовательно,
Приведенная выше формула зависит от бита BRGH в регистре TXSTA.
Регистр TXSTA
Давайте подробно рассмотрим регистр TXSTA, который используется для настройки передачи.
TXEN : бит разрешения передачи
- 0 = отключить передачу
- 1 = включить передачу
BRGH : бит выбора высокой скорости передачи данных
- 0 = низкая скорость
- 1 = высокая скорость
Бит CSRC не используется для асинхронной связи.
TX9 : бит разрешения 9-ти битной передачи
- 0 = выбрать 8-битную передачу
- 1 = выбрать 9-битную передачу
SYNC : бит выбора режима USART
- 0 = асинхронный режим
- 1 = синхронный режим
SENDB : бит символа разрыва отправки
- 0 = передача Sync Break завершена
- 1 = отправить Sync Break при следующей передаче (сбрасывается аппаратно после завершения)
TRMT : передача бита состояния сдвигового регистра
- 0 = TSR заполнен
- 1 = TSR пуст
TX9D : 9-й бит передачи данных
Может быть битом адреса/данных или битом четности.
Загрузите рассчитанное значение непосредственно в регистр SPBRG.
Регистр RCSTA
В PIC18F4550 регистр RCSTA используется для настроек приема последовательных данных.
SPEN : включение последовательного порта
- 0 = отключить последовательный порт для связи
- 1 = включить последовательный порт для связи
RX9 : бит разрешения 9-ти битного приема
- 0 = включить 8-битный прием
- 1 = включить 9-битный прием
Как правило, мы используем 8-битный прием
SREN : бит разрешения одиночного приема
Не используется
CREN : бит разрешения непрерывного приема
- 0 = отключить приемник
- 1 = включить приемник для непрерывного приема байта данных
ADDEN : бит разрешения определения адреса
При RX9 = 1
- 0 = Отключение определения адреса, все байты принимаются, а девятый бит может использоваться как бит четности
- 1 = включить обнаружение адреса, разрешить прерывание и загрузить буфер приема, когда установлен бит RSR
При RX9 = 0
Неважно 0 или 1
FERR : бит ошибки кадра
- 0 = нет ошибки кадрирования
- 1 = ошибка кадрирования (можно обновить, прочитав регистр RCREG и получив следующий допустимый байт)
OERR : бит ошибки переполнения
- 0 = нет ошибки переполнения
- 1 = ошибку переполнения можно сбросить, очистив бит CREN.
RX9D : 9-й бит принимаемых данных
Это может быть бит адреса/данных или бит четности, который должен вычисляться пользовательской прошивкой.
Буфер данных и флаг прерывания для последовательной связи
Для передачи данных и приема данных в PIC18F4550 выделены 8-битные регистры буферы данных TXREG и RCREG соответственно.
- Когда нам нужно передать данные, мы напрямую копируем эти данные в регистр TXREG. После завершения передачи 8-битных данных генерируется флаг прерывания TXIF.
- Этот TXIF (флаг прерывания передачи) находится в регистре PIR1. Флаг TXIF устанавливается при передаче 8-битных данных. Затем буфер готов принять другие данные для передачи.
- Также в регистре PIR1 находится RCIF (флаг прерывания приема). Когда этот флаг установлен, это указывает, что полный байт данных получен регистром RCREG. Немедленно прочитайте регистр RCREG. Теперь регистр RCREG готов к приему других данных.
- Когда флаг RCIF не установлен, микроконтроллеру PIC приходится ждать приема полного байта данных.
Шаги для программирования PIC18F4550 USART
Инициализация
- Инициализируйте скорость передачи, загрузив значение в регистр SPBRG.
- Затем установите бит SPEN в регистре RCSTA для включения последовательного порта.
- Затем установите бит BRGH в регистр TXSTA для низкой или высокой скорости.
- Также очистите бит SYNC в регистре TXSTA для асинхронной связи.
- Установите бит TXEN в регистре TXSTA, чтобы разрешить передачу.
- Установите бит CREN в регистре RCSTA, чтобы разрешить прием.
#define F_CPU 8000000/64 void USART_Init(long baud_rate) { float temp; TRISC6=0; /* Сделайте вывод Tx выходным*/ TRISC7=1; /* Сделайте контакт Rx входным */ /* Baud rate=9600, SPBRG = (F_CPU /(64*9600))-1*/ temp= (( (float) (F_CPU) / (float) baud_rate ) - 1); SPBRG = (int) temp; TXSTA = 0x20; /* включить передачу;*/ RCSTA = 0x90; /* Включение RX и последовательного порта */ }
Режим передачи
- Копируем данные, которые хотим передать в регистр TXREG.
- Следите за флагом TXIF, который устанавливается после завершения передачи.
Char USART_TransmitChar (char out) { while (TXIF == 0); /* Дождитесь флага прерывания передачи */ TXREG = out; /* Запись данных char для передачи регистра */ }
Режим приема
- Следите за флагом RCIF, пока он не будет установлен в 1, что указывает на то, что в регистр RCREG принят полный 1 байт.
- Также проверьте наличие бита OERR. Если он установлен, отключите и включите бит CREN.
- Затем немедленно прочитайте регистр RCREG, чтобы избежать переполнения.
Char USART_ReceiveChar() { while(RCIF==0); /* дождитесь получения флага прерывания */ if(RCSTAbits.OERR) { CREN = 0; NOP(); CREN=1; } return(RCREG); /* получено в регистре RCREG и возвращено в основную программу */ }
Связь USART с использованием процедуры обслуживания прерываний (ISR)
Вышеупомянутая связь USART выполняется путем непрерывного опроса флага прерывания.
Однако опрос флага прерывания увеличивает энергопотребление микроконтроллера, а также он не может выполнять другие задачи, так как опрос прерывания выполняется непрерывно.
Подпрограмма обслуживания прерываний (ISR) выполняет код приложения всякий раз, когда происходит прерывание. И если прерывания не происходит, микроконтроллер может выполнять другие задачи.
Чтобы использовать USART ISR в PIC18F4550, необходимо включить GIE (разрешение глобальных прерываний), PEIE (разрешение периферийных прерываний) вместе с RCIE (разрешение прерывания приема) и TXIE (разрешение прерывания передачи).
Шаги для программирования PIC18F4550 USART с использованием прерывания
Инициализация с прерываниями
- Инициализируйте скорость передачи, загрузив значение в регистр SPBRG.
- Затем установите бит SPEN в RCSTA для включения последовательного порта.
- Затем установите бит BRGH в TXSTA для низкой или высокой скорости.
- Кроме того, очистите бит SYNC в регистре TXSTA для асинхронной связи.
- Установите бит TXEN в регистре TXSTA, чтобы разрешить передачу.
- Установите бит CREN в регистре RCSTA, чтобы разрешить прием.
- Включите GIE, PEIE, RCIE и TXIE для ISR.
#define F_CPU 8000000/64 void USART_Init(long baud_rate) { float temp; TRISC6=0; /* Сделайте вывод Tx выходным*/ TRISC7=1; /* Сделайте контакт Rx входным */ temp=(( (float) (F_CPU) / (float) baud_rate) - 1); SPBRG = (int) temp; /* Baud rate=9600 SPBRG=(F_CPU /(64*9600))-1*/ TXSTA = 0x20; /* включить передачу;*/ RCSTA = 0x90; /* Включение RX и последовательного порта */ INTCONbits.GIE = 1; /* Включить глобальное прерывание */ INTCONbits.PEIE = 1; /* Включить периферийное прерывание */ PIE1bits.RCIE = 1; /* Включить прерывание приема */ PIE1bits.TXIE = 1; /* Включить прерывание передачи */ }