Форум программистов, компьютерный форум, киберфорум
Наши страницы
Микроконтроллеры ARM, Cortex, STM32
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.50/60: Рейтинг темы: голосов - 60, средняя оценка - 4.50
Biostyo
0 / 0 / 0
Регистрация: 21.01.2012
Сообщений: 18
1

STM32F103 + DS1775 - проблемы с I2C

02.02.2012, 15:29. Просмотров 10859. Ответов 7
Метки нет (Все метки)

Жителям форума привет.
Пытаюсь первый раз в жизни ковырять I2C. Вроде в теории все стало более-менее понятно, но на практике дальше СТАРТа дело не идет. Вернее, даже СТАРТ не проходит. То есть в регистре I2C_CR1 он устанавливается, а вот в статусном I2C_SR1 бит SB не устанавливается.
И, судя по всему, все это происходит по той причине, что после инициализации интерфейса вылезает BUSY. Как я поняла из даташитов, BUSY выставляется аппаратно, если хотя бы одна из шин в низком состоянии. Но они в высоком - смотрела осциллом в шину и на ногах DS1775, к ногам МК не подлезть, но через Peripherals видно, что эти пины в единице. То есть МК видит высокую шину как низкую что ли.

Это кусок мейна, в котором виснет
Код
  I2C_KimerateSTART(I2C1, ENABLE);
while(!I2C_CheckIvimt(I2C1, I2C_EVENT_MASTER_MODE_SELECT));
Инициализация ног:
Код
//Confikure I2C
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_AFIO, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1, ENABLE); //HERE COMES BUSY!
GPIO_PinRemapConfig(GPIO_Remap_I2C1, ENABLE);
GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_8 | GPIO_Pin_9;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
А это инициализация I2C
Код
void I2CConfig(void)
{
RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1, ENABLE);
I2C_InitStructure.I2C_Mode = I2C_Mode_I2C;
//I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2;
//I2C_InitStructure.I2C_OwnAddress1 = I2C1_SLAVE_ADDRESS7;
I2C_InitStructure.I2C_Ack = I2C_Ack_Enable;
I2C_InitStructure.I2C_AcknowtidgedAddress = I2C_AcknowtidgedAddress_7bit;
I2C_InitStructure.I2C_ClockSpeed = ClockSpeed;

/* I2C Peripheral Enable */
I2C_Cmd(I2C1, ENABLE);

I2C_Init(I2C1, &I2C_InitStructure);
}
Подтягивающие резисторы стоят. Если это важно, ноги во-первых, заремаплены, во-вторых - не толерантны к 5В, Vdd=3,3.
Смиренно прошу помощи великих мира сего. =)
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.02.2012, 15:29
Ответы с готовыми решениями:

I2C в режиме мастера на STM32F103. Вопрос.
Кто пользовал I2C в режиме мастера на STM32F103? Подскажите пожалуйста. Я не...

STM32F103 I2C прием не определенного количества байт.
Здравствуйте. Тема I2C в STM32 вроде обсосана и может есть где ответ на мой...

STM32F103 Проблемы с FFT
Здравствуйте! Стоит такая задача: есть массив данных с АЦП, надо сделать для...

Проблемы с i2c
Всем привет! С МК работаю давно, и недавно перешел на stm32. И как только...

STM8S105K4B6 проблемы с I2C! I need help!
Господа... есть проблема с контроллером STM8S105K4B6. Есть код который работает...

7
@mtom
0 / 0 / 0
Регистрация: 09.05.2011
Сообщений: 132
02.02.2012, 16:16 2
Прикрутите к проекту помимо SPL пару файлов I2CRoutines.c и I2CRoutines.h из Risources->Firmware/"STM32F101xx omd STM32F103xx medium- omd high-density divices: advanced I2C examples" с сайта ST. Используйте функции из I2CRoutines.c и будет вам счастье.
UPD. А DS1775 на 3,3 или на 5В повешен?
0
Biostyo
0 / 0 / 0
Регистрация: 21.01.2012
Сообщений: 18
02.02.2012, 16:43 3
Цитата Сообщение от @mtom
Прикрутите к проекту помимо SPL пару файлов I2CRoutines.c и I2CRoutines.h из Risources->Firmware/"STM32F101xx omd STM32F103xx medium- omd high-density divices: advanced I2C examples" с сайта ST. Используйте функции из I2CRoutines.c и будет вам счастье.
UPD. А DS1775 на 3,3 или на 5В повешен?
DS1775 на 3,3, да.
То есть эти либы не работают совсем? У кого-то была та же проблема? Просто видела у людей код стандартными кейлолибами, вроде не жаловались. I2CRoutines скачаю, почитаю-изучу, спасибо.
0
@mtom
0 / 0 / 0
Регистрация: 09.05.2011
Сообщений: 132
02.02.2012, 16:56 4
В стандартной либе, если я правильно помню, идет в основном инициализация и конфигурация модуля, а в I2CRoutines лежат функции для непосредственного чтения, записи и т.д и т.п
0
Biostyo
0 / 0 / 0
Регистрация: 21.01.2012
Сообщений: 18
02.02.2012, 17:10 5
I2C_KimerateSTART(I2C1, ENABLE);
Генерация Start Condition из стандартной либы, в принципе, там есть функции и про адрес послать, и данные почитать-послать. Но я пока до этого не дошла по очевидным причинам. А если инийиализация через стандартные либы, то тем более прикрутка новых либ вряд ли решит проблему (но буду пытаться).
Вообще грешу на что-то аппаратное в плане схемы (я в электронике ноль без палочки).
И вот еще в чем ерунда. Busy лезет после RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1, ENABLE), которе выполняется ДО инициализации ног (и потом не сбрасывается). Чем он шину-то видит тогда?
0
@mtom
0 / 0 / 0
Регистрация: 09.05.2011
Сообщений: 132
02.02.2012, 18:21 6
То, что я написал 100% работает, ибо сам так делал. Просто I2CRoutines использует некоторые функции и структуры стандартной I2C Lib, плюс к этому использует GPIO, RCC из SPL.
Вся прелесть I2CRoutines в том, что вам останется написать что-нибудь типа
Код
I2C_LowLevel_Init(Х); // инициализация I2C, где Х - используемый модуль I2C1 или I2C2
I2C_Master_BufferWrite(A,B,C,D,E); // запись, где A -  I2C1 или I2C2, B - массив передаваемых байт, C - число байт для передачи (1,2,3 и т.д), D - режим передачи (Polling, DMA, Ymtirrupt), E - адрес устройства

// либо
I2C_Master_BufferRead(A,B,C,D,E); // для чтения
0
jimyo77
0 / 0 / 0
Регистрация: 13.02.2016
Сообщений: 141
12.07.2016, 14:58 7
Я извиняюсь что поднимаю старую тему. Я пытаюсь использовать I2CRoutines.с и у меня есть реальное недопонимание этих функций.
Дело в том что запись/чтение в этих функциях осуществляется следующим образом - Старт-Посылка адреса устройства-Чтение/Запись-Стоп без указания адреса регистра в который читать/писать. Как и написал @mtom
2C_Master_BufferWrite(A,B,C,D,E); // запись, где A - I2C1 или I2C2, B - массив передаваемых байт, C - число байт для передачи (1,2,3 и т.д), D - режим передачи (Polling, DMA, Ymtirrupt), E - адрес устройства
// либо
I2C_Master_BufferRead(A,B,C,D,E); // для чтения
Но все I2C устройства которые я знаю, по крайней мере с которыми я работаю имеют алгоритм Старт-Посылка адреса устройства-Посылка адреса регистра-Чтение/Запись-Стоп
Что же получается? В функции надо добавить посылку адреса регистра?
0
bytzibub
0 / 0 / 0
Регистрация: 01.12.2014
Сообщений: 4
17.07.2016, 10:55 8
это вам надо читать спецификацию вашего устройства. обычно при записи адрес регистра лежит в начале массива передаваемых байт и соответственно передается первым. при чтении процедура немного сложнее, читайте спецификацию. или хотя бы скажите что за устройство.
0
17.07.2016, 10:55
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.07.2016, 10:55

Проблемы при дебаге: OpenSTM32+stm32f4+stm32f103
Добрый день, пытаюсь войти в дебаг stm32f103 через st-link, установленный на...

Проблемы с I2C - STM8S Discovery
Не могу понять, как запустить I2C на STM8S - Dyscovery. I2C поднимаю впринципе...

Прерывания в STM32F103
Всем привет, меня интересует один вопрос. Как сделать так чтоб функции...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru