STM32F100 протокол I2C

Кто любит RISC в жизни, заходим, не стесняемся.
Ответить
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 394
Зарегистрирован: Сб апр 28, 2012 16:04:14

Сообщение sx386 »

Хочу подключить дисплей к STM32F100
Он подключается по протоколу I2C
Но немогу найти модуль протокола I2C для STM32F100 для IAR

Если кто использовал этот протокол на STM32, скиньте пример, если не жалко.
Критикуешь - предлагай. Предлагаешь - делай. Делаешь - отвечай.
Реклама
Опытный кот
Сообщения: 804
Зарегистрирован: Чт мар 12, 2009 16:31:05

Сообщение Vov123 »

А что в Keil или в CooCox как-то по другому?
И второе - к avr,допустим, подключить сможете?
Реклама
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 394
Зарегистрирован: Сб апр 28, 2012 16:04:14

Сообщение sx386 »

Vov123 писал(а):А что в Keil или в CooCox как-то по другому?
Незнаю.
Vov123 писал(а):И второе - к avr,допустим, подключить сможете?
Не работал с этим протоколом в avr.
Критикуешь - предлагай. Предлагаешь - делай. Делаешь - отвечай.
Держит паяльник хвостом
Аватара пользователя
Сообщения: 995
Зарегистрирован: Сб апр 02, 2011 17:59:22
Откуда: Город-герой Севастополь

Сообщение SubDia »

Вот на этой странице есть пример подключения устройства (камеры) к STM32F100 по I2C (ищите мое сообщение с приложениями; сам пример - в архиве "Siemens_camera_STM32F100C4T6B.rar"). Не забудьте изучить спецификацию протокола, а также документацию на дисплей. Иначе Вы и с примером не разберетесь, тем более там свои нюансы.
pavel_cydenov: Вобще я праAVRославный человек. Но и про ислARM слышал много хорошего )
MrYuran: Самые ортодоксальные — это PICудеи )
Katz: Не, 51-ники. )
Изображение
Реклама
Эиком - электронные компоненты и радиодетали
Опытный кот
Аватара пользователя
Сообщения: 725
Зарегистрирован: Вт апр 26, 2011 13:58:36
Откуда: Ростовская область

Сообщение amv2000 »

Подниму тему про I2C, камень STM32F100RBT6 плата Discovery32VL тактируется от кварца 8Мгц на частоте 24 Мгц. Пытаюсь по совету dosikus не использовать SPL.

Код: Выделить всё

void I2C_LowLevel_Init(void)
{ 
  /**
 * 1.Разрешаем тактирование портов и самого модуля.
 * 2.Дальше настраиваем выводы: выход Oped Drain, режим альтернативной функции. 
 *******************************************************************************
 */
  RCC->APB1ENR  |=  RCC_APB1ENR_I2C1EN;                                    /*!< Включаем тактирование i2c */ 
  RCC->APB2ENR  |=  RCC_APB2ENR_IOPBEN | RCC_APB2ENR_AFIOEN;               /*!< Включаем тактирование Порта B и задаем ему альтернативные функции */  
  INIT_SDA_SCL;                                                            /*!< Настройка выходов SDA, SCL */
  
  RCC->APB1RSTR |=  RCC_APB1RSTR_I2C1RST;                                  /*!< Сброс I2C периферии */
  RCC->APB1RSTR &= ~RCC_APB1RSTR_I2C1RST;                                  /*!< Вывести I2C1 из состояния сброса */
  
  if (I2C1->SR2&I2C_SR2_BUSY)                                              /*!< Если модуль I2C занят (висит) */
    {
      I2C1->CR1 |= I2C_CR1_SWRST;                                          /*!< делаем программный сброс */
      for (d=0; d<2; ++d){}
      I2C1->CR1 &= ~I2C_CR1_SWRST;
    }
  
  /**
 * 3.Указываем текущую частоту тактирования периферии Fpclk1 (в МГц) в регистре CR2.
 * 4.Настраиваем скорость интерфейса в регистре CCR, выбираем режим (обычный/быстрый).
 *   Tsck = CCR * 2 * Tpclk1, т.е. период SCK пропорционален CCR (для быстрого режима всё несколько хитрее, но в RM расписано).
 * 5.Настраиваем максимальное время нарастания фронта в регистре TRISE. 
 *   Для стандартного режима это время 1 мкс. В регистр записываем количество тактов шины, укладывающихся в это время, плюс один:
 *   если такт Tpclk1 длится 125 нс, то записываем (1000 нс / 125 нс) + 1 = 8 + 1 = 9.
 * 6.По желанию разрешается генерация сигналов прерывания (ошибки, состояние и данных);
 * 7.Включается модуль: флаг PE в регистре CR1 переводится в 1.
 *******************************************************************************
 */
  I2C1->CR1     &= ~I2C_CR1_PE;                                            /*!< Все конфигурации необходимо проводить только со сброшеным битом PE (модуль откл) (хотя после сброса он и так выключен) */
  I2C1->CR2     &= ~I2C_CR2_FREQ;                                          /*!< значение частоты тоже сбрасываем */
  I2C1->CR2     |=  I2C_F_PCLK1;                                           /*!< Текущее значение частоты PCLK1 ((I2C_CR2_FREQ_3 | I2C_CR2_FREQ_4)=24 МГц)) необходимо прописать в регистр (I2C_CR2) */
  I2C1->CCR     |= (I2C_CCR_FS | I2C_CCR_DUTY);                            /*!< fast режим, 400 KHz duty cycle (1<<15)|(1<<14) */
  I2C1->TRISE   |=  I2C_TRISE_TRISE;                                       /*!< Максимальное время задержки в быстром/стандартном режиме (режим Master) */
  I2C1->CR1     &= ~I2C_CR1_SMBUS;                                         /*!< выбираем стандарт I2C(SMBUS отключен) */                              
  I2C1->CR1     |= (I2C_CR1_ACK | I2C_CR1_PE);                             /*!< включаем I2C периферию (т.е. выводы) */
  while (!(I2C1->CR1&I2C_CR1_PE)){}                                        /*!< ожидаем включения */  
return;
}
Я правильно понял, что 15 битом устанавливаем быстрый режим, 14 битом устанавливаем скорость 400 Кгц и больше никаких расчетов и записи в регистр CCR не требуется?
И второе если при установки времени нарастания в регистре TRISE не писать вычисления период 1/24=42 нс, максимальное нарастание для 400 Кгц=300 нс, 300/42=7+1=8,
а просто вписать максимальное значение 0х3F, чем это грозит? Модуль работает вроде одинаково при любых значениях.
Реклама
Друг Кота
Аватара пользователя
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

Сообщение dosikus »

amv2000 читай здесь http://we.easyelectronics.ru/STM32/stm3 ... tenko.html
Собственно в 100х, 103х достаточно глючный i2c, но с памятью , TEA5767 работал.
Новый лучше ...
Реклама
Опытный кот
Аватара пользователя
Сообщения: 725
Зарегистрирован: Вт апр 26, 2011 13:58:36
Откуда: Ростовская область

Сообщение amv2000 »

Да спасибо, но я там уже бывал. На свои вопросы ответов там не нашел,
После сброса микроконтроллера значение обоих делителей равно одному, а в качестве системной тактовой частоты используется внутренний MSI генератор, с частотой по умолчанию 2,097 МГц. Поэтому я выбрал режим “стандартной” скорости обмена (Standard Speed (up to 100 kHz)).
Каким образом выбирается стандартный режим у автора я не вижу? У меня это I2C1->CCR |= (I2C_CCR_FS | I2C_CCR_DUTY); или I2C1->CCR |= (1<<15)|(1<<14); или установкой делителя выбирается нужный режим?
По второму вопросу

Код: Выделить всё

I2C1->TRISE = 3;
он пишет
Как я понял данный параметр задает момент времени по которому производятся выборка состояния линий.
Просто создается впечатление, что везде стандартный пример, который до конца не понимает никто. Соответственно включая и меня.
Друг Кота
Аватара пользователя
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

Сообщение dosikus »

amv2000 писал(а):Просто создается впечатление, что везде стандартный пример, который до конца не понимает никто. Соответственно включая и меня.
Такая же фигня , при работе со старым модулем многое не понятно. При изучение нового - приходят смутные ощущения что TRIS'ы это длительность и фронтов/спадов и самого импульса, хотя могу и врать.
Вообщем модуль сырой . С новым намного проще , в частности есть тулза помогающая по первости разобраться с таймингами ...
Опытный кот
Аватара пользователя
Сообщения: 725
Зарегистрирован: Вт апр 26, 2011 13:58:36
Откуда: Ростовская область

Сообщение amv2000 »

dosikus писал(а):С новым намного проще
А новые это которые STM32F105-107 или STM32F4..?
Друг Кота
Аватара пользователя
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

Сообщение dosikus »

amv2000, пока скажу за F0 .
У F3 и F4 вроде так же , но врать не буду - не ковырял пока в них I2C .
Ответить

Вернуться в «ARM»