Важная информация

User Tag List

Показано с 1 по 1 из 1

Тема: stm32f0 и adt7410

  1. #1
    Activist Аватар для 13joe
    Регистрация
    14.04.2008
    Адрес
    Новомосковск
    Сообщений
    405
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    0
    Поблагодарили
    0 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию stm32f0 и adt7410

    Помогите новичку прочитать 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);
    }
    Pentagon 1024SL 2.2 + Z-Controller + TSFM + GS + 512Kb + HxC Floppy Emulator
    Altera DE1
    Altera DE2
    Апогей БК-01Ц + Rom-Disk 512kb by Vinxru

  2. #1
    С любовью к вам, Yandex.Direct
    Размещение рекламы на форуме способствует его дальнейшему развитию

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •