Страница 1 из 1
STM32F100 протокол I2C
Добавлено: Пт апр 05, 2013 00:23:23
sx386
Хочу подключить дисплей к STM32F100
Он подключается по протоколу I2C
Но немогу найти модуль протокола I2C для STM32F100 для IAR
Если кто использовал этот протокол на STM32, скиньте пример, если не жалко.
Re: STM32F100 протокол I2C
Добавлено: Пт апр 05, 2013 10:34:51
Vov123
А что в Keil или в CooCox как-то по другому?
И второе - к avr,допустим, подключить сможете?
Re: STM32F100 протокол I2C
Добавлено: Пт апр 05, 2013 10:51:20
sx386
Vov123 писал(а):А что в Keil или в CooCox как-то по другому?
Незнаю.
Vov123 писал(а):И второе - к avr,допустим, подключить сможете?
Не работал с этим протоколом в avr.
Re: STM32F100 протокол I2C
Добавлено: Пт апр 05, 2013 11:19:34
SubDia
Вот на этой странице есть пример подключения устройства (камеры) к STM32F100 по I2C (ищите мое сообщение с приложениями; сам пример - в архиве "Siemens_camera_STM32F100C4T6B.rar"). Не забудьте изучить спецификацию протокола, а также документацию на дисплей. Иначе Вы и с примером не разберетесь, тем более там свои нюансы.
Re: STM32F100 протокол I2C
Добавлено: Вс дек 15, 2013 14:21:39
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, чем это грозит? Модуль работает вроде одинаково при любых значениях.
Re: STM32F100 протокол I2C
Добавлено: Вс дек 15, 2013 18:16:36
dosikus
amv2000 читай здесь
http://we.easyelectronics.ru/STM32/stm3 ... tenko.html
Собственно в 100х, 103х достаточно глючный i2c, но с памятью , TEA5767 работал.
Новый лучше ...
Re: STM32F100 протокол I2C
Добавлено: Вс дек 15, 2013 19:29:27
amv2000
Да спасибо, но я там уже бывал. На свои вопросы ответов там не нашел,
После сброса микроконтроллера значение обоих делителей равно одному, а в качестве системной тактовой частоты используется внутренний MSI генератор, с частотой по умолчанию 2,097 МГц. Поэтому я выбрал режим “стандартной” скорости обмена (Standard Speed (up to 100 kHz)).
Каким образом выбирается стандартный режим у автора я не вижу? У меня это I2C1->CCR |= (I2C_CCR_FS | I2C_CCR_DUTY); или I2C1->CCR |= (1<<15)|(1<<14); или установкой делителя выбирается нужный режим?
По второму вопросу
он пишет
Как я понял данный параметр задает момент времени по которому производятся выборка состояния линий.
Просто создается впечатление, что везде стандартный пример, который до конца не понимает никто. Соответственно включая и меня.
Re: STM32F100 протокол I2C
Добавлено: Пн дек 16, 2013 08:49:55
dosikus
amv2000 писал(а):Просто создается впечатление, что везде стандартный пример, который до конца не понимает никто. Соответственно включая и меня.
Такая же фигня , при работе со старым модулем многое не понятно. При изучение нового - приходят смутные ощущения что TRIS'ы это длительность и фронтов/спадов и самого импульса, хотя могу и врать.
Вообщем модуль сырой . С новым намного проще , в частности есть тулза помогающая по первости разобраться с таймингами ...
Re: STM32F100 протокол I2C
Добавлено: Пн дек 16, 2013 11:53:08
amv2000
dosikus писал(а):С новым намного проще
А новые это которые STM32F105-107 или STM32F4..?
Re: STM32F100 протокол I2C
Добавлено: Пн дек 16, 2013 12:15:00
dosikus
amv2000, пока скажу за F0 .
У F3 и F4 вроде так же , но врать не буду - не ковырял пока в них I2C .