Перейти к содержанию
    

Помогите "подружить" по I2C два устройства

Есть преобразователь SC18IM700 из UART to I2C, необходимо общаться с TAS5414B.

Но возникли сложности при считывании регистров:

В описании SC18 указано, что для считывания необходимо задать адрес ведомого и указать количество байт которые я ожидаю получить, но в инструкции на TAS5414 указано что помимо адреса надо еще указывать подадрес (регистры где необходимые значения), так вот как это сделать я чего то не пойму.

Для режима записи вроде понятно, там после указания количества байт можно указывать инструкции что и куда записать. Вот правда проверить правильность не получается.

SC18IM700.pdf

tas5414b_q1.pdf

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Может режим "7.1.7 Repeated START: read after write" надо использовать

Его тоже пробовал: Сигнала на выходе SC18 вообще нет. Причем режим Repeated START: write after write вроде как проходит, но для записи в TAS5414.

Может я нет так составляю последовательность команд, но если у Вас есть конкретный вариант, то пиши сразу попробую.

Я делал так:

53 D9 xx 50 получаешь хх байт, значения которых всё время разные.

53 D9 01 53 D9 0C 50 на выходе SC18 тихо, наверное не поддерживает режим "read after read"

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вам надо разделить адресацию (в смысле понимания) для мастера и слейва.

- Адресация по шине I2c - 7-битная, без всяких "подаресов".

- Адресация регистров мастера

- Адресация регистров слейва.

Добейтесь четкого отрабатывания:

- посылки адреса слейва

- проверки ответа от него ACK (ответ только на "свой" адрес)

Если это будет работать - можно двигать дальше.

 

Судя по даташиту, ОНО должно работать из терминалки - так как команды ASCII.

Также надо проверить инициализацию самого мастера (настройки его регистров)

Обратите внимание на fifo - возможно надо делать операции подобные purge/drain fifo

чтобы команда пошла на исполнение (как в PC так и в мастере).

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вам надо разделить адресацию (в смысле понимания) для мастера и слейва.

- Адресация по шине I2c - 7-битная, без всяких "подаресов".

- Адресация регистров мастера

- Адресация регистров слейва.

Добейтесь четкого отрабатывания:

- посылки адреса слейва

- проверки ответа от него ACK (ответ только на "свой" адрес)

Если это будет работать - можно двигать дальше.

 

Судя по даташиту, ОНО должно работать из терминалки - так как команды ASCII.

Также надо проверить инициализацию самого мастера (настройки его регистров)

Обратите внимание на fifo - возможно надо делать операции подобные purge/drain fifo

чтобы команда пошла на исполнение (как в PC так и в мастере).

Так я из терминалки сейчас и мучаю его.

До регистров мастера достучатся не проблема, там всё четко.

Чуть выше я не верно описал последовательно команд.

Было так: старт/адрес слейва+чтение/количество принимаемых байт/регистры ведомого (0С)/конец пакета это из описания на SC18

53 D9 01 0С 50

Из описания на слейв должно выглядеть так: старт/адрес слейва+чтение/регистры ведомого (0С)/рестарт/количество принимаемых байт//конец пакета

53 D9 0C 53 D9 01 50

Как я писал ранее Если послать слейву команду 53 D9 01 50, то я получу один байт в ответ, если 53 D9 0А 50 то соответвенно 10 байт в ответе. Но значения байтов в этих ответах всё время разные. На другие адреса слейв не отвечает.

Отсюда следует, что мастер воспринимает 3-ий байт как значение количества байт которые он должен принять от слейва.

Обратите внимание на fifo - возможно надо делать операции подобные purge/drain fifo

Не совсем понял где делать эти операции? FIFO у м/сх 16 байт, что вполне хватает для команды чтения.

 

Хм, поковырял еще немного вроде добился чтения вот такой командой, как раз как советовали read after write старт/адрес+бит записи/количество байт/регистр куда делать запись/рестарт/адрес+бит чтения/количество байт получаемых/стоп

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Хм, поковырял еще немного вроде добился чтения вот такой командой, как раз как советовали read after write старт/адрес+бит записи/количество байт/регистр куда делать запись/рестарт/адрес+бит чтения/количество байт получаемых/стоп

Да, в фазу записи Вы указываете адрес устройства и как бы записываете субадрес откуда будете потом считывать второй фазой чтения (адрес устройства и байты для чтения). Это все без накладных указаний для SC18IM700.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Всем спасибо.

Такой вопрос, если я буду делать это напрямую с Atmega, мне так же надо будет инициализировать сначала режим записи Или можно сразу обращаться как в описании TAS5414. : старт/адрес+бит чтения/регистр куда обращаюсь/рестарт/получаю ответ/стоп ?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Да, это "стандартная" процедура для чтения из определенного регистра по I2C, обычно если продолжить читать дальше то данные будут идти со следующего адреса регистра т.е. будет автоматически инкрементироваться.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Да, это "стандартная" процедура для чтения из определенного регистра по I2C, обычно если продолжить читать дальше то данные будут идти со следующего адреса регистра т.е. будет автоматически инкрементироваться.

Про инкримент счётчика регистра, я читал там описано, спасибо.

Меня просто насторожил тот факт, что в описании последовательности команд уTI не указан конкретно какой бит выставлять на чтение или на запись при чтении и записи. До этого работал только с AD там по подробнее это описано.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Описано у них всё, просто надо в тексте внимательно смотреть, там прям так и написано бит записи в 0 и бит чтения в 1, только на картинках не понятно.

As shown in Figure 16, a single-byte data-read transfer begins with the master device transmitting a start

condition followed by the I2C device address and the read/write bit. For the data-read transfer, both a write

followed by a read are actually done. Initially, a write is done to transfer the address byte or bytes of the internal

memory address to be read. As a result, the read/write bit is a 0. After receiving the address and the read/write

bit, the TAS5414B-Q1 or TAS5424B-Q1 responds with an acknowledge bit. In addition, after sending the internal

memory address byte or bytes, the master device transmits another start condition followed by the

TAS5414B-Q1 or TAS5424B-Q1 address and the read/write bit again. This time the read/write bit is a 1,

indicating a read transfer.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...