Перейти к содержанию
    

...Лучше бы помогли ценным советом чем базар разводить...

Ну прям сердце разрывается... Итак:

1. ST-шный I2C работает. Проверено на разных STM32 и STM8.

2. ST-шный I2C производит впечатление недоделанного курсового. Причина ворчания (одна из) - удивительные упражнения с ACK-ом и STOP-ом в конце приема.

3. ST-шные примеры малополезны по причинам:

а) используют весьма нелюбимую мной либу

б) не облегчают понимание

в) абсолютно не гарантируют отсутствие (или уменьшение) проблем при попытке их адаптации под свои нужды

Теперь советы (естественно только ценные):

1. Детально разобраться с регистрами (по мануалу, на всякие AN-ы не заморачиваться), после чего сконфигурить порт по собственному разумению

2. Разрешить клоки на I2C (RCC->APB1ENR) и GPIO (RCC->APB2ENR). Не забыть про бит 0 в RCC->APB2ENR.

3. Начать изучать поведение пинов с команды I2C1->CR1 |= (1 << 8) (старт)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Теперь советы (естественно только ценные):
...

4. Разобраться с тактированием периферии в чипе по мануалу (aka - регистрам). RCC?

5. Разобраться с конфигурированием пинов по мануалу.

6. Разобраться с контроллером прерываний по мануалу.

 

После этого минимума в принципе более-менее уже можно приступать к реализации обмена по I2C.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

чо-чо!? только?

 

> Примеры из библиотеки работают?

post-28718-1403134004_thumb.png

А можно ссылочку на эту библиотеку. :)

 

Отвечаю сразу для Axel и jcxz на Ваши советы. :)

1) С регистрами I2C более менее разобрался, но чтоб отсеять свои сомнения передачу организовал на SPL.

2) Всё сделано как надо, в первом посте всё описано.

3) Какое б не было поведение пинов на команду I2C1->CR1 |= (1 << 8) (старт), но оно должно быть. А там глухо.

На 4,5 и 6 я уже собаку съел. Тут ошибок быть не может. Тем более об 6 пункте (прерывания) рано говорить, так как оно организовывается только по приёму. На передачу оно не надо. В данном случае хотелось чтоб при передаче хотябы ноги дрыгнулись.

Может кто уже сам лично програмировал I2C на этом проце (STM32F050F4P6 корпус TSSOP20).

Организовывал I2C на 105 и 407 процах проблем не было, а тут засада какая-то. Такое впечатление что он есть только в даташите на проц, а в реалии его нет.

Изменено пользователем glags

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Та ну, нету....

 

А в ДШ есть - вложение.

А вот запросто может быть, что он просто получился кривым и глюкавым, что о нём поспешили забыть и заменить его на те же F031 или на F051 ..

post-7980-1403165808_thumb.png

stm32f050.pdf

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А вот запросто может быть, что он просто получился кривым и глюкавым, что о нём поспешили забыть и заменить его на те же F031 или на F051 ..

Проц, как проц.

Просто, сейчас его называют по-другому.

Новость уже обсуждали тут (http://www.compel.ru/2014/05/29/pereimenovanie-mikrokontrollerov-stm32f0-i-stm32f3/).

Обычно кривость наблюдается у программиста, "особенности" чипа описаны в специальном документе.

Сомнительно, что такой явный и повторяемый баг туда не попал.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1) С регистрами I2C более менее разобрался, но чтоб отсеять свои сомнения передачу организовал на SPL.

Сомнительный путь для отсева сомнений (ИМХО)... А регистры в отладчике просматривали?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

а че такое SPL, простите?

 

да я бы проверил все флаги, наверняка там для прерываний куча флагов ставиться во время работы i2C, хоть поглядеть они стараются? А может еще ноги снаружи пошевелить, вдруг вы не мастером сделали?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

не допер дописать STM32 SPL, а по SPL такое выдает.... я догадывался что это библиотека, просто хотел быть уверен)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

а че такое SPL, простите?

 

да я бы проверил все флаги, наверняка там для прерываний куча флагов ставиться во время работы i2C, хоть поглядеть они стараются? А может еще ноги снаружи пошевелить, вдруг вы не мастером сделали?

Да вы правы, уже добавил I2C1->CR1|=I2C_CR1_SMBHEN | I2C_CR1_PE; //включить I2C

Огромное спасибо, минут через 30 проверю.

 

Кстати заметил одну особенность у этого проца. У меня на нём настроен SPI и к нему подключен єкран. от нокии 3310. Я отключил I2C и на его место включил USART. Запустил и случилось чудо - SPI загнулся, а USART работает. Принимает и передаёт данные, подключил к компу через переходник usb-usart. Написал програмулину которая принимает от порта данные и обратно выдаёт то что приняло. В терменале всё чётко, для надёжности проверки обратно в терминал выдавал то что принял +1.

Так вот к чему я веду. Может этот проц может работать только с одним аппаратным интерфейсом? Но в эррате и даташите я ничего про это не нашёл. Шас попробую SPI отключить и проверить.

 

Изменил инициализацию добавив CR1|=I2C_CR1_SMBHEN;

RCC->APB1ENR = RCC_APB1ENR_PWREN | RCC_APB1ENR_I2C1EN;
RCC->APB2ENR = RCC_APB2ENR_SYSCFGEN;
RCC->AHBENR = RCC_AHBENR_GPIOAEN;

GPIOA->MODER |= GPIO_MODER_MODER9_1 | GPIO_MODER_MODER10_1;
GPIOA->AFR[1] |= 0x00000440;//I2C - 4
GPIOA->OTYPER |= GPIO_OTYPER_OT_9 | GPIO_OTYPER_OT_10;

    I2C1->CR1|=I2C_CR1_PE;          //включить I2C
    I2C1->CR1&=~I2C_CR1_PE;         //выключить I2C
    while(I2C1->CR1&I2C_CR1_PE);    //ждём пока выключится I2C
    //I2C1->TIMINGR|=(PRESC << 28)|(SCLL<<0)|(SCLH<<8)|(SCLDEL<<20)|(SDADEL<<16);
    //PRESC=11, SCLL=199, SCLH=195, SCLDEL=4, SDADEL=2 это для 10кГц
    //PRESC=11, SCLL=19, SCLH=15, SCLDEL=4, SDADEL=2 это для 100кГц
    //PRESC=5, SCLL=9, SCLH=3, SCLDEL=3, SDADEL=3 это для 400кГц
    //PRESC=5, SCLL=3, SCLH=1, SCLDEL=1, SDADEL=0 это для 1000кГц
    I2C1->TIMINGR|=(11 << 28)|(199<<0)|(195<<8)|(4<<20)|(2<<16); //конфигурируем тайминги
    I2C1->CR1|=I2C_CR1_SMBHEN | I2C_CR1_PE;          //включить I2C
    I2C1->CR2 =  I2C_CR2_AUTOEND | (1<<16) | I2C_CR2_RD_WRN | (0x90<<1);

 

И случилось не вероятное передача заработала, но приём пока нет. Огромаднейшее СПАСИБО Golikov A.. Теперь щас повоюю с приёмом, может с адресом слейва намутил. :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

На 4,5 и 6 я уже собаку съел. Тут ошибок быть не может.
Ну-ну. И после этого вы пишете

 

GPIOA->MODER |= GPIO_MODER_MODER9_1 | GPIO_MODER_MODER10_1;
...
GPIOA->OTYPER |= GPIO_OTYPER_OT_9 | GPIO_OTYPER_OT_10;

Рекомендую съесть еще одну собаку. В этом коде поведение может быть каким угодно и очень часто совсем не таким, какого вы ожидали. Не удивительно, что у вас

Запустил и случилось чудо - SPI загнулся, а USART работает

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ну-ну. И после этого вы пишете

 

Рекомендую съесть еще одну собаку. В этом коде поведение может быть каким угодно и очень часто совсем не таким, какого вы ожидали. Не удивительно, что у вас

Вы имеете "логическое ИЛИ" ?. Так я это делаю чтоб SWD порт не потерять. В отладчике на регистры смотрел, то там всё ОК.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Так вроде I2C_CR1_SMBHEN (3-й бит в CR1) здесь не при делах (если Вы действительно говорите про I2C, а не про SMBUS). Рекомендация по поводу собаки видится по-прежнему актуальной...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Так вроде I2C_CR1_SMBHEN (3-й бит в CR1) здесь не при делах (если Вы действительно говорите про I2C, а не про SMBUS). Рекомендация по поводу собаки видится по-прежнему актуальной...

Bit 21 SMBDEN: SMBus Device Default address enable

0: Device default address disabled. Address 0b1100001x is NACKed.

1: Device default address enabled. Address 0b1100001x is ACKed.

Вы какой мануал смотрите :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...