Jump to content

    
Sign in to follow this  
TEMPO

Как прочитать регистр по I2C на STM32

Recommended Posts

Здравствуйте!

 

Подскажите, пожалуйста, как прочитать регистр, содержащий значение температуры по I2C?

В описании на мс есть вот такое. Т.е. регистр "температуры" = 8Dh. 

IC_ADDR = 0x20 << 1;

HAL_I2C_IsDeviceReady(&hi2c1, (uint16_t)(IC_ADDR), 2, 2);  - HAL_OK

REG_TEMP = 0x8D;

buf[0] = REG_TEMP;

HAL_I2C_Master_Receive(&hi2c1, IC_ADDR, buf, 1, HAL_MAX_DELAY); // принимаю 1 (один) байт - HAL_OK

val = (int16_t)buf[0];

sprintf((char*)buf, "%u \r\n", (unsigned int)val);

HAL_UART_Transmit(&huart1, buf, strlen((char*)buf), HAL_MAX_DELAY);

Так всё правильно?

 

Спасибо.

 

temp.png

Edited by TEMPO

Share this post


Link to post
Share on other sites

Пропустил HAL_I2C_Master_Transmit(&hi2c1, IC_ADDR, buf, 2, HAL_MAX_DELAY);

 

 

Вот так?

 

static const uint8_t IC_ADDR = 0x20 << 1; Adress of IC = 20h
static const uint8_t REG_TEMP = 0x8D;  // 8Dh READ_TEMPERATURE r 2-byte

int16_t val;
uint8_t buf[50];

HAL_I2C_IsDeviceReady(&hi2c1, (uint16_t)(IC_ADDR), 2, 2);
buf[0] = REG_TEMP;
HAL_I2C_Master_Transmit(&hi2c1, IC_ADDR, buf, 2, HAL_MAX_DELAY);
HAL_I2C_Master_Receive(&hi2c1, IC_ADDR, buf, 1, HAL_MAX_DELAY);


val = (int16_t)buf[0];
sprintf((char*)buf, "%u \r\n", (unsigned int)val);
HAL_UART_Transmit(&huart1, buf, strlen((char*)buf), HAL_MAX_DELAY);

 

Edited by TEMPO

Share this post


Link to post
Share on other sites
12 часов назад, TEMPO сказал:

Подскажите, пожалуйста, как прочитать регистр, содержащий значение температуры по I2C?

Сначала нужно прочитать мануал на чип, который пытаетесь читать через I2C. И узнать оттуда: каким образом читается произвольный регистр из него.

Читается он скорей всего двумя транзакциями: 1) write-транзакция записи адреса регистра; 2) read-транзакция чтения содержимого регистра.

Также в мануале должно быть указано: каким образом производится переключение с write-транзакции на read-транзакцию. Обычно это делается одним из 2-х способов: 1) СТОП-условие в конце write-транзакции с последующим СТАРТ-условием в начале read-транзакции; 2) REPEATED-START-условие между write-транзакцией и read-транзакцией. Некоторые чипы умеют и так и так переключаться; некоторые - только одним из этих способов. Обычно об этом сказано в мануале.

Share this post


Link to post
Share on other sites
31.05.2021 в 22:15, TEMPO сказал:

Пропустил HAL_I2C_Master_Transmit(&hi2c1, IC_ADDR, buf, 2, HAL_MAX_DELAY);

 

 

Вот так?

 


static const uint8_t IC_ADDR = 0x20 << 1; Adress of IC = 20h
static const uint8_t REG_TEMP = 0x8D;  // 8Dh READ_TEMPERATURE r 2-byte

int16_t val;
uint8_t buf[50];

HAL_I2C_IsDeviceReady(&hi2c1, (uint16_t)(IC_ADDR), 2, 2);
buf[0] = REG_TEMP;
HAL_I2C_Master_Transmit(&hi2c1, IC_ADDR, buf, 2, HAL_MAX_DELAY);
HAL_I2C_Master_Receive(&hi2c1, IC_ADDR, buf, 1, HAL_MAX_DELAY);


val = (int16_t)buf[0];
sprintf((char*)buf, "%u \r\n", (unsigned int)val);
HAL_UART_Transmit(&huart1, buf, strlen((char*)buf), HAL_MAX_DELAY);

 

 

Удалось в итоге решить проблемы?

Edited by Aveal

Share this post


Link to post
Share on other sites

А микросхема секретная?

Для проверки правильности считанных данных, достаточно прочитать те регистры, содержимое которых известно заранее, они описаны в даташите. Ну и по адекватности значения в регистре 0x8D, думаю, температура корпуса термометра известна.

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this