Наш магазин на eBay Наш магазин на AliExpress Наш канал в telegram

Подробное описание регистров, команд и кодов ошибок шлюза UART-to-I2C/SPI/1W RH-0004

  1. 1. Регистры.
    1. 1.1 Регистры общего назначения и GPIO.
    2. 1.2 Регистры интерфейсов.
      1. 1.2.1 Регистры интерфейса I2C.
      2. 1.2.2 Регистры интерфейса SPI.
      3. 1.2.3 Регистры интерфейса 1W.
  2. 2. Команды.
    1. 2.1 Команды общего назначения и GPIO.

    2. 2.2 Команды интерфейсов.

      1. 2.2.1 Команды интерфейса I2C.
      2. 2.2.2 Команды интерфейса SPI.
      3. 2.2.3 Команды интерфейса 1W.
  3. 3. Коды ошибок.

1. Регистры

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, если такая ошибка имела место при приёме команд или данных.

1.2 Регистры интерфейсов

1.2.1 Регистры интерфейса I2C

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.

1.2.2 Регистры интерфейса SPI

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).

REG0REG7:

Эти 8 регистров используются как 64-х битный сдвиговый регистр SPI, формата: REG0_REG1_REG2_REG3_REG4_REG5_REG6_REG7. REG7 — младший байт, REG0 — старший байт. При загрузке в эти регистры по UART данных для передачи, передаваемый пакет нужно загружать младшим байтом вперёд. Если SPI сконфигурирован для передачи данных старшим битом вперёд, то пакет после загрузки автоматически выравняется к старшему биту регистра REG0. При считывании пакета по UART отправляются все 8 байт, начиная с младшего.

1.2.3 Регистры интерфейса 1W

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. Команды

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.

2.2 Команды интерфейсов

2.2.1 Команды интерфейса I2C

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, если он равен единице).

2.2.2 Команды интерфейса SPI

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, если он равен единице).

2.2.3 Команды интерфейса 1W

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, если этот бит равен единице.

3. Коды ошибок

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.

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