STM32 HAL_I2C_Master_Transmit - Зачем нам нужно менять адрес? - PullRequest
0 голосов
/ 05 мая 2020

наткнувшись на очень странную вещь, я хотел бы узнать, может ли кто-нибудь дать разумное объяснение.

У меня есть датчик влажности SHT31, работающий на I2 C, и после попытки запустить его на STM32F2 он не сделал ' t работает.

uint8_t __data[5]={0};

__data[0] = SHT31_SOFTRESET >> 8;
__data[1] = SHT31_SOFTRESET & 0xFF;


HAL_I2C_Master_Transmit(&hi2c3,((uint16_t)0x44)<<1,__data,2,1000);

Я открыл функцию и увидел:

/**
  * @brief  Transmits in master mode an amount of data in blocking mode.
  * @param  hi2c Pointer to a I2C_HandleTypeDef structure that contains
  *                the configuration information for the specified I2C.
  * @param  DevAddress Target device address: The device 7 bits address value
  *         in datasheet must be shifted to the left before calling the interface
  * @param  pData Pointer to data buffer
  * @param  Size Amount of data to be sent
  * @param  Timeout Timeout duration
  * @retval HAL status
  */
HAL_StatusTypeDef HAL_I2C_Master_Transmit(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size, uint32_t Timeout)
{
  /* Init tickstart for timeout management*/
  uint32_t tickstart = HAL_GetTick();

  if (hi2c->State == HAL_I2C_STATE_READY)
  ....... and it goes ....

Итак, я следил за комментарием и разочарованием из моего прицела (глядя, почему мои биты не попадают в сеть ) и сделал:

HAL_I2C_Master_Transmit(&hi2c3,((uint16_t)0x44)<<1,__data,2,1000);

Наконец мои биты выходят, и устройство возвращает мне ACK - вуаля, оно работает!

Но почему ?? В чем причина того, что программист обременен изменением адреса?

Ответы [ 2 ]

0 голосов
/ 06 мая 2020

Никогда не было согласовано, следует ли указывать адрес I2 C:

  1. , чтобы его нужно было сдвинуть для передачи, или
  2. , чтобы он не нужно сдвигать для передачи.

Поэтому в некоторых технических описаниях устройств это указано в варианте 1, а в некоторых - в варианте 2. Точно так же некоторые интерфейсы API I2 C принимают адрес в варианте 1, а некоторые - в варианте 2.

Если устройство и API используют другой вариант, программист должен сместить адрес.

Это создает большую путаницу и довольно раздражает. Я сомневаюсь, что это будет прояснено.

0 голосов
/ 05 мая 2020

Потому что программист, вероятно, должен знать, хочет ли он читать или записывать данные на ведомое устройство I2 C или из него.

Обычно I2 C передает первые семь бит байт адреса »содержит адрес подчиненного устройства, тогда как последний бит является битом чтения / записи. 0 - запись, а 1 - чтение.

В вашем случае вы хотите записать данные на устройство (для выполнения мягкого сброса), и поэтому простой сдвиг влево сделает свое дело.

...