Для установки или использования I2C необходима функция pid_ioctl. Доступны следующие команды:
Команда | Саб-команда | Описание | |
---|---|---|---|
set | mode | sm | скорость передачи данных: стандартная - 100 Kbps |
fm | скорость передачи данных: быстрая - 400 Kbps | ||
daddr | [A] | настройка адреса: адрес локального устройства | |
saddr | [A] | настройка адреса: адрес ведомого устройства | |
get | rxlen | получение количества отложенных байтов в буфере приема | |
txlen | получение количества отложенных байтов в буфере отправки | ||
error | nack | получение количества NACK в последней транзакции | |
bus | получение номера ошибки шины в последней транзакции | ||
state | 0 - idle, и т.п. - внутренняя операция I2C | ||
req | read | [N] | запрос на чтение |
write | - | запрос на запись | |
wait | запрос на запись и ожидание (требуется "req stop") | ||
stop | запрос на прекращение записи данных (требуется "req wait") | ||
reset | запрос на сброс шины |
Вы можете утановить режим связи и адрес устройства при помощи команды "set".
PHPoC предоставляет стандартный и быстрый режимы. Стандартный режим является режимом по умолчанию.
Режим связи | Синтаксис |
---|---|
стандартный | pid_ioctl($pid, "set mode sm"); |
быстрый | pid_ioctl($pid, "set mode fm"); |
Ведущее устройство I2C использует адрес устройства для выбора ведомого устройства для передачи данных. Для установки своего собственного адреса устройства используется адрес локального. Как установить данные адреса:
Тип | Синтаксис |
---|---|
адрес ведомого устройства | pid_ioctl($pid, "set saddr [A]"); |
адрес локального устройства | pid_ioctl($pid, "set daddr [A]"); |
Каждый адрес устройства должен быть введен в двухзначном шестнадцатеричном числе. LSB этого байта всегда равно нулю, потому что PHPoC поддерживает 7-битовую адресацию для I2C. Обратите внимание, что есть некоторые зарезирвированные адреса. Если вы используете эти адреса, PHPoC остановится из-за ошибок.
Адрес (двоичный) | Пример (Hexa) | Комментарий | |||||||
---|---|---|---|---|---|---|---|---|---|
7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | ||
X | X | X | X | X | X | X | 1 | E1, A3, 1B | LSB равно 1 |
0 | 0 | 0 | 0 | X | X | X | X | 00 ~ 0F | Все 4 верхние биты равны 0 |
1 | 1 | 1 | 1 | X | X | X | X | F0 ~ FF | Все 4 верхние биты равны 1 |
Вы можете получить статус I2C, используя команду "get".
Ниже показано, как получить количество ожидающих байтов в буфере отправки и получения:
Раздел | Синтаксис |
---|---|
Буфер отправки | pid_ioctl($pid, "get txlen"); |
Буфер получения | pid_ioctl($pid, "get rxlen"); |
Вы можете проверить количество ошибок шины и NACK в последней транзакции.
Раздел | Синтаксис |
---|---|
NACK | pid_ioctl($pid, "get error nack"); |
Ошибки шины/bus Error | pid_ioctl($pid, "get error bus"); |
Получение состояния I2C происходит следующим образом: 0 будет возвращен при состоянии бездействия(idle), во всех других случаях будут возвращены другие значения.
Раздел | Синтаксис |
---|---|
Состояние/State | pid_ioctl($pid, "get state"); |
При помощи данной команды ведущий I2C запрашивает данные из ведомого устройства I2C. После отправки данных, вы сможете прочитать их в ведовом устройстве при помощи функции pid_read.
Раздел | Синтаксис |
---|---|
Запрос на чтение данных | pid_ioctl($pid, "req read [N]"); |
При помощи данной команды ведущий I2C запрашивает запись данных в веломое устройство I2C. Существуют 2 способа:
Раздел | Синтаксис |
---|---|
Запрос на запись данных | pid_ioctl($pid, "req write"); |
Запрос на запись данных и ожидание | pid_ioctl($pid, "req write wait"); |
Остановить запись данных | pid_ioctl($pid, "req stop"); |
Когда выполняется команда "req write", ведущий незамедлительно отправляет данные. Таким образом, перед запуском данной команды вам необходимо ввести данные в буфер. С другой стороны, команда "req wait" изменяет состояние шины(bus) на начальное состояние и не меняет его на состояние «stop» до тех пор, пока команда "req stop" не будет запущена. Таким образом, вы можете записывать данные в ведомое устройство, используя функцию pid_write перед выполнением команды "req stop".
Когда связь плохая, вы можете сбросить шину I2C при помощи данной команды.
Команда | Синтаксис |
---|---|
Запрос на сброс шины | pid_ioctl($pid, "req reset"); |