lucy 0 29 января, 2022 Опубликовано 29 января, 2022 · Жалоба Всем, доброго времени суток. Мне необходимо по шине 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); и есть то самое, над чем страдаю. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
andrew_su 1 29 января, 2022 Опубликовано 29 января, 2022 · Жалоба 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 на выполнение всех ее действий, если за это время что-то не выполнится, функция возвратит ошибку. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
lucy 0 29 января, 2022 Опубликовано 29 января, 2022 · Жалоба 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" для инициализации записи. Если в чем-то откровенно туплю, очень прошу проявить терпение Я неделю назад только начала открывать для себя этот мир со стороны кода))) Большое спасибо за помощь Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
x893 35 30 января, 2022 Опубликовано 30 января, 2022 · Жалоба Берёте пример от ST для i2c и смотрите. И сразу все вопросы заканчиваются. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
lucy 0 30 января, 2022 Опубликовано 30 января, 2022 · Жалоба 47 минут назад, x893 сказал: Берёте пример от ST для i2c и смотрите. И сразу все вопросы заканчиваются. Если бы было все так просто) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
x893 35 30 января, 2022 Опубликовано 30 января, 2022 · Жалоба 1 hour ago, lucy said: Если бы было все так просто) Это очень просто Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 184 30 января, 2022 Опубликовано 30 января, 2022 · Жалоба 12 часов назад, lucy сказал: Еще вопрос по адресу: адрес 7битный, но указываю я 8битное значение (0х18), включая бит записи, правильно? Найдите даташит на чип Вашего ЦАПа. Для I2C-чипов всегда указывают формат посылки. Там же найдёте какой адрес чип ожидает увидеть на шине. В разных мануалах по-разному указывают этот адрес: где-то как 7-битный, где-то как уже сдвинутый на 1 разряд влево 8-битный. Каждый автор мануала сам себе тут хозяин. Также в этом мануале должно быть подробное описание форматов кадров на шине. С этого следует начинать, а уже потом - ковырять всякие кало-кубы. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться