Он подключается по протоколу I2C
Но немогу найти модуль протокола I2C для STM32F100 для IAR
Если кто использовал этот протокол на STM32, скиньте пример, если не жалко.
Незнаю.Vov123 писал(а):А что в Keil или в CooCox как-то по другому?
Не работал с этим протоколом в avr.Vov123 писал(а):И второе - к avr,допустим, подключить сможете?

Код: Выделить всё
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;
}Каким образом выбирается стандартный режим у автора я не вижу? У меня это I2C1->CCR |= (I2C_CCR_FS | I2C_CCR_DUTY); или I2C1->CCR |= (1<<15)|(1<<14); или установкой делителя выбирается нужный режим?После сброса микроконтроллера значение обоих делителей равно одному, а в качестве системной тактовой частоты используется внутренний MSI генератор, с частотой по умолчанию 2,097 МГц. Поэтому я выбрал режим “стандартной” скорости обмена (Standard Speed (up to 100 kHz)).
Код: Выделить всё
I2C1->TRISE = 3;Просто создается впечатление, что везде стандартный пример, который до конца не понимает никто. Соответственно включая и меня.Как я понял данный параметр задает момент времени по которому производятся выборка состояния линий.
Такая же фигня , при работе со старым модулем многое не понятно. При изучение нового - приходят смутные ощущения что TRIS'ы это длительность и фронтов/спадов и самого импульса, хотя могу и врать.amv2000 писал(а):Просто создается впечатление, что везде стандартный пример, который до конца не понимает никто. Соответственно включая и меня.
А новые это которые STM32F105-107 или STM32F4..?dosikus писал(а):С новым намного проще