Помогите новичку прочитать 2 байта данных из регистра температуры датчика adt7410. Датчик подключен к микру по i2c. Функция чтения нескольких байт по i2c взятая из примеров работы с библиотекой i2c с сайта st при чтении выдает совершенно произвольные значения. Помогите поправить эту функцию чтобы она корректно считала значение из двухбайтного регистра температуры. Код функции:
Код:
/**
* @brief I2C_ReadNBytesFromAddr
* @param pointer for data emplacement, nb of bytes to read, address read start, slae address when read, slave address for write
* @retval 0 OK - 0xFF KO
*/
char I2C_ReadNBytesFromAddr(unsigned char *dat, unsigned char nbytes, unsigned char addr, unsigned char slaveRead, unsigned char slaveWrite){
unsigned char L_nbRead = 0;
g_Timeout = LONG_TIMEOUT;
I2Cx->CR2 = (uint32_t)(slaveWrite) | (uint32_t)(1 << 16) | I2C_CR2_START ;
/* Wait until TXIS flag is set */
while (!(I2Cx->ISR & I2C_ISR_TXIS))
{
if((g_Timeout--) == 0)
return(0xFF);
}
/* Send memory address */
I2Cx->TXDR = (uint8_t)(addr);
g_Timeout = LONG_TIMEOUT;
while (!(I2Cx->ISR & I2C_ISR_TC))
{
if((g_Timeout--) == 0)
return(0xFF);
}
I2Cx->CR2 = (uint32_t)(slaveRead) | (uint32_t)(nbytes << 16) | I2C_CR2_AUTOEND | I2C_CR2_RD_WRN | I2C_CR2_START;
//I2C_AcknowledgeConfig(I2Cx, ENABLE);
while (L_nbRead != nbytes)
{
g_Timeout = LONG_TIMEOUT;
while (!(I2Cx->ISR & I2C_ISR_RXNE))
{
if((g_Timeout--) == 0)
return(0xFF);
}
/* Read data from RXDR */
*dat++= (uint8_t)I2Cx->RXDR;
L_nbRead++;
}
g_Timeout = LONG_TIMEOUT;
//I2C_AcknowledgeConfig(I2Cx, DISABLE);
while (!(I2Cx->ISR & I2C_ISR_STOPF)) // Wait for stopf flag
{
if((g_Timeout--) == 0)
return 0xFF;
}
I2Cx->ICR = I2C_ICR_STOPCF; // Clear STOPF flag
return(L_nbRead);
}