Обмен данными по PS/2


Обмен данными через PS/2 осуществляется асинхронно по последовательному протоколу.

Для обмена информацией используется 2 линии:
1 — DATA (по этой линии передаются сами данные)
5 — CLOCK (по этой линии передаются тактовые сигналы)

Данные передаются по одному байту за раз (невзирая на направление передачи – к устройству или от него).

Байт данных передаётся побитно:
1. Первым идёт Стартовый бит (START bit) (он всегда передаётся низким уровнем (логический «0»))
2. Далее передаётся сам байт данных (начиная от младшего бита к старшему).

Т.е. если нужно передать байт 0xF0, который в двоичной системе будет выглядеть, как 11110000, то передаваться он будет так: ‘0’,’0’,’0’, ’0’, ’1’, ’1’, ’1’, ’1’.

3. После данных идёт бит чётности (Parity bit) (если число чётное – будет ‘1’, а если нечётное – ‘0’)

бит чётности – это контрольный бит, принимающий значения ‘0’ или ‘1’ и служащий для проверки общей чётности двоичного числа (чётности количества единичных битов в числе).

Бит чётности формируется при поразрядном (побитном) выполнении операции «Исключающее-ИЛИ» (XOR).
т.е. для примера 11110000 бит четности будет ‘1’

4. Стоп-бит (Stop bit) (всегда логическая «1»)

5. В случае передачи данных к устройству (от ПК к мышке/клавиатуре) за Стоп-битом следует бит подтверждения приёма (ACK bit) (acknowledgement) (логический ‘0’)

Все остальное время, когда нет данных для передачи, обе линии имеют высокий уровень сигнала. Частота следования импульсов линии Clock составляет около 10-25КГц.

Чтобы отправить данные PS/2-устройству нужно выполнить следующее:

1. прижать линию CLOCK к земле (установить на линии логический ‘0’) не менее, чем на 100 ms
2. прижать к земле линию DATA
3. отпустить линию CLOCK
4. Теперь нужно подождать, пока устройство прижмёт линию CLOCK к земле.
5. Установить на линии DATA первый бит данных
6. Подождать пока устройство установит последовательно высокий, а затем низкий уровень.
7. повторить шаги 5-6 для следущих 7 бит данных и бита чётности.
8. отпустить линию DATA
9. подождать пока устройство сначала прижмёт к земле линии DATA и CLOCK, а затем отпустит их.

Пример реализации можно посмотреть в функции PS2::write (см. далее)

Обычно, после приёма байта данных/команды устройство подтверждает получение – отправлением байт подтверждения.

Клавиатура и мышка возвращают байт 0xFA

PS2 и Arduino

Для работы с PS/2-устройствами (мышь, клавиатура), Arduino может использовать библиотеку PS2
файл с библиотекой: ps2.zip

Открыв архив, видим папку ps2, которую нужно поместить в библиотечную директорию Arduino IDE (\hardware\libraries\).

Библиотека PS2 представляет собой класс C++:

class PS2
{
	public:
		PS2(int clk, int data);
		void write(unsigned char data);
		unsigned char read(void);
	private:
		int _ps2clk;
		int _ps2data;
		void golo(int pin);
		void gohi(int pin);
};

Конструктор класса принимает два параметра типа int – номера портов ардуины, к которым подключены линии Clock и Data.

/*
 * к Pin 5 -  подключена линия Data, а к pin 6 – линия Clock
*/
PS2 mouse(6, 5);

Функция golo переводит порт в режим вывода и устанавливает на нём логический ‘0’
, функция же gohi переводит порт в режим ввода и подключает на нём подтягивающий резистор. Обе функции имеют тип private и используются только внутри класса.

Нам же доступны всего две функции:
write – записывает байт в линию PS/2.

Бит чётности подсчитывается строчкой

parity = parity ^ (data & 0x01);

read – считывает байт из линии PS/2

бит чётности не проверяется 🙁

читать далее: Подключаем к Arduino/CraftDuino мышку PS/2

Ссылки
http://www.arduino.cc/playground/ComponentLib/Ps2mouse


Добавить комментарий

Arduino

Что такое Arduino?
Зачем мне Arduino?
Начало работы с Arduino
Для начинающих ардуинщиков
Радиодетали (точка входа для начинающих ардуинщиков)
Первые шаги с Arduino

Разделы

  1. Преимуществ нет, за исключением читабельности: тип bool обычно имеет размер 1 байт, как и uint8_t. Думаю, компилятор в обоих случаях…

  2. Добрый день! Я недавно начал изучать программирование под STM32 и ваши уроки просто бесценны! Хотел узнать зачем использовать переменную типа…

3D-печать AI Arduino Bluetooth CraftDuino DIY Google IDE iRobot Kinect LEGO OpenCV Open Source Python Raspberry Pi RoboCraft ROS swarm ИК автоматизация андроид балансировать бионика версия видео военный датчик дрон интерфейс камера кибервесна манипулятор машинное обучение наше нейронная сеть подводный пылесос работа распознавание робот робототехника светодиод сервомашинка собака управление ходить шаг за шагом шаговый двигатель шилд юмор

OpenCV
Робототехника
Будущее за бионическими роботами?
Нейронная сеть - введение