Forger 26 31 января, 2018 Опубликовано 31 января, 2018 · Жалоба "промышленный онанизм" Хорошо сказано Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
simark1979 0 31 января, 2018 Опубликовано 31 января, 2018 (изменено) · Жалоба Возвращаясь к теме топика) Докладываю, что в документации на ds2482 указана неточность, мол после отправки команды сразу нужен Repeated Start, после чего следует читать регистр состояния. Микросхема нормально работает и со СТОПом мужду посылками исправлено: Repeated здесь не будет, но скажите страницу в доке где он так необходим? Строку с Repeated можно разбить на 2 отдельные посылки https://datasheets.maximintegrated.com/en/ds/DS2482-100.pdf страница 18, примеры Изменено 31 января, 2018 пользователем simark1979 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Lagman 1 1 февраля, 2018 Опубликовано 1 февраля, 2018 · Жалоба Можете посмотреть на реализацию в HAL функций: HAL_StatusTypeDef HAL_I2C_Mem_Write(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint8_t *pData, uint16_t Size, uint32_t Timeout); HAL_StatusTypeDef HAL_I2C_Mem_Read(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint8_t *pData, uint16_t Size, uint32_t Timeout); Не смотрите на их название, они как раз делают такие вещи, выдают адрес устройства и байты откуда считать или записать и потом без стопа происходит считывание или запись, по поводу uint16_t MemAddress если указать в uint16_t MemAddSize = I2C_MEMADD_SIZE_8BIT то он будет 8 битный и будет отправляться один байт. Если имя функций смущает, напишите для них свои имена. :-) Если используете DMA или прерывания для работы с I2C то в HALe есть подобные функции и для них. HAL_I2C_Mem_Write_IT HAL_I2C_Mem_Read_IT HAL_I2C_Mem_Write_DMA HAL_I2C_Mem_Read_DMA Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
0men 2 1 февраля, 2018 Опубликовано 1 февраля, 2018 · Жалоба Да, имеется ввиду Repeated START Condition. Только HAL_I2C_Master_Transmit кроме старта и отправки данных генерит STOP в конце). А он протоколом не предусмотрен Впрочем, сейчас выясняется, что в документации на ds2482 не указано, что СТОП не мешает. Просто красавцы! Вот вот ))) на самом деле, много где указано в протоколе, что требуется Repeated START, но на моем опыте всегда работает STOP с новым стартом Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
simark1979 0 1 февраля, 2018 Опубликовано 1 февраля, 2018 (изменено) · Жалоба Можете посмотреть на реализацию в HAL функций: HAL_StatusTypeDef HAL_I2C_Mem_Write(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint8_t *pData, uint16_t Size, uint32_t Timeout); HAL_StatusTypeDef HAL_I2C_Mem_Read(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint8_t *pData, uint16_t Size, uint32_t Timeout); Не смотрите на их название, они как раз делают такие вещи, выдают адрес устройства и байты откуда считать или записать и потом без стопа происходит считывание или запись, по поводу uint16_t MemAddress если указать в uint16_t MemAddSize = I2C_MEMADD_SIZE_8BIT то он будет 8 битный и будет отправляться один байт. Если имя функций смущает, напишите для них свои имена. :-) ............................................................. Спасибо, я про эти функции в курсе. Но они тоже бы не подошли. Смысл работы с этой микросхемой иногда сводится к тому, чтобы: послать команду, а далее постоянно вычитывать и анализировать байт состояния (он будет приходить снова и снова), по которому можно понять выполнилась команда на шине 1wire или нет. HAL_I2C_Mem_Read_IT заранее должна знать сколько нужно читать..... Короче немного не то, но всё равно спасибо :rolleyes: UPD: извиняюсь, только дошло, что Вы предлагали написать свои функции, подглядывая на реализацию HAL_I2C_Mem_*. Можно было бы и так Но проблема снята сама собой, использую стандартные функции HAL_I2C_Master_Transmit и HAL_I2C_Master_Receive. Микросхема их отлично понимает. Изменено 1 февраля, 2018 пользователем simark1979 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
BioWolf2000 3 31 октября, 2019 Опубликовано 31 октября, 2019 · Жалоба Может поможет, у меня похожая задача была - считать device id FRAM MR44V100A Device ID Read Sequence 1. Next to Start condition, send 0xF8. MR44V100A responds ACK signal. 2. Send the Slave address (WA16 and R/W are “Don’t care”). MR44V100A responds ACK signal. 3. Again next to Start condition, send 0xF9. MR44V100A responds ACK signal, then outputs 3 bytes of Device ID. 4. Send Stop condition and finish the sequence. Решил эту проблему через HAL так В кубе поставил галочки и написал вот такой код #include "MR44V100A.h" //private varibales static uint8_t device_address; static I2C_HandleTypeDef *hi2c; HAL_StatusTypeDef MR44V100A_Init(I2C_HandleTypeDef *handle_i2c, uint8_t dev_addr) { HAL_StatusTypeDef status; device_address = dev_addr; hi2c = handle_i2c; uint8_t tmp[3]; tmp[0]= (device_address << 1); status = HAL_I2C_Master_Seq_Transmit_IT(hi2c, 0xF8, &tmp[0], 1, I2C_FIRST_FRAME); if (status != HAL_OK) return status; while (HAL_I2C_GetState(hi2c) != HAL_I2C_STATE_READY) ; status = HAL_I2C_Master_Seq_Receive_IT(hi2c, 0xF9, tmp, 3, I2C_LAST_FRAME); if (status != HAL_OK) return status; while (HAL_I2C_GetState(hi2c) != HAL_I2C_STATE_READY) ; if ((tmp[0]==0x01)&&(tmp[1]==0xb0)&&(tmp[2]==0x00))//MR44V100A ID read OK return HAL_OK; else return HAL_ERROR; } HAL_StatusTypeDef MR44V100A_readByte(uint32_t register_address, uint8_t* data) { return MR44V100A_readBytes(register_address, 1, data); } HAL_StatusTypeDef MR44V100A_writeByte(uint32_t register_address, uint8_t data) { return MR44V100A_writeBytes(register_address, 1, &data); } HAL_StatusTypeDef MR44V100A_writeBytes(uint32_t register_address, uint32_t length, uint8_t* data) { assert_param((register_address + length - 1) <= 0x1FFFF); HAL_StatusTypeDef status = HAL_I2C_Mem_Write( hi2c, (device_address << 1) | (((register_address&(1 << 16)) ? 1 : 0) << 1), //add 16th bit of address(WA16) (uint16_t)register_address, I2C_MEMADD_SIZE_16BIT, data, length, 1000); while (HAL_I2C_IsDeviceReady(hi2c, (device_address << 1), 1, HAL_MAX_DELAY) != HAL_OK) ; return status; } HAL_StatusTypeDef MR44V100A_readBytes(uint32_t register_address, uint32_t length, uint8_t* data) { assert_param((register_address + length - 1) <= 0x1FFFF); return HAL_I2C_Mem_Read( hi2c, (device_address << 1) | (((register_address&(1 << 16)) ? 1 : 0) << 1), (uint16_t)register_address, I2C_MEMADD_SIZE_16BIT, data, length, 1000); } ps Посмотрел логическим анализатором шину, после первой посылки STOP не формируется Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
BioWolf2000 3 1 ноября, 2019 Опубликовано 1 ноября, 2019 · Жалоба On 1/31/2018 at 9:50 AM, simark1979 said: Если есть инфа, по работе этих функций (интересует что конкретно происходит на шине, если эти функции вызывать в разных режимах: - I2C_FIRST_FRAME - I2C_NEXT_FRAME - I2C_FIRST_AND_LAST_FRAME - I2C_LAST_FRAME Внутри stm32f7xx_hal_i2c.c есть описание (@) These interfaces allow to manage a sequential transfer with a repeated start condition when a direction change during transfer [..] (+) A specific option field manage the different steps of a sequential transfer (+) Option field values are defined through @ref I2C_XFEROPTIONS and are listed below: (++) I2C_FIRST_AND_LAST_FRAME: No sequential usage, functionnal is same as associated interfaces in no sequential mode (++) I2C_FIRST_FRAME: Sequential usage, this option allow to manage a sequence with start condition, address and data to transfer without a final stop condition (++) I2C_FIRST_AND_NEXT_FRAME: Sequential usage (Master only), this option allow to manage a sequence with start condition, address and data to transfer without a final stop condition, an then permit a call the same master sequential interface several times (like @ref HAL_I2C_Master_Seq_Transmit_IT() then @ref HAL_I2C_Master_Seq_Transmit_IT() or @ref HAL_I2C_Master_Seq_Transmit_DMA() then @ref HAL_I2C_Master_Seq_Transmit_DMA()) (++) I2C_NEXT_FRAME: Sequential usage, this option allow to manage a sequence with a restart condition, address and with new data to transfer if the direction change or manage only the new data to transfer if no direction change and without a final stop condition in both cases (++) I2C_LAST_FRAME: Sequential usage, this option allow to manage a sequance with a restart condition, address and with new data to transfer if the direction change or manage only the new data to transfer if no direction change and with a final stop condition in both cases (++) I2C_LAST_FRAME_NO_STOP: Sequential usage (Master only), this option allow to manage a restart condition after several call of the same master sequential interface several times (link with option I2C_FIRST_AND_NEXT_FRAME). Usage can, transfer several bytes one by one using HAL_I2C_Master_Seq_Transmit_IT(option I2C_FIRST_AND_NEXT_FRAME then I2C_NEXT_FRAME) or HAL_I2C_Master_Seq_Receive_IT(option I2C_FIRST_AND_NEXT_FRAME then I2C_NEXT_FRAME) or HAL_I2C_Master_Seq_Transmit_DMA(option I2C_FIRST_AND_NEXT_FRAME then I2C_NEXT_FRAME) or HAL_I2C_Master_Seq_Receive_DMA(option I2C_FIRST_AND_NEXT_FRAME then I2C_NEXT_FRAME). Then usage of this option I2C_LAST_FRAME_NO_STOP at the last Transmit or Receive sequence permit to call the oposite interface Receive or Transmit without stopping the communication and so generate a restart condition. (++) I2C_OTHER_FRAME: Sequential usage (Master only), this option allow to manage a restart condition after each call of the same master sequential interface. Usage can, transfer several bytes one by one with a restart with slave address between each bytes using HAL_I2C_Master_Seq_Transmit_IT(option I2C_FIRST_FRAME then I2C_OTHER_FRAME) or HAL_I2C_Master_Seq_Receive_IT(option I2C_FIRST_FRAME then I2C_OTHER_FRAME) or HAL_I2C_Master_Seq_Transmit_DMA(option I2C_FIRST_FRAME then I2C_OTHER_FRAME) or HAL_I2C_Master_Seq_Receive_DMA(option I2C_FIRST_FRAME then I2C_OTHER_FRAME). Then usage of this option I2C_OTHER_AND_LAST_FRAME at the last frame to help automatic generation of STOP condition. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
KnightIgor 2 5 ноября, 2019 Опубликовано 5 ноября, 2019 · Жалоба On 1/31/2018 at 7:50 AM, simark1979 said: Здравствуйте, подключен датчик температуры ds1820 через ds2482 Кому нибудь удавалось работать с ds2482 средствами Stm32 HAL драйверов? Я делал на DS2484 именно для общения с DS18B20. Делал упрощенно, в смысле, что исходил из единственного устройства на шине 1-Wire, и не на STM32 HAL, а на, скажем, собственном HAL. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться