MementoMori 4 20 сентября, 2020 Опубликовано 20 сентября, 2020 · Жалоба Вот такой вот i2C ЦАП https://www.ti.com/lit/ds/symlink/dac43608.pdf Вот что в даташите про протокол написано То есть, шлем адрес, дальше тип команды (например номер канала), дальше данные (например значение напряжения на канале). И вот функция, которую предоставляет куб HAL_I2C_Master_Transmit(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size, uint32_t Timeout) Я не совсем пойму. Как в этом случае будет выглядеть протокол обмена? Вот так что ли? ADDRES BYTE ACK байт в pData ..... Получается что этой функцией можно только чередовать адрес и данные в посылке, а у меня адрес->команда->данные. Подскажите, как организовать обмен с этой микросхемой посредством HAL? Может я не ту функцию выбрал? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
HardEgor 76 21 сентября, 2020 Опубликовано 21 сентября, 2020 · Жалоба 10 часов назад, MementoMori сказал: Получается что этой функцией можно только чередовать адрес и данные в посылке, а у меня адрес->команда->данные. Подскажите, как организовать обмен с этой микросхемой посредством HAL? Может я не ту функцию выбрал? Вам надо передать 4 байта, первый из которых адрес(DevAddress), а три других - данные(pData). Ну так и передавайте :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MementoMori 4 21 сентября, 2020 Опубликовано 21 сентября, 2020 · Жалоба 56 minutes ago, HardEgor said: первый из которых адрес(DevAddress) То есть по адресу 0х48 микросхем пересылается её же адрес? Извините, может я неправильно понимаю процесс. Мастер шлёт в сеть адрес, микросхема откликается ACK, это значит, что следующая посылка будет воспринять ей как руководство к действию, а остальные микросхемы, не распознавшие свой адрес, будут спать. Если я вызову вышеуказанную функцию отправки, получится, что она пошлёт следующую посылку Адрес Адрес Байт1 Байт2 Байт3? Или же мне нужно отправить буфер из 2,3,4 байт, а в первый будет поставлен DevAddress? Не сочтите за наглость, вас не затруднит показать, как вызывать функцию и как будет выглядеть посылка? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
HardEgor 76 21 сентября, 2020 Опубликовано 21 сентября, 2020 · Жалоба 21 минуту назад, MementoMori сказал: Извините, может я неправильно понимаю процесс. Мастер шлёт в сеть адрес, микросхема откликается ACK, это значит, что следующая посылка будет воспринять ей как руководство к действию, а остальные микросхемы, не распознавшие свой адрес, будут спать. Так исходник функции откройте - там всё написано. DevAddress = Address; pData[0] = Command_byte; pData[1] = MSDB; pData[2] = LSDB; HAL_I2C_Master_Transmit(hi2c, DevAddress, pData, 3, Timeout) Остальные микросхемы спать не будут, они тоже воспримут адрес, но ACK не выдадут и дальнейшие данные не примут. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MementoMori 4 21 сентября, 2020 Опубликовано 21 сентября, 2020 · Жалоба Спасибо! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MementoMori 4 21 сентября, 2020 Опубликовано 21 сентября, 2020 · Жалоба 11 hours ago, HardEgor said: Так исходник функции откройте - там всё написано. DevAddress = Address; pData[0] = Command_byte; pData[1] = MSDB; pData[2] = LSDB; HAL_I2C_Master_Transmit(hi2c, DevAddress, pData, 3, Timeout) Остальные микросхемы спать не будут, они тоже воспримут адрес, но ACK не выдадут и дальнейшие данные не примут. Спасибо, Теперь пытаюсь читать: Хочу прочитать STATUS_REGISTER, для его чтения COMMAND_BYTE должен быть равен 0x02 Читаю uint8_t aRxBuffer[3]; Command_byte = 0x02; aRxBuffer[0] = Command_byte; HAL_I2C_Master_Receive(&hi2c1, DevAddress, aRxBuffer, 3, 100); Пoлучаю aRxBuffer 0x00,0x00,0xFF Лажа какая-то. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Herz 5 21 сентября, 2020 Опубликовано 21 сентября, 2020 · Жалоба А скажите мне, ведь эти HAL-библиотеки под STM32? А что делать с ними, если платформу придётся менять? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MementoMori 4 21 сентября, 2020 Опубликовано 21 сентября, 2020 · Жалоба Я любитель и STM мне за глаза. uint8_t MemAddress=0x02; uint8_t MemAddressSize=2; HAL_I2C_Mem_Read(&hi2c1, DevAddress, MemAddress,MemAddressSize, aRxBuffer, 2, 100); И вот так тоже нули... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
HardEgor 76 22 сентября, 2020 Опубликовано 22 сентября, 2020 · Жалоба 9 часов назад, Herz сказал: А скажите мне, ведь эти HAL-библиотеки под STM32? А что делать с ними, если платформу придётся менять? Переходить на другие библиотеки :) И хорошо если будут исходники.... 10 часов назад, MementoMori сказал: uint8_t aRxBuffer[3]; Command_byte = 0x02; aRxBuffer[0] = Command_byte; HAL_I2C_Master_Receive(&hi2c1, DevAddress, aRxBuffer, 3, 100); Насколько я помню функция должна что-то возвращать - закончила нормально или по таймауту? И проверить hi2c->ErrorCode А остальные значения aRxBuffer инициализируете? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
HardEgor 76 22 сентября, 2020 Опубликовано 22 сентября, 2020 · Жалоба 10 часов назад, MementoMori сказал: Спасибо, Теперь пытаюсь читать: Дык, однако, там же нарисовано - вначале надо сделать Transmit команды, а потом Receive данных. Т.е. вначаде HAL_I2C_Master_Transmit(), а потом HAL_I2C_Master_Receive() и после выполнения каждой проверять на ошибки. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MementoMori 4 22 сентября, 2020 Опубликовано 22 сентября, 2020 · Жалоба 57 minutes ago, HardEgor said: Насколько я помню функция должна что-то возвращать - закончила нормально или по таймауту? И проверить hi2c->ErrorCode Без ошибок. 57 minutes ago, HardEgor said: А остальные значения aRxBuffer инициализируете? судя по исходному коду функции Receive, она сама туда пишет. 35 minutes ago, HardEgor said: Т.е. вначаде HAL_I2C_Master_Transmit(), а потом HAL_I2C_Master_Receive() и после выполнения каждой проверять на ошибки. Вот черт, я ведь так и подумал в начале. Даже на форуме написал, а потом решил, что это глупость, и стер. Я решил, что функция HAL_I2C_Mem_Read делает все сама. Так в Transmit в поле address_byte указывать адрес устройства, а в Recieve в поле address_byte указывать адрес регистра? Я правильно понял? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
HardEgor 76 22 сентября, 2020 Опубликовано 22 сентября, 2020 · Жалоба 33 минуты назад, MementoMori сказал: Так в Transmit в поле address_byte указывать адрес устройства, а в Recieve в поле address_byte указывать адрес регистра? Я правильно понял? Почему? Вы хорошо посмотрели на картинку? Там же всё нарисовано: 1. посылаете address и command 2. посылаете address и получаете 2 байта(device_config и status/trigger). зы. чтение lдокументации 100$/час Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MementoMori 4 22 сентября, 2020 Опубликовано 22 сентября, 2020 · Жалоба 18 minutes ago, HardEgor said: Вы хорошо посмотрели на картинку? Там же всё нарисовано: Да картинка мне понятна, не совсем понятно, как функциями это реализлвывать 18 minutes ago, HardEgor said: посылаете address и command Это ясно, HAL_I2C_Master_Transmit() и буфер размером в 1 байт. 20 minutes ago, HardEgor said: посылаете address и получаете 2 байта(device_config и status/trigger). Посылаю как? Ещё одна функция transmit()? Или HAL_I2C_Master_Receive(), а она сама пошлёт байт адреса? В этой функции в качестве параметра есть rxBuffer. Его элементам ничего присваивать не надо, функция сама его заполнит? Так? 23 minutes ago, HardEgor said: посылаете address и получаете 2 байта(device_config и status/trigger). Неправда ваша. Каждый из указанных регистров двухбайтный и читается по отдельности. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
HardEgor 76 22 сентября, 2020 Опубликовано 22 сентября, 2020 · Жалоба 30 минут назад, MementoMori сказал: Или HAL_I2C_Master_Receive(), а она сама пошлёт байт адреса? В этой функции в качестве параметра есть rxBuffer. Его элементам ничего присваивать не надо, функция сама его заполнит? Так? Да, пошлёт адрес и примет 2 байта. А как она еще может обратиться к чипу? Смотрите исходник - там всё написано. 30 минут назад, MementoMori сказал: Неправда ваша. Каждый из указанных регистров двухбайтный и читается по отдельности. В даташит не вникал, но на вашей картинке явно написано MSDB и LSDB, и также в таблицах 5 и 8 написано, а также в Read Sequence. ps. напоминаю - чтение документации вслух 100$/час :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MementoMori 4 22 сентября, 2020 Опубликовано 22 сентября, 2020 · Жалоба Спасибо, получилось, чтение и запись работают. Но.... не во все регистры пишется. Что я сделал - я тупо пишу 0xFFFF во все регистры. Номер регистра это Conand_byte. По идее я должен прочесть из них те же 0xFFFF, за минусом тех бит, которые Readonly или "Don't care" Command_byte = 0x01; DAC_REGISTER=0XFFFF; LSDB=DAC_REGISTER>>8; MSDB=DAC_REGISTER&0xFF; aTxBuffer[0] = Command_byte; aTxBuffer[1] = MSDB; aTxBuffer[2] = LSDB; HAL_I2C_Master_Transmit(&hi2c1, DevAddress, aTxBuffer, 3, 100); Command_byte = 0x01; aTxBuffer[0] = Command_byte; RESULT=HAL_I2C_Master_Transmit(&hi2c1, DevAddress, aTxBuffer, 1, 100); RESULT2=HAL_I2C_Master_Receive(&hi2c1, DevAddress, aRxBuffer, 2, 100); К примеру Запись в этот регистр 0xFFFF при чтении дает 0x0FFF. Отлично, идем дальше Запись в этот регистр 0xFFFF при чтении дает 0x0500 (в серединке читается DEVICE_ID, который в бинарном формате 010100). А вот регистры каналов Что бы я ни записал - читаются нули.... что может быть не так? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться