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

Возвращаясь к теме топика)

 

Докладываю, что в документации на ds2482 указана неточность, мол после отправки команды сразу нужен Repeated Start, после чего следует читать регистр состояния.

Микросхема нормально работает и со СТОПом мужду посылками

 

 

 

image.png

 

исправлено: Repeated здесь не будет, но скажите страницу в доке где он так необходим? Строку с Repeated можно разбить на 2 отдельные посылки

 

https://datasheets.maximintegrated.com/en/ds/DS2482-100.pdf

 

страница 18, примеры

Изменено пользователем simark1979

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


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

Можете посмотреть на реализацию в 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

 

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


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

Да, имеется ввиду Repeated START Condition.

Только HAL_I2C_Master_Transmit кроме старта и отправки данных генерит STOP в конце). А он протоколом не предусмотрен

 

 

Впрочем, сейчас выясняется, что в документации на ds2482 не указано, что СТОП не мешает. Просто красавцы!

 

Вот вот ))) на самом деле, много где указано в протоколе, что требуется Repeated START, но на моем опыте всегда работает STOP с новым стартом

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


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

Можете посмотреть на реализацию в 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_*. Можно было бы и так :biggrin:

Но проблема снята сама собой, использую стандартные функции HAL_I2C_Master_Transmit и HAL_I2C_Master_Receive. Микросхема их отлично понимает.

Изменено пользователем simark1979

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


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

Может поможет, у меня похожая задача была - считать 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.

image.thumb.png.136e0e83a6f795ae639d4e6be63ece26.png

Решил эту проблему через HAL так

В кубе поставил галочки 

image.png.2c1d1065133571e46a5634d3858476e9.png

и написал вот такой код

#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 не формируется

image.thumb.png.b0ebedfbedc71c18460241f959307898.png

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


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

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.
 

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


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

On 1/31/2018 at 7:50 AM, simark1979 said:

Здравствуйте, подключен датчик температуры ds1820 через ds2482

Кому нибудь удавалось работать с ds2482 средствами Stm32 HAL драйверов?

 

Я делал на DS2484 именно для общения с DS18B20. Делал упрощенно, в смысле, что исходил из единственного устройства на шине 1-Wire, и не на STM32 HAL, а на, скажем, собственном HAL.

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


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

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

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

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

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

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

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

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

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

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