Кто любит RISC в жизни, заходим, не стесняемся.
Ответить

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

Ср окт 18, 2017 17:02:03

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

есть проект в 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 вижу обмен
при аппаратном вообще тишина

возможно я что-то забыл при инициализации ?

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

Ср окт 18, 2017 20:20:35

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

Вот тут рабочий код для STM103C8T6 и I2C датчика AP3216C:
http://cvs.aiq.ru/ap3216/i2c.html

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

Пт окт 20, 2017 08:57:47

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

попробовал полностью как в рабочем коде i2c1 на порту GPIO_Pin_6 | GPIO_Pin_7 тактирование 2мгц
в этом случае всегда стоит флаг занятости шины т.е. дальше
Код:
while(I2C_GetFlagStatus(I2Cx, I2C_FLAG_BUSY));
дело не идет

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

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

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

без батарейки кстати ситуация точно такая-же

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

Сб окт 21, 2017 16:22:58

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

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

Вс окт 22, 2017 13:47:10

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

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

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


чтоб не открывать новую тему:
а с аппаратным SPI та-же засада ?

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

Вс окт 22, 2017 22:52:20

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

Аппаратный I2C 400 кГц с датчиком AP3216C у меня работает без сбоев.
Вот тут проект для Кейл целиком:
http://cvs.aiq.ru/ap3216/ap3216.html

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

Пн окт 23, 2017 08:05:45


Вы полностью читали, с камментами?
Так что советую оставить софтовый, с ним обычно все работает.


Такие "советы" надо множить на нуль...

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

Пн окт 23, 2017 17:18:18

Вы полностью читали, с камментами?

Естественно. В камментах обычно самое интересное. Однако там так никто и не привел того, как правильно делать и причин, почему не работает. А так то у нас все крутые.
dosikus писал(а):Такие "советы" надо множить на нуль...

Да ради бога.

Fusion писал(а):Аппаратный I2C 400 кГц с датчиком AP3216C у меня работает без сбоев.

У меня тоже работало без сбоев. Пока просто не отключишь физически провод и не подключишь обратно. Сколько там таких сюрпризов написано в errata. Вроде объем errata по i2c в STM32F1XX пока не превышает объем описания самого i2c в даташите. :))

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

Чт окт 26, 2017 18:07:00

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