Easyelectronics.ru

Электроника для всех
Текущее время: 20 июн 2018, 20:08

Часовой пояс: UTC + 5 часов



    • JLCPCB - Платы прототипов всего за 2$ c бесплатной доставкой (при первом заказе)
    • 10 PCBs за $2 для 2 слоев, $15 для 4 слойной, $74 для 6 слойной платы.
    • Крупнейший китайский производитель прототипных плат. 290000+ клиентов & 8000+ заказов в день!
    • LCSC - Крупнейший китайский онлайн магазин радиодеталей.

Начать новую тему Ответить на тему  [ Сообщений: 4 ] 
Автор Сообщение
 Заголовок сообщения: Приёмник на RTC6218 (i2c) и stm32f103
СообщениеДобавлено: 30 май 2018, 21:46 
Здравствуйте!

Зарегистрирован: 30 май 2018, 19:48
Сообщения: 2
Здравствуйте!
Задался целью собрать свой первый приёмник УКВ и FM диапазона,
попался модуль на RTC6218 она же RL508 у неё как раз такие диапазоны имеются.
Настраивал stm32f103c8t6 на i2c так:

Код:
////для I2C2 ///////////////////////////////////////////////////////////////////////////////////////
   RCC->APB1ENR|=RCC_APB1ENR_I2C2EN; // enable clock for I2C2
   //SCL pin
   GPIOB->CRH|=GPIO_CRH_CNF10; // alternate function open drain
   GPIOB->CRH|=GPIO_CRH_MODE10; // max speed 50MHz
   //SDA pin
   GPIOB->CRH|=GPIO_CRH_CNF11; // alternate function open drain
   GPIOB->CRH|=GPIO_CRH_MODE11; // max speed 50MHz

   I2C2->CR2  |= 36;   //APB1 = 36MHz
   I2C2->CCR  |= 0x2D; // CCR=I2C_freq_clock/(2*I2C_freq_speed) = 36000000/(2*400000) - just for stomdart MODE (not fast) {see Ref.M. p.752}
   I2C2->TRISE|= 37; // rise_time = 1000ns, T_pclk1=28ns (1/36000000) => TRISE=rise_time/T_pclk1 {see Ref.M. p.753}
   I2C2->CR1  |= I2C_CR1_PE;// peripheral enable
   ////////////////////////////////////////////////////////////////////////////////////////////////////

int main(void)
{
   ConfigInit();
   
   while(1)
   {
      u8 read_data=0;
      u8 k_1=30;

      I2C2->CR1 |= I2C_CR1_START;       // send START bit
      while (!(I2C2->SR1 & I2C_SR1_SB)) {};  // wait for START condition (SB=1)
      I2C2->CR1|=I2C_CR1_ACK;//с этим начинает читать ID микросхемы без ACK только единицы
         
      I2C2->DR = 0xC9;         // slave address -> DR      (LSB=0) на чтение по документации
      while (!(I2C2->SR1 & I2C_SR1_ADDR)) {};  // wait for ADDRESS sent    (ADDR=1)
      (void) I2C2->SR2;    // read status to clear flag
      while (!(I2C2->SR1 & I2C_SR1_RXNE)) {};  // wait for ByteReceived    (RxNE=1)
         
         while(k_1--)
         {   
                read_data = I2C2->DR;
           while (!(I2C2->SR1 & I2C_SR1_RXNE)){};
           USART1->DR = read_data;//тут сразу отправляю по юарту что бы посмотреть
                     while(!(USART1->SR & USART_SR_TC)){}
           Delay1(720000);   
         }
      I2C2->CR1 |= I2C_CR1_STOP;       // send STOP bit   
   }      
}

Запустил мониторинг com порта, вижу
1.0xFF
2.0xFF
......
22.0xFF
23.0x16
24.0x16
25.0x88
26.0x88
27.0x14
28.0x14
29.0xC0
30.0xC0
почему по 2 раза, почему первые байты FF, ладно допустим мы считываем и по адресу read и по write в бесконечном цикле, счётчик сдвигает автоматически, значит я считал всё что было в памяти , и в конце очень правильные цифры это DEVICEID и CHIPID, почему в конце тоже не понятно. Но почему 0xFF почти вся память , по Default из документации должны быть скорее нули, явно что-то тут не чисто. И это я думаю лишнее I2C2->CR1|=I2C_CR1_ACK но почему-то без него не читает ID а читает только FF.
Про записать я вообще молчу, пробовал но при чтении ничего не поменялось.
Может её надо инициализировать?
Подскажите как правильно включать такого типа приёмники?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Приёмник на RTC6218 (i2c) и stm32f103
СообщениеДобавлено: 30 май 2018, 22:38 
Заглядывает иногда

Зарегистрирован: 13 янв 2018, 21:36
Сообщения: 146
1. Не надо на IO для I2C 50 МГц ставить, тем более для OD режима.
2. Инициализация I2C
Код:
#define I2C_CCR_CCR(value)                  ((I2C_CCR_CCR_Msk & ((value) << I2C_CCR_CCR_Pos)))
#define I2C_CR2_FREQ(value)                 ((I2C_CR2_FREQ_Msk & ((value) << I2C_CR2_FREQ_Pos)))

  I2C1->CR1 = I2C_CR1_SWRST;
  I2C1->CR1 = 0;
  I2C1->CCR = I2C_CCR_CCR(45);    // F = PCLK1/CCR/2
  I2C1->CR2 = I2C_CR2_FREQ(36);   // Значение PCLK1 [МГц]
  I2C1->TRISE = 9;
  I2C1->CR1 = I2C_CR1_PE;

3. Чтение как-то так должно заработать.
Код:
bool ReadData(uint8_t *data, uint8_t length)
{
  I2C1->CR1 = I2C_CR1_PE | I2C_CR1_START | I2C_CR1_ACK;
  while(!(pI2C->SR1 & I2C_SR1_SB));
  I2C1->DR = 0xC9;
  while(!(I2C1->SR1 & I2C_SR1_ADDR))
  {
    if(I2C1->SR1 & I2C_SR1_AF)
    {
      I2C1->CR1 = I2C_CR1_PE | I2C_CR1_STOP;
      return false;
    }
  };
  I2C1->SR2;
  while(length)
  {
    length--;
    while(!(I2C1->SR1 & I2C_SR1_RXNE));
    *data++ = I2C1->DR;
  }
  I2C1->CR1 = I2C_CR1_PE | I2C_CR1_STOP;
  while(!(I2C1->SR1 & I2C_SR1_RXNE));
  *data = I2C1->DR;
 
  return true;
}


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Приёмник на RTC6218 (i2c) и stm32f103
СообщениеДобавлено: 07 июн 2018, 02:54 
Здравствуйте!

Зарегистрирован: 30 май 2018, 19:48
Сообщения: 2
VladislavS писал(а):
1. Не надо на IO для I2C 50 МГц ставить, тем более для OD режима.

согласен, так как начинает прыгать вся шина из за резких переключений, получается эффект дребезга.
Настроил так:
Код:
//SCL pin
GPIOB->CRH|=GPIO_CRH_CNF10; // alternate function open drain
GPIOB->CRH|=GPIO_CRH_MODE10_1; // max speed 2MHz
//SDA pin
GPIOB->CRH|=GPIO_CRH_CNF11; // alternate function open drain
GPIOB->CRH|=GPIO_CRH_MODE11_1; // max speed 2MHz

VladislavS писал(а):
2. Инициализация I2C

пробовал так но SCL получается 380кГц(возможно добавилось время фронтов), решил настроить на 100кГц
Код:
   //I2C2->CR2  |= 36;   //APB1 = 36MHz можно не настраивать
   I2C2->CCR  |= 0xB4; // CCR=I2C_freq_clock/(2*I2C_freq_speed) = 36000000/(2*100000) - just for stomdart MODE (not fast) {see Ref.M. p.752}
   I2C2->TRISE|= 37; // rise_time = 1000ns, T_pclk1=28ns (1/36000000) => TRISE=rise_time/T_pclk1 {see Ref.M. p.753} настройка таймингов фронтов, если не настраивать то максимально медленные фронты
   I2C2->CR1  |= I2C_CR1_PE;// peripheral enable

А вот это как понимать
Код:
  while(!(I2C1->SR1 & I2C_SR1_ADDR))//передали адрес ждём ACK-а, ACK-а может и не быт пока Slave занят
  {
    if(I2C1->SR1 & I2C_SR1_AF)
    {
      I2C1->CR1 = I2C_CR1_PE | I2C_CR1_STOP;
      return false;
    }
  };

Если устройство ответит на адрес ACK'ом, то в регистре SR1 появится флаг ADDR. Если нет, то флаг AF (Acknowledge failure), то есть I2C_SR1_AF когда мастер не дождавшись ACK перестаёт тактировать.
В какой момент надо ждать I2C1->SR1 & I2C_SR1_BTF ?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Приёмник на RTC6218 (i2c) и stm32f103
СообщениеДобавлено: 07 июн 2018, 03:18 
Старожил
Аватара пользователя

Зарегистрирован: 18 май 2013, 20:43
Сообщения: 3367
Откуда: Кемеровская область, Киселевск
Microcoder писал(а):
VladislavS писал(а):
1. Не надо на IO для I2C 50 МГц ставить, тем более для OD режима.

согласен, так как начинает прыгать вся шина из за резких переключений, получается эффект дребезга.
В какой момент надо ждать I2C1->SR1 & I2C_SR1_BTF ?


А так там скорость зависит от напряжения питания и емкости нагрузки.
Вложение:
Screenshot_16.jpg
Screenshot_16.jpg [ 213.48 Кб | Просмотров: 335 ]

Чем больше частота переключения тем больше потребление. табличка тоже есть

у чипов более старших у которых есть SYSCFG (Compensation cell control register (SYSCFG_CMPCR)), есть компенсация I/O на высоких скоростях по умолчанию не используется.

I/O compensation cell
By default the I/O compensation cell is not used. However when the I/O output buffer speed
is configured in 50 MHz or 100 MHz mode, itis recommended to use the compensation cell
for slew rate control on I/O tf(IO)out)/tr(IO)out
commutation to reduce the I/O noise on power supply.
When the compensation cell is enabled, a READY flag is set to indicate that the
compensation cell is ready and can be used. The I/O compensation cell can be used only
when the supply voltage ranges from 2.4 to 3.6 V.

_________________
RADIOWOLF.RU


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 4 ] 

Часовой пояс: UTC + 5 часов


Кто сейчас на конференции

Сейчас этот форум просматривают: Eddy_Em, goreprogrammist, mChel


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

Найти:
Перейти:  

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB