- 1. Регистры.
- 2. Команды.
- 3. Коды ошибок.
1.1 Регистры общего назначения и GPIO
COMMON_CONFIG:
[7..5 — not used, 4 — AUTOLOAD_EN, 3 — REPORTS_EN, 2 — 1W_SEL, 1 — SPI_SEL, 0 — I2C_SEL]
— AUTOLOAD_EN — если конфигурация была сохранена в EPROM с этим установленным флагом, то при включении шлюза он автоматически загрузится с этой конфигурацией
— REPORTS_EN — если этот флаг установлен, то шлюз будет посылать в uart значения, возвращаемые командами в регистр ERROR.
— 1W_SEL — установленный флаг означает, что шлюз настроен для работы через интерфейс 1W (однопроводная шина). При этом регистры интерфейсов I2C/SPI будут недоступны, а команды для этих интерфейсов будут генерировать код ошибки «Unknown Command» — неизвестная команда.
— SPI_SEL — установленный флаг означает, что шлюз настроен для работы через интерфейс SPI. При этом регистры интерфейсов I2C/1W будут недоступны, а команды для этих интерфейсов будут генерировать код ошибки «Unknown Command» — неизвестная команда.
— I2C_SEL — установленный флаг означает, что шлюз настроен для работы через интерфейс I2C. При этом регистры интерфейсов 1W/SPI будут недоступны, а команды для этих интерфейсов будут генерировать код ошибки «Unknown Command» — неизвестная команда.
Если не установлен ни один из флагов 1W_SEL/SPI_SEL/I2C_SEL, то, соответственно, регистры всех трёх интерфейсов недоступны, и команды для всех трёх интерфейсов будут генерировать код ошибки «Unknown Command» — неизвестная команда. Одновременно может быть установлен только один из флагов 1W_SEL/SPI_SEL/I2C_SEL.
ERROR:
Этот регистр содержит последний возвращённый командой код или код ошибки приёма по UART, если такая ошибка имела место при приёме команд или данных.
FLAGS_I2C:
[7..3 — not used, 2 — NEED_I2C_ACK, 1 — RECIEVE_I2C_ACK, 0 — WAIT_I2C_BYTE]
— NEED_I2C_ACK — этот флаг используется для определения того, нужно ли отправлять слэйву подтверждение после приёма от него байта.
— REСIEVE_I2C_ACK — этот флаг устанавливается, если слэйв прислал подтверждение после отправки ему байта.
— WAIT_I2C_BYTE — этот флаг используется для определения того, что следующий принятый по UART байт — это не команда, а данные для передачи по шине.
BTS_I2C:
В этот регистр помещается байт, который будет передан по шине I2C.
RDB_I2C:
В этот регистр помещается байт, считанный с шины I2C.
CONFIG_SPI:
[7..3 — not used, 2 — ENDIAN, 1 и 0 — CPOL и CPHA]
— ENDIAN — этот флаг используется для определения порядка передачи битов из сдвигового регистра (0 — младшим вперёд, 1 — старшим вперёд).
— 1 и 0 — флаги выбора режима SPI (полярность и фаза сигнала CLOCK, соответственно).
PAKET_SIZE:
Этот регистр содержит номер последнего бита пакета. Поскольку номера битов считаются с нуля, то этот номер на единицу меньше размера пакета. Может принимать значения от 0 до 63 (соответственно, размер пакета может быть от 1 до 64 бит).
FLAGS_SPI:
[7..4 — not used, 3 — CONFIG_SPI_IS, 2 — WAIT_SPI_PAKET, 1 — WAIT_SPI_PAKETSIZE, 0 — WAIT_SPI_CONFIG]
— CONFIG_SPI_IS — этот флаг используется для обозначения того, что интерфейс настроен и можно загружать пакеты в сдвиговый регистр (пакеты обязательно должны загружаться только после того, как выбран режим и установлен размер пакета).
— WAIT_SPI_PAKET — этот флаг используется для определения того, что следующий принятый по UART байт — это не команда, а данные для передачи по шине.
— WAIT_SPI_PAKETSIZE — этот флаг используется для определения того, что следующий принятый по UART байт — это не команда, а размер пакета SPI.
— WAIT_SPI_PAKET — этот флаг используется для определения того, что следующий принятый по UART байт — это не команда, а байт конфигурации (будет записан в регистр CONFIG_SPI).
REG0 — REG7:
Эти 8 регистров используются как 64-х битный сдвиговый регистр SPI, формата: REG0_REG1_REG2_REG3_REG4_REG5_REG6_REG7. REG7 — младший байт, REG0 — старший байт. При загрузке в эти регистры по UART данных для передачи, передаваемый пакет нужно загружать младшим байтом вперёд. Если SPI сконфигурирован для передачи данных старшим битом вперёд, то пакет после загрузки автоматически выравняется к старшему биту регистра REG0. При считывании пакета по UART отправляются все 8 байт, начиная с младшего.
FLAGS_1W:
[7 — not used, 6 — WAIT_1W_BIT, 5 — WAIT_1W_BYTE, 4 — SLAVE_1W_IS, 3 — not used, 2 — SEND_1W_RESET, 1 — READ_1W_BIT, 0 — SEND_1W_BIT]
— WAIT_1W_BIT — этот флаг используется для определения того, что следующий принятый по UART байт — это не команда, а байт, младший бит которого должен быть передан по шине 1W.
— WAIT_1W_BYTE — этот флаг используется для определения того, что следующий принятый по UART байт — это не команда, а байт, который должен быть передан по шине 1W.
— SLAVE_1W_IS — этот флаг используется для определения того, что в ответ на посланный по шине reset был получен сигнал presence.
— SEND_1W_RESET — после установки этого флага шлюз посылает в шину сигнал reset.
— READ_1W_BIT — этот флаг используется для определения того, что шлюз должен считать с шины только один бит.
— SEND_1W_BIT — этот флаг используется для определения того, что шлюз должен посылать в шину только младший бит регистра BTS_1W.
BTS_1W:
В этот регистр помещается байт, который будет передан по шине 1W (или байт, младший бит которого будет передан по шине 1W при побитной передаче).
RDB_1W:
В этот регистр помещается байт, считанный с шины 1W (или байт, младший бит которого был принят по шине 1W при побитной передаче).
2.1 Команды общего назначения и GPIO
0x00 – ResetDevice: сбрасывает все общие флаги, кроме REPORTS_EN и AUTOLOAD_EN, очищает регистры флагов интерфейсов I2C, SPI, 1W, регистр конфигурации SPI, регистр размера пакета SPI, регистр ERROR, переинициализирует порты (все на вход, в Z-состояние).
При успешном выполнении возвращает 0x00.
0x01 – InterfaceChoiceI2C: сбрасывает все общие флаги, кроме REPORTS_EN и AUTOLOAD_EN, поднимает флаг I2C_SEL, переинициализирует порты (все на вход, в Z-состояние), переключает линию CS на выход и устанавливает её в единицу.
При успешном выполнении возвращает 0x00.
0x02 – InterfaceChoiceSPI: сбрасывает все общие флаги, кроме REPORTS_EN и AUTOLOAD_EN, поднимает флаг SPI_SEL, переинициализирует порты (все на вход, в Z-состояние), переключает линию SS на выход и устанавливает её в единицу.
При успешном выполнении возвращает 0x00.
0x03 – InterfaceChoice1W: сбрасывает все общие флаги, кроме REPORTS_EN и AUTOLOAD_EN, поднимает флаг 1W_SEL, переинициализирует порты (все на вход, в Z-состояние).
При успешном выполнении возвращает 0x00.
0x04 – ReadError: отсылает по UART содержимое регистра ERROR и обнуляет этот регистр.
0x05 – SaveToEPROM: сохраняет в EPROM регистр COMMON_CONFIG, 3 регистра, содержащих настройки интерфейсов, а также 2 регистра GPIO (направление и защёлки).
При успешном выполнении возвращает 0x00.
0x06 – ReadFromEPROM: отсылает по UART первые 6 байт EPROM (информация, записанная командой SaveToEPROM).
0x07 – EnableReports: устанавливает флаг REPORTS_EN в регистре COMMON_CONFIG
При успешном выполнении возвращает 0x00.
0x08 – DisableReports: сбрасывает флаг REPORTS_EN в регистре COMMON_CONFIG.
0x09 – EnableAutoLoad: устанавливает флаг AUTOLOAD_EN в регистре COMMON_CONFIG.
При успешном выполнении возвращает 0x00.
0x0A – DisableAutoLoad: сбрасывает флаг AUTOLOAD_EN в регистре COMMON_CONFIG.
При успешном выполнении возвращает 0x00.
0x0B – IO0ConfigOutput: устанавливает направление работы линии I/O_0 на выход (устанавливает соответствующий бит регистра DDR в единицу).
При успешном выполнении возвращает 0x00.
0x0C – IO0ConfigInput: устанавливает направление работы линии I/O_0 на вход (сбрасывает соответствующий бит регистра DDR в ноль).
При успешном выполнении возвращает 0x00.
0x0D – IO0Output0: сбрасывает в 0 защёлку линии I/O_0 (сбрасывает в ноль соответствующий бит регистра PORT).
При успешном выполнении возвращает 0x00.
0x0E – IO0Output1: устанавливает в 1 защёлку линии I/O_0 (устанавливает в единицу соответствующий бит регистра PORT).
При успешном выполнении возвращает 0x00.
0x0F – IO1ConfigOutput: устанавливает направление работы линии I/O_1 на выход (устанавливает соответствующий бит регистра DDR в единицу).
При успешном выполнении возвращает 0x00.
0x10 – IO1ConfigInput: устанавливает направление работы линии I/O_1 на вход (сбрасывает соответствующий бит регистра DDR в ноль).
При успешном выполнении возвращает 0x00.
0x11 – IO1Output0: сбрасывает в 0 защёлку линии I/O_1 (сбрасывает в ноль соответствующий бит регистра PORT).
При успешном выполнении возвращает 0x00.
0x12 – IO1Output1: устанавливает в 1 защёлку линии I/O_1 (устанавливает в единицу соответствующий бит регистра PORT).
При успешном выполнении возвращает 0x00.
0x13 – IO2ConfigOutput: устанавливает направление работы линии I/O_2 на выход (устанавливает соответствующий бит регистра DDR в единицу).
При успешном выполнении возвращает 0x00.
0x14 – IO2ConfigInput: устанавливает направление работы линии I/O_2 на вход (сбрасывает соответствующий бит регистра DDR в ноль).
При успешном выполнении возвращает 0x00.
0x15 – IO2Output0: сбрасывает в 0 защёлку линии I/O_2 (сбрасывает в ноль соответствующий линии бит регистра PORT).
При успешном выполнении возвращает 0x00.
0x16 – IO2Output1: устанавливает в 1 защёлку линии I/O_2 (устанавливает в единицу соответствующий бит регистра PORT).
При успешном выполнении возвращает 0x00.
0x17 – TestIO_0: считывает и отправляет по UART состояние линии I/O_0 (считывает соответствующий бит регистра PIN и отправляет по UART 0x0F, если этот бит равен нулю или 0x8F, если он равен единице).
0x18 – TestIO_1: считывает и отправляет по UART состояние линии I/O_1 (считывает соответствующий бит регистра PIN и отправляет по UART 0x0F, если этот бит равен нулю или 0x8F, если он равен единице).
0x19 – TestIO_2: считывает и отправляет по UART состояние линии I/O_2 (считывает соответствующий бит регистра PIN и отправляет по UART 0x0F, если этот бит равен нулю или 0x8F, если он равен единице).
0x1A – ReadCommonConfig: отправляет по UART общую конфигурацию шлюза (содержимое регистра COMMON_CONFIG).
0x1B – ReadVersion: отправляет по UART содержимое ячейки EPROM по адресу 0x08 (в ней содержится версия прошивки).
0x1C – SetIOG: устанавливает в 1 защёлку на линии I/O_0, а затем, после паузы в 80 мкс, устанавливает в 1 защёлку на линии I/O_1. Величина паузы определяется количеством циклов задержки, записанным в 9-м байте EPROM (1 цикл — около 300 нс, по умолчанию количество циклов равно 0xFF)
При успешном выполнении возвращает 0x00.
0x20 – SendStart_I2C: формирует на шине «старт-условие».
При успешном выполнении возвращает 0x00.
0x21 – SendStop_I2C: формирует на шине «стоп-условие».
При успешном выполнении возвращает 0x00.
0x22 – SendByte_I2C: поднимает флаг WAIT_I2C_BYTE (означает, что следующий принятый байт будет отправлен по I2C).
После приёма команды возвращает 0x00, далее, после приёма следующего байта и его отправки, сбрасывает флаг WAIT_I2C_BYTE и возвращает 0x00 при получении ACK от слэйва или 0x20 при отсутствии ACK от слэйва.
0x23 – ReadByteA_I2C: поднимает флаг NEED_I2C_ACK (при поднятом флаге NEED_I2C_ACK процедура чтения посылает в конце сигнал ACK), читает байт с шины I2C и посылает его по UART.
0x24 – ReadByte_I2C: сбрасывает флаг NEED_I2C_ACK (при сброшенном флаге NEED_I2C_ACK процедура чтения не посылает в конце сигнал ACK), читает байт с шины I2C и посылает его по UART.
0x25 – ClearCS_I2C: сбрасывает линию CS в ноль (низкий уровень).
При успешном выполнении возвращает 0x00.
0x26 – SetCS_I2C: устанавливает линию CS в единицу (высокий уровень).
При успешном выполнении возвращает 0x00.
0x27 – ReadCS_I2C: читает состояние линии CS (считывает соответствующий бит регистра PIN и отправляет по UART 0x0F, если этот бит равен нулю или 0x8F, если он равен единице).
0x40 – LoadConfig_SPI: поднимает флаг WAIT_SPI_CONFIG (означает, что следующий принятый байт будет записан в регистр конфигурации SPI).
После приёма команды возвращает 0x00, далее, после приёма следующего байта, затирает у него старшие 5 бит и записывает результат в регистр CONFIG_SPI, далее поднимает флаг CONFIG_SPI_IS, после чего сбрасывает флаг WAIT_SPI_CONFIG и возвращает 0x00.
0x41 – ReadConfig_SPI: отправляет по UART содержимое регистра CONFIG_SPI или код ошибки 0x40, если флаг CONFIG_SPI_IS сброшен (этот код ошибки не совпадает ни с одной возможной конфигурацией).
0x42 – LoadPaketSize_SPI: поднимает флаг WAIT_SPI_PAKETSIZE (означает, что следующий принятый байт будет содержать размер пакета).
После приёма команды возвращает 0x00, далее, после приёма следующего байта, отнимает от него 1, затирает у полученного байта старшие 2 бита и записывает его в регистр PAKET_SIZE (значение в этом регистре получается на 1 меньше размера пакета, то есть это как бы номер последнего бита, поскольку биты считаются с нуля), после чего сбрасывает флаг WAIT_SPI_PAKETSIZE и возвращает 0x00 если всё прошло успешно.
0x43 – ReadPaketSize_SPI: прибавляет 1 к значению в регистре PAKET_SIZE и отправляет это значение по UART (размер пакета).
0x44 – LoadPaket_SPI: поднимает флаг WAIT_PAKET_SPI (означает, что следующие N принятых байт будут записаны в сдвиговый регистр).
Если установлен флаг CONFIG_SPI_IS, то после получения команды возвращает 0x00 и поднимает флаг WAIT_PAKET_SPI, далее, после получения всего пакета, сбрасывает флаг WAIT_PAKET_SPI и возвращает 0x00, если всё прошло успешно. Если флаг CONFIG_SPI_IS не установлен, то сразу после получения команды возвращает код ошибки 0x40.
0x45 – ReadPaket_SPI: отправляет по UART содержимое сдвигового регистра (все 8 байт целиком).
0x46 – StartChange_SPI: выполняет обмен данными между сдвиговыми регистрами шлюза и подключенного к нему устройства.
При успешном выполнении возвращает 0x00, при сброшенном флаге CONFIG_SPI_IS — код ошибки 0x040.
0x47 – ClearSS_SPI: сбрасывает линию SS в ноль (низкий уровень).
При успешном выполнении возвращает 0x00.
0x48 – SetSS_SPI: устанавливает линию SS в единицу (высокий уровень).
При успешном выполнении возвращает 0x00.
0x49 – ReadSS_SPI: читает состояние линии SS (считывает соответствующий бит регистра PIN и отправляет по UART 0x0F, если этот бит равен нулю или 0x8F, если он равен единице).
0x60 – SendReset_1W: формирует на шине сброс и определяет, был ли в ответ на это сформирован сигнал presence.
Возвращает 0x00 при наличии сигнала presence или 0x60 при его отсутствии.
0x61 – SendByte_1W: устанавливает флаг WAIT_1W_BYTE (это означает, что следующий принятый по UART байт будет отправлен по шине 1W).
Возвращает 0x00 и устанавливает флаг WAIT_1W_BYTE, далее, после того, как следующий принятый байт будет отправлен по шине 1W, сбрасывает флаг WAIT_1W_BYTE и возвращает 0x00.
0x62 – ReadByte_1W: принимает байт с шины 1W и отправляет его по UART.
0x63 – SendBit_1W: устанавливает флаг WAIT_1W_BIT (это означает, что младший бит следующего принятого по UART байта будет отправлен по шине 1W).
Возвращает 0x00 и устанавливает флаг WAIT_1W_BIT, далее, после того как младший бит следующего принятого байта будет отправлен по шине 1W, сбрасывает флаг WAIT_1W_BIT и возвращает 0x00.
0x64 – ReadBit_1W: принимает бит с шины 1W и отправляет по UART 0x0F, если этот бит нулю, или 0x8F, если этот бит равен единице.
1) 0x00 – NoError: этот код возвращается, если при выполнении команды не возникало никаких ошибок.
2) 0x80 – UnknownCommand: этот код ошибки означает, что была принята неизвестная команда. Он, в частности, генерируется при попытке выполнить команду интерфейса, который не выбран в регистре COMMON_CONFIG.
3) 0x81 – FrameError: ошибка передачи данных по UART (ошибка кадра). Принятая после такой ошибки команда не будет считана и выполнена.
4) 0x82 – DataOverrun: ошибка передачи данных по UART (переполнение). Принятая после такой ошибки команда не будет считана и выполнена.
5) 0x83 – ParityError: ошибка передачи данных по UART (ошибка чётности). Принятая после такой ошибки команда не будет считана и выполнена.
6) 0x20 – NAK_I2C: от подчинённого устройства нет подтверждения приёма данных по шине I2C.
7) 0x40 – NoConfig_SPI: нет установленной конфигурации SPI. Такая ошибка возникает, например, при попытке отправить/принять данные по шине SPI при отсутствии установленной конфигурации. Этот код ошибки не совпадает ни с одной из возможных конфигураций SPI.
8) 0x60 — NoPresence: в ответ на сброс шины не получен сигнал presence. Такая ошибка говорит об отсутствии ведомых устройств на шине 1W.