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

I2C low level драйвер.

Хочу сделать драйвер для STM32L475 типа того как я работаю с другими сериями.

int I2C_Wait(I2C_TypeDef * I2Cx)
{
      unsigned int timeout = 0;
      
      while(LL_I2C_IsActiveFlag_NACK(I2Cx) == 0)
      {
          if(++timeout > I2C_TIMEOUT)
          {
              LL_I2C_ClearFlag_NACK(I2Cx);
              return -1;
          }
      } 
      
      LL_I2C_ClearFlag_NACK(I2Cx);
      
      return 0;
}
 
void I2C_Read(I2C_TypeDef * I2Cx, uint8_t slave_addr, uint8_t reg_addr, uint8_t *data)
{
  
    /*----------first step - set register address to read from-----------*/
  
    uint8_t address = slave_addr & 0xFE; 
    
    LL_I2C_SetTransferRequest(I2Cx, LL_I2C_REQUEST_WRITE);
    
    // send start signal 
    LL_I2C_GenerateStartCondition(I2Cx);
     
    //send slave
    LL_I2C_TransmitData8(I2Cx, address);
    I2C_Wait(I2Cx);
    
    //send register address
    LL_I2C_TransmitData8(I2Cx, reg_addr);
    I2C_Wait(I2Cx);
  
    LL_I2C_GenerateStopCondition(I2Cx);
    
    /*-----------second step - read from the written register address-----*/
    
     //slave address for read
    address = slave_addr | 0x01;
   
    //Repeated Start 
    LL_I2C_GenerateStartCondition(I2Cx);
    
    LL_I2C_TransmitData8(I2Cx, address);
    I2C_Wait(I2Cx);
    
    LL_I2C_SetTransferRequest(I2Cx, LL_I2C_REQUEST_READ);
    
    LL_I2C_AcknowledgeNextData(I2Cx, LL_I2C_ACK);
    
    *data = LL_I2C_ReceiveData8(I2Cx);
    
     for (delay = 0; delay < 1000; delay++)  ;  
}
 
void I2C_Write(I2C_TypeDef * I2Cx, uint8_t slave_addr, uint8_t reg_addr, uint8_t data)
{
    //for write operation R/Wn bit should be low
     uint8_t address = slave_addr & 0xFE;  
     
     LL_I2C_SetTransferRequest(I2Cx, LL_I2C_REQUEST_WRITE);
     
     // send start signal 
     LL_I2C_GenerateStartCondition(I2Cx);
     
    // send ID with W/R bit 
    LL_I2C_TransmitData8(I2Cx, address);
    I2C_Wait(I2Cx);
    
    // Write Register Address 
    LL_I2C_TransmitData8(I2Cx, reg_addr);
    I2C_Wait(I2Cx);
    
    LL_I2C_TransmitData8(I2Cx, data);
    I2C_Wait(I2Cx);
    
    LL_I2C_GenerateStopCondition(I2Cx);
    
    for (delay = 0; delay < 1000; delay++)  ;  
}

Но что то не работает. Может я ошибся в логике процесса? Кто нибудь знает I2C на низком уровне?

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


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

У NXP спецификация на "И-квадрат-Си" шину в открытом доступе дольше, чем вы на форуме...

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


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

9 часов назад, Obam сказал:

У NXP спецификация на "И-квадрат-Си" шину в открытом доступе дольше, чем вы на форуме...

Ее даже можно не открывать. Вместо этого открыть мануал на МК и по регистрам с нуля написать за пару часов офигительный драйвер.

Но Женя, видимо, считает, что словосочетание "низкоуровневый программист" это про качество работы программиста:biggrin:

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


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

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

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

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

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

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

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

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

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

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