STM32F103C8T6 и модуль DS1307 по аппаратному I2C

Кто любит RISC в жизни, заходим, не стесняемся.
Ответить
Denis82
Встал на лапы
Сообщения: 136
Зарегистрирован: Вс авг 23, 2015 08:14:05

STM32F103C8T6 и модуль DS1307 по аппаратному I2C

Сообщение Denis82 »

Доброго времени суток коты !

есть проект в CooCox CoIDE Version: 1.7.8
есть STM32F103C8T6
использую библиотеку из CooCox stm32f10x_i2c.h

столкнулся с проблемой, модуль DS1307 не отвечает (или не правильно отвечает) на команду START

инициализирую I2C так

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

	GPIO_InitTypeDef gpio;
	I2C_InitTypeDef i2c;

	RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1, ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);

	/* Configure I2C_EE pins: SCL and SDA */
	gpio.GPIO_Pin =  GPIO_Pin_8 | GPIO_Pin_9;
	gpio.GPIO_Speed = GPIO_Speed_50MHz;
	gpio.GPIO_Mode = GPIO_Mode_AF_OD;
	GPIO_Init(GPIOB, &gpio);

	/* I2C configuration */
	i2c.I2C_Mode = I2C_Mode_I2C;
	i2c.I2C_DutyCycle = I2C_DutyCycle_2;
	i2c.I2C_OwnAddress1 = 0;
	i2c.I2C_Ack = I2C_Ack_Enable;
	i2c.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;
	i2c.I2C_ClockSpeed = 100000;

	/* Apply I2C configuration after enabling it */
	I2C_Init(I2C1, &i2c);

	/* I2C Peripheral Enable */
	I2C_Cmd(I2C1, ENABLE);
далее функция установки состояния СТАРТ и отсылки адреса (найдено на просторах интернета)

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

	// На всякий случай ждем, пока шина освободится
    while(I2C_GetFlagStatus(I2C1, I2C_FLAG_BUSY));

    // Генерируем старт - тут все понятно )
    I2C_GenerateSTART(I2C1, ENABLE);
    // Ждем пока взлетит нужный флаг
    while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT));

    // Посылаем адрес подчиненному
    I2C_Send7bitAddress(I2C1, slaveAddress, transmissionDirection);
    while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));

    // А теперь у нас два варианта развития событий - в зависимости от выбранного направления обмена данными
    if(transmissionDirection == I2C_Direction_Transmitter)
    {
    	while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));
    }

    if(transmissionDirection == I2C_Direction_Receiver)
    {
	while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED));
    }
так вот, после формирования СТАРТ I2C_GenerateSTART(I2C1, ENABLE);
функция I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT) возвращает ERROR

при этом модуль прекрасно работает на софтовом I2C настроенном на эти-же ножки порта (GPIO_Pin_8 | GPIO_Pin_9)

подскажите, куда копать ?

Добавлено after 4 hours 6 minutes 11 seconds:
хм ...
сейчас ткнулся осциллографом на шину i2c и при программном i2c вижу обмен
при аппаратном вообще тишина

возможно я что-то забыл при инициализации ?
Реклама
Аватара пользователя
Fusion
Грызет канифоль
Сообщения: 272
Зарегистрирован: Пт ноя 13, 2009 10:39:32
Откуда: Москва
Контактная информация:

Re: STM32F103C8T6 и модуль DS1307 по аппаратному I2C

Сообщение Fusion »

Еще надо AFIO включить:
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);

Вот тут рабочий код для STM103C8T6 и I2C датчика AP3216C:
http://cvs.aiq.ru/ap3216/i2c.html
Реклама
Denis82
Встал на лапы
Сообщения: 136
Зарегистрирован: Вс авг 23, 2015 08:14:05

Re: STM32F103C8T6 и модуль DS1307 по аппаратному I2C

Сообщение Denis82 »

попробовал, результат тот-же
ERROR в I2C_CheckEvent после I2C_GenerateSTART

попробовал полностью как в рабочем коде i2c1 на порту GPIO_Pin_6 | GPIO_Pin_7 тактирование 2мгц
в этом случае всегда стоит флаг занятости шины т.е. дальше

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

while(I2C_GetFlagStatus(I2Cx, I2C_FLAG_BUSY));
дело не идет

осциллографом смогу тыкнуться только вечером

может дело ещё и в модуле ?
схема
Изображение

в модуле должен стоять аккумулятор, я временно поставил батарейку, не думаю что это как-то может повлиять на i2c но вдруг ...

без батарейки кстати ситуация точно такая-же
rrshaman
Родился
Сообщения: 10
Зарегистрирован: Сб апр 27, 2013 20:15:08

Re: STM32F103C8T6 и модуль DS1307 по аппаратному I2C

Сообщение rrshaman »

Вам стоит заглянуть сюда
http://www.st.com/content/ccc/resource/ ... 211391.pdf
что бы у вас отбило охоту пользовать в STM23F1XX аппаратный I2C. Я в свое время повозился с ним и работать заставил, но до какой либо неполадки. После любого сбоя оно поднималось только после сброса контроллера.
Вот еще тема
http://we.easyelectronics.ru/steel_ne/s ... otona.html
Так что советую оставить софтовый, с ним обычно все работает.
Реклама
Эиком - электронные компоненты и радиодетали
Denis82
Встал на лапы
Сообщения: 136
Зарегистрирован: Вс авг 23, 2015 08:14:05

Re: STM32F103C8T6 и модуль DS1307 по аппаратному I2C

Сообщение Denis82 »

спасибо за информацию !

пробовал на выходных по разному, грешил на емкость монтажа, фазы луны, настроение домочадцев :) но так и не смог добиться стабильной работы аппаратного i2c, а софтовый при всех экспериментах работал на ура

потому видимо его, софтовый i2c, и оставлю


чтоб не открывать новую тему:
а с аппаратным SPI та-же засада ?
Реклама
Аватара пользователя
Fusion
Грызет канифоль
Сообщения: 272
Зарегистрирован: Пт ноя 13, 2009 10:39:32
Откуда: Москва
Контактная информация:

Re: STM32F103C8T6 и модуль DS1307 по аппаратному I2C

Сообщение Fusion »

Аппаратный SPI работает отлично (например с дисплейчиком 2.2 дюйма)

Аппаратный I2C 400 кГц с датчиком AP3216C у меня работает без сбоев.
Вот тут проект для Кейл целиком:
http://cvs.aiq.ru/ap3216/ap3216.html
Реклама
Аватара пользователя
dosikus
Друг Кота
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

Re: STM32F103C8T6 и модуль DS1307 по аппаратному I2C

Сообщение dosikus »

[uquote="rrshaman",url="/forum/viewtopic.php?p=3212273#p3212273"]Вот еще тема
http://we.easyelectronics.ru/steel_ne/s ... otona.html[/uquote]
Вы полностью читали, с камментами?
[uquote="rrshaman",url="/forum/viewtopic.php?p=3212273#p3212273"]Так что советую оставить софтовый, с ним обычно все работает.[/uquote]

Такие "советы" надо множить на нуль...
rrshaman
Родился
Сообщения: 10
Зарегистрирован: Сб апр 27, 2013 20:15:08

Re: STM32F103C8T6 и модуль DS1307 по аппаратному I2C

Сообщение rrshaman »

[uquote="dosikus",url="/forum/viewtopic.php?p=3213335#p3213335"]Вы полностью читали, с камментами?[/uquote]
Естественно. В камментах обычно самое интересное. Однако там так никто и не привел того, как правильно делать и причин, почему не работает. А так то у нас все крутые.
dosikus писал(а):Такие "советы" надо множить на нуль...
Да ради бога.
Fusion писал(а):Аппаратный I2C 400 кГц с датчиком AP3216C у меня работает без сбоев.
У меня тоже работало без сбоев. Пока просто не отключишь физически провод и не подключишь обратно. Сколько там таких сюрпризов написано в errata. Вроде объем errata по i2c в STM32F1XX пока не превышает объем описания самого i2c в даташите. :))
Аватара пользователя
prinv
Вымогатель припоя
Сообщения: 677
Зарегистрирован: Чт янв 20, 2011 09:07:08
Откуда: Пермь
Контактная информация:

Re: STM32F103C8T6 и модуль DS1307 по аппаратному I2C

Сообщение prinv »

STM32F103C8T6 c DS1307 по аппаратному I2С работает нормально.
Могу скинуть проект Cube+Keil с использованием HAL
Никакая контра не уйдёт от нас
Ответить

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