Реклама на сайте DatasheetsDatasheets

KAZUS.RUN - Электронный портал. Принципиальные схемы, Datasheets, Форум по электронике

Новости электроники Новости Литература, электронные книги Литература Документация, даташиты Документация Поиск даташитов (datasheets)Поиск PDF
  От производителей
Новости поставщиков
В мире электроники

  Сборник статей
Книги и журналы
FAQ по электронике

  Datasheets
Поиск SMD
Онлайн справочник

Принципиальные схемы Схемы Каталоги программ, сайтов Каталоги Общение, форум Общение Ваш аккаунтАккаунт
  Каталог схем
Схемы и проекты
Принципиальные схемы
  Программы
Каталог сайтов
Калькуляторы
  Форумы по электронике
Помощь проекту


 
Опции темы

не могу запустить I2C

Непрочитано 05.04.2020, 18:03  
fox327
Временная регистрация
 
Регистрация: 19.08.2010
Сообщений: 94
Сказал спасибо: 8
Сказали Спасибо 35 раз(а) в 25 сообщении(ях)
fox327 на пути к лучшему
По умолчанию не могу запустить I2C

Здравствуйте. Подскажите, ребята, кто может.
Что-то никак не получается запустить I2C на STM32F103RC.
Никакой реакции на выводах. Только короткий импульс на SCL.
Где-то ошибка, но увидеть не могу.
Да, ещё BUSY в SR2 всё время в единице.

часть программы:

GPIOB-›CRL&=0x00000000;
GPIOB-›CRL|=0xff000000; //PB6,PB7-альтернативны функция SCL,SDA, открытый сток

RCC-›APB1ENR|=RCC_APB1ENR_I2C1EN;
I2C1-›CR2|=I2C_CR2_FREQ_1; //тактовая частота 2 мГц
I2C1-›CCR|=0x0a; //5000 нс
I2C1-›TRISE=0x03; //1000 нс

//************************************************** ********************************
while(1)
{
T_msec=10;
while(T_msec!=0) //пауза 10 мс
{}

I2C1-›CR1|=I2C_CR1_PE;
I2C1-›SR1=0;
I2C1-›CR1|=I2C_CR1_START; //старт
while((I2C1-›SR1&I2C_SR1_SB)==0) //ожидание установки бита SB
{}
I2C1-›SR1; //очистка бита SB
I2C1-›DR=0xa0; //адрес ведомого 24C04
while((I2C1-›SR1&I2C_SR1_ADDR)==0)
{}
I2C1-›SR1;
I2C1-›SR2; //сброс бита ADDR
I2C1-›DR=0x01; //адрес ячейки памяти
while((I2C1-›SR1&I2C_SR1_BTF)==0)
{}
I2C1-›CR1|=I2C_CR1_START; //повторный старт
while((I2C1-›SR1&I2C_SR1_SB)==0) //ожидание установки бита SB
{}
I2C1-›SR1; //очистка бита SR1
I2C1-›DR=0xa1; //адрес ведомого, 1 в младшем бите-чтение
while((I2C1-›SR1&I2C_SR1_ADDR)==0)
{}
I2C1-›SR1;
I2C1-›SR2;
while((I2C1-›SR1&I2C_SR1_RXNE)==0)
{}
data_eeprom=I2C1-›DR;
}
}
Реклама:
fox327 вне форума  
Непрочитано 06.04.2020, 15:40  
-Alan-
Прописка
 
Аватар для -Alan-
 
Регистрация: 05.12.2008
Адрес: Россия, Омск
Сообщений: 145
Сказал спасибо: 39
Сказали Спасибо 29 раз(а) в 22 сообщении(ях)
-Alan- на пути к лучшему
По умолчанию Re: не могу запустить I2C

Добавьте подтяжки к плюсу питания резисторами на пинах PB6, PB7.
Перед запуском I2C модуля убедитесь, что линии действительно вытянулись к плюсу питания, иначе будет бесконечно висеть BUSY.

Пролистал референс. Внутреняя подтяжка работает только на вход. Open-Drain по какой-то причине не может иметь подтяжки к плюсу.

Последний раз редактировалось -Alan-; 06.04.2020 в 15:43.
-Alan- вне форума  
Непрочитано 06.04.2020, 16:09  
dgrishin
Почётный гражданин KAZUS.RUN
 
Регистрация: 12.02.2013
Адрес: На болотах
Сообщений: 1,162
Сказал спасибо: 46
Сказали Спасибо 315 раз(а) в 244 сообщении(ях)
dgrishin на пути к лучшему
По умолчанию Re: не могу запустить I2C

Сообщение от fox327 Посмотреть сообщение
Где-то ошибка, но увидеть не могу.
while(!(I2C2-›SR1 & I2C_SR1_SB)){}; // waiting setting SB flag

А вот где...
dgrishin вне форума  
Непрочитано 06.04.2020, 18:55  
fox327
Временная регистрация
 
Регистрация: 19.08.2010
Сообщений: 94
Сказал спасибо: 8
Сказали Спасибо 35 раз(а) в 25 сообщении(ях)
fox327 на пути к лучшему
По умолчанию Re: не могу запустить I2C

Подтяжка резисторами есть-10 кОм.
По поводу цикла while-прокомментируйте, пожалуйста,
а то никак не могу увидеть разницу.
Хотя причина скорее всего в этом, так как зависает именно в нём.
fox327 вне форума  
Непрочитано 06.04.2020, 19:43  
dgrishin
Почётный гражданин KAZUS.RUN
 
Регистрация: 12.02.2013
Адрес: На болотах
Сообщений: 1,162
Сказал спасибо: 46
Сказали Спасибо 315 раз(а) в 244 сообщении(ях)
dgrishin на пути к лучшему
По умолчанию Re: не могу запустить I2C

Сообщение от fox327 Посмотреть сообщение
По поводу цикла while-прокомментируйте, пожалуйста,
а то никак не могу увидеть разницу.
Да разницы с виду нет. Но мой код работает (и в инете это делается именно так), а ваш может так быть соптимизирован, что всегда истина.
Попробуйте расставить break point ы после каждого while и найдите где программа зацикливается - тогда будет совсем понятно.
dgrishin вне форума  
Непрочитано 06.04.2020, 20:21  
-Alan-
Прописка
 
Аватар для -Alan-
 
Регистрация: 05.12.2008
Адрес: Россия, Омск
Сообщений: 145
Сказал спасибо: 39
Сказали Спасибо 29 раз(а) в 22 сообщении(ях)
-Alan- на пути к лучшему
По умолчанию Re: не могу запустить I2C

В отладчике видите, что происходит и на какой именно строке останавливается код?

Кстати, можете попробовать увеличить
I2C1-›TRISE = 0x10; // Ожидание восстановления шины к единице.

У меня код чтения байта из регистра чипа (адрес подбрасывается в функцию) работает таким образом:
Код:
uint8_t I2C_Read_Byte(uint8_t DevAddr, uint16_t Address, uint8_t *Data) {
	I2C1-›CR1 |= I2C_CR1_START;
	while (!(I2C1-›SR1 & I2C_SR1_SB));
	I2C1-›DR = (DevAddr ‹‹ 1);
	while (!(I2C1-›SR1 & (I2C_SR1_ADDR | I2C_SR1_AF)));
	if (I2C1-›SR1 & I2C_SR1_AF) {
		I2C1-›SR1 = 0;
		I2C1-›CR1 |= I2C_CR1_STOP;
		while (I2C1-›SR2 & I2C_SR2_BUSY);
		return -1;
	} else {
		(void) I2C1-›SR1;
		(void) I2C1-›SR2;
		I2C1-›DR = (Address ›› 8) & 0xFF;
		while (!(I2C1-›SR1 & (I2C_SR1_TXE)));
		I2C1-›DR = (Address & 0xFF);
		while (!(I2C1-›SR1 & (I2C_SR1_TXE)));
		I2C1-›CR1 |= I2C_CR1_START;		// Restart
		while (!(I2C1-›SR1 & I2C_SR1_SB));
		I2C1-›DR = (DevAddr ‹‹ 1) + 1;		// Read
		while (!(I2C1-›SR1 & (I2C_SR1_ADDR | I2C_SR1_AF)));
		(void) I2C1-›SR1;
		(void) I2C1-›SR2;
		*Data = I2C1-›DR;
	};
	I2C1-›CR1 |= I2C_CR1_STOP;
	while (I2C1-›SR2 & I2C_SR2_BUSY);
	return 0;
};
Ну и опять же, во время инициализации:
Код:
	I2C1-›CR1 |= I2C_CR1_SWRST;
	I2C1-›CR1 &= ~I2C_CR1_SWRST;
-Alan- вне форума  
Непрочитано 06.04.2020, 20:57  
fox327
Временная регистрация
 
Регистрация: 19.08.2010
Сообщений: 94
Сказал спасибо: 8
Сказали Спасибо 35 раз(а) в 25 сообщении(ях)
fox327 на пути к лучшему
По умолчанию Re: не могу запустить I2C

Установку и сброс SWRST пробовал делать-никаких изменений.
Что касается точек останова-отладчика у меня нет. Поэтому я вставлял в тело цикла строчку GPIOC-›ODR^=GPIO_ODR_OD11.
Идут импульсы с высокой частотой, что говорит о том, что из цикла проверки бита SB программа не выходит.
Спасибо за советы, попробую проверить.
fox327 вне форума  
 
Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Муз центр, связка PT2322 и AT89c51 шина I2C E_C_C Аудиотехника 11 15.03.2017 08:34
STM32F4 discovery не срабатывают прерывания по I2C Kopranych ARM 10 29.11.2016 20:56
Контроль SDA и SCL на шине I2C pifa AVR 6 17.02.2015 01:35
Не работает I2C в ATMega128 pifa AVR 1 05.09.2014 19:45
i2c proteus глюк? caffy Proteus 3 18.02.2010 19:57


Часовой пояс GMT +4, время: 01:02.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.