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

STM32H7 I2C help!

Всем, доброго времени суток.

 

Мне необходимо по шине I2C с МК передать инфу на внешний ЦАП о значении выходного напряжения. Данную задачу мне сейчас нужно реализовать лишь для инициализации и отладки устройства. Я сама не программист, поэтому вопрос для меня сложный.

Что у меня имеется: сгенерированный код CubeIDE, использование HAL драйверов. Удалось самой разобраться как инициализировать с помощью HAL внутренний ЦАП через ОУ, задавать с него напряжение, но вот с внешним ЦАПом через I2C разобраться не могу окончательно.

МК выступает в роли мастера, естественно. Как поняла, нужен режим Master_Transmit_Mode. В файле драйвера HAL для I2C по запуску данного режима, не могу понять, что мне вписывать в "pData" - так понимаю, это адрес ячейки, куда я передаю данные, но разве у меня будет необходимость в таком указателе??? У меня же не память, а ЦАП, куда надо передать данные в размере 2х байт. 

Что для меня будет "Timeout"? 

Если я передаю данные в размере 2х байт, как мне это обозначить?

В режиме debug мне удалось передать адрес устройства, но т.к. на этот момент slave не был подключен, NACK я не получила и поэкспериментировать передавать данные мне не удалось.

Буду очень признательна любой помощи.

Прикрепляю скрин по инициализации I2C. Закоменченная строка  //HAL_I2C_Master_Transmit(&hi2c1, 0x0C, pData, 0xffff, uint32_t Timeout); и есть то самое, над чем страдаю.

 

1.jpg

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


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

HAL_StatusTypeDef HAL_I2C_Master_Transmit(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size, uint32_t Timeout)

DevAddress - I2C - шный адрес Вашего DAC

pData - указатель на массив данных, которые предполагается передать в DAC. Например, если DAC 16-ти разрядный, то uint16_t DAC_DATA[8];

В зависимости от типа Вашего DAC, возможно, в DAC_DATA надо вписывать не только значение для преобразования, но и адрес регистра данных DAC.

А еще, возможно, потребуется инициализация самого DAC.

Size - количество передаваемых в DAC элементов DAC_DATA;

Timeout - время в милисекундах, которое отводится функции HAL_I2C_Master_Transmit на выполнение всех ее действий, если за это время что-то не

               выполнится, функция возвратит ошибку.

 

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


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

7 часов назад, andrew_su сказал:

pData - указатель на массив данных, которые предполагается передать в DAC. Например, если DAC 16-ти разрядный, то uint16_t DAC_DATA[8];

т.е. pData и будут те данные, которые мне нужно записать в ЦАП? Регистров у него нет.

7 часов назад, andrew_su сказал:

Size - количество передаваемых в DAC элементов DAC_DATA

У меня получаются данные в 16бит, которые мне нужно записать 1 раз. Значит size я обозначаю как 0х01?

Еще вопрос по адресу: адрес 7битный, но указываю я 8битное значение (0х18), включая бит записи, правильно?

 

Меня смущал тот факт, что регистр записи данных у нас имеет объем 8 бит. А уже в регистре управления 2 (I2C_CR2) я задаю объем данных, количество передаваемых байтов. В режиме дебаг плохо представляла, как это можно было реализовать, но без живого слэйва в принципе было не поэкспериментировать. А сейчас, указав в коде объем данных (pData) и количество раз передачи этих данных, я уже задаю необходимые значения бит в регистрах. Я все правильно понимаю?

Скрины по регистрам и коду прикрепляю. Адрес ЦАПа у меня сейчас с учетом бита записи, т.е. к 7битам адреса добавила последний "0" для инициализации записи.

Если в чем-то откровенно туплю, очень прошу проявить терпение:girl_smile: Я неделю назад только начала открывать для себя этот мир со стороны кода)))

Большое спасибо за помощь:girl_in_love:

 

 

2.jpg

3.jpg

4.jpg

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


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

Берёте пример от ST для i2c и смотрите. И сразу все вопросы заканчиваются.

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


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

47 минут назад, x893 сказал:

Берёте пример от ST для i2c и смотрите. И сразу все вопросы заканчиваются.

Если бы было все так просто)

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


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

12 часов назад, lucy сказал:

Еще вопрос по адресу: адрес 7битный, но указываю я 8битное значение (0х18), включая бит записи, правильно?

Найдите даташит на чип Вашего ЦАПа. Для I2C-чипов всегда указывают формат посылки. Там же найдёте какой адрес чип ожидает увидеть на шине. В разных мануалах по-разному указывают этот адрес: где-то как 7-битный, где-то как уже сдвинутый на 1 разряд влево 8-битный. Каждый автор мануала сам себе тут хозяин.

Также в этом мануале должно быть подробное описание форматов кадров на шине.

С этого следует начинать, а уже потом - ковырять всякие кало-кубы.

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


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

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

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

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

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

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

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

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

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

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