Easyelectronics.ru • Просмотр темы - Приёмник на RTC6218 (i2c) и stm32f103

Easyelectronics.ru

Электроника для всех
Текущее время: 15 авг 2018, 05:58

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



    • JLCPCB - Прототипы 10 PCBs всего за 2$ (100*100mm, 2-layer)
    • Как мы делаем платы, смотрите на YouTube
    • Крупнейшая китайская фабрика прототипов. 300000+ заказчиков и 10000+ заказов в день!
    • 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
Сообщения: 302
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
Сообщения: 3480
Откуда: Кемеровская область, Киселевск
Microcoder писал(а):
VladislavS писал(а):
1. Не надо на IO для I2C 50 МГц ставить, тем более для OD режима.

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


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

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

у чипов более старших у которых есть 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 часов


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

Сейчас этот форум просматривают: нет зарегистрированных пользователей


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

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

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