Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: STM32L151 I2C
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
MiklPolikov
Коллеги,
помогите разобраться с I2C .

Процессор(master) должен передать данные в микросхему-аудиокодек(slave). Передача адреса WRITE_ADDRESS=0х20 заканчивается тем, что во время 9ого клока микросхема подтягивает линию SDA к 0, т.е. выдаёт правильный Acknolage, а процессор зачем-то подтягивает её к 1. Бит успешной передачи адреса ADDR не выставляется.
Вопрос : какую именно настройку I2C нужно изменить ?

Код
///////////////////////////передаём данные////////////////////////
void MAX98090_REGISTER_WRITE(unsigned char reg_address,unsigned char data)
{
      int i=0;
    
      I2C2->CR1|=I2C_CR1_START;
      while(!(I2C2->SR1 & I2C_SR1_SB))
      {
          i++;
          if(i>10000)
              return;
      }

          I2C2->SR1;
      I2C2->DR=WRITE_ADDRESS;
      while(!(I2C2->SR1 & I2C_SR1_ADDR))
      {
          i++;
          if(i>10000)
                  return; //вот отсюда программа вылетает   !!!!!!!!!!!!!!!!!!!!!!!!!!!!
          }

      I2C2->SR1;
      I2C2->SR2;
        I2C2->DR=reg_address;
        while (!(I2C2->SR1 & I2C_SR1_BTF))
    {
          i++;
            if(i>10000)
                 return;
        }
        I2C2->SR1;
        I2C2->SR2;
        I2C2->DR=data;
        while (!(I2C2->SR1 & I2C_SR1_BTF))
    {
          i++;
            if(i>10000)
                 return;
        }            
            
      I2C2->CR1 |= I2C_CR1_STOP;
            
}


Код
//////////////////////////////Настраиваем  I2C2 для MAX98090 //////////////////////////////
void MAX98090_I2C2_INIT(void)
{
           RCC->APB1ENR|=RCC_APB1ENR_I2C2EN;  // включаем тактирование I2C2
      RCC->APB1LPENR|=RCC_APB1LPENR_I2C2LPEN;

      RCC->APB1RSTR|=RCC_APB1RSTR_I2C2RST;
      RCC->APB1RSTR&=~RCC_APB1RSTR_I2C2RST; //сбрасываем настройки I2C2
    

    //Системная частота 32МГц
          I2C2->CR2&=~I2C_CR2_FREQ;
     I2C2->CR2|=I2C_CR2_FREQ_5;
         I2C2->CCR|=60;
            
        I2C2->CR1|=I2C_CR1_PE;
    
}
nx6310
Вот рабочий пример связи с АЦП
Код
    /* Initialize the I2C */
    I2C_Init(150000, 0xA0, I2C_DUTYCYCLE_16_9, I2C_ACK_CURR, I2C_ADDMODE_7BIT, 3);

    I2C->CR2 |= I2C_CR2_START;// Generate start & wait event detection
    while (!I2C_CheckEvent(I2C_EVENT_MASTER_START_SENT));
    
        I2C->DR =0x90 |I2C_DIRECTION_TX;//Send slave Address in write direction & wait detection event
    while (!I2C_CheckEvent(I2C_EVENT_MASTER_ADDRESS_ACKED));
    I2C_ClearFlag(I2C_FLAG_ADDRESSSENTMATCHED);
        
            I2C->DR =0x00; // Send Address of first byte to be read & wait event detection        
    while (!I2C_CheckEvent(I2C_EVENT_MASTER_BYTE_TRANSMITTED));
        
        
        I2C->CR2 |= I2C_CR2_STOP;//Send STOP Condition to end transmition
        
    I2C->CR2 |= I2C_CR2_START;// Generate start & wait event detection
    while (!I2C_CheckEvent(I2C_EVENT_MASTER_START_SENT));        
        
    /* Send slave Address in read direction & wait event */
    I2C->DR =0x90 |I2C_DIRECTION_RX;
    while (!I2C_CheckEvent(I2C_EVENT_MASTER_ADDRESS_ACKED));
    I2C_ClearFlag(I2C_FLAG_ADDRESSSENTMATCHED);        
        
                /* waiting for byte from slave */
        while (!I2C_CheckEvent(I2C_EVENT_MASTER_BYTE_RECEIVED));
        conf = I2C->DR;
                
                        /* waiting for byte from slave */
        while (!I2C_CheckEvent(I2C_EVENT_MASTER_BYTE_RECEIVED));
        conf_2 =I2C->DR;

I2C->CR2 |= I2C_CR2_STOP;//Send STOP Condition to end
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.