реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> STM32L151 I2C, Не выставляет бит ADDR
MiklPolikov
сообщение Oct 8 2014, 16:25
Сообщение #1


Гуру
******

Группа: Свой
Сообщений: 2 015
Регистрация: 23-01-07
Из: Москва
Пользователь №: 24 702



Коллеги,
помогите разобраться с 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;
    
}

Эскизы прикрепленных изображений
Прикрепленное изображение
 


--------------------
Если у Вас нет практического опыта в данной теме- не вступайте в дискуссию и не пишите никаких теоретических рассуждений! Заранее спасибо !
Go to the top of the page
 
+Quote Post
nx6310
сообщение Oct 9 2014, 04:04
Сообщение #2


Участник
*

Группа: Участник
Сообщений: 72
Регистрация: 28-06-10
Пользователь №: 58 174



Вот рабочий пример связи с АЦП
Код
    /* 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
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 23rd July 2025 - 03:15
Рейтинг@Mail.ru


Страница сгенерированна за 0.01988 секунд с 7
ELECTRONIX ©2004-2016