реклама на сайте
подробности

 
 
> stm32 i2c
Dron_Gus
сообщение Nov 6 2009, 08:26
Сообщение #1


Профессионал
*****

Группа: Свой
Сообщений: 1 202
Регистрация: 9-01-05
Из: Санкт-Петербург
Пользователь №: 1 861



Что-то не совсем адекватно работает модуль I2C2. Или я что-то не учел.
Кто-нить с ним работал. Есть какие-нить дополнительные грабли, кроме описанных в errat'е?
Симптомы: идет постоянный обмен с 8 устройствами. STM32 мастер. В какой-то момент общение со всеми устройствами выпадает на Ack Failed в момент передачи адреса. Отваливаются сразу все. Через некоторое время обмен восстанавливается.

З.Ы. на первом i2c висят часы и с ними никаких проблем не обнаружено.


--------------------
Если сверху смотреть, то сбоку кажется, что снизу ничего не видно.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Ruslan-maniak
сообщение Feb 27 2014, 10:16
Сообщение #2


Частый гость
**

Группа: Участник
Сообщений: 92
Регистрация: 27-12-12
Из: Томск
Пользователь №: 74 999



А ещё такой вопрос, не касающийся CPAL: может ли быть такое что используя стандартную библиотеку STM в режиме Мастер не отпускает линию что бы принять ACK от слэйва после отправки адреса устройства? Просто некоторое время slave нормально отвечал, затем я немного решил порефакторить код и всё сломалось. Вернул на место, всё равно ничего не работает. Смотрю по осцилограмме - слэйв не отправляет ACK. Хотя в его работе вообще ничего меняться не должно было. Выкладываю код:
Инициализация:
CODE
//Инициализация GPIO
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);

GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStruct.GPIO_OType = GPIO_OType_OD;
GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL;

// SCL пин
GPIO_InitStruct.GPIO_Pin = I2C1_SCL_PIN;
GPIO_Init(I2C1_SCL_PORT, &GPIO_InitStruct);
GPIO_PinAFConfig(I2C1_SCL_PORT, I2C1_SCL_PIN_SOURCE, GPIO_AF_I2C1);

// SDA пин
GPIO_InitStruct.GPIO_Pin = I2C1_SDA_PIN;
GPIO_Init(I2C1_SDA_PORT, &GPIO_InitStruct);
GPIO_PinAFConfig(I2C1_SDA_PORT, I2C1_SDA_PIN_SOURCE, GPIO_AF_I2C1);

// Конфигурация I2C
RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1, ENABLE);

I2C_Cmd(I2C1, DISABLE);

I2C_DeInit(I2C1);
I2C_InitStruct.I2C_Mode = I2C_Mode_I2C;
I2C_InitStruct.I2C_DutyCycle = I2C_DutyCycle_2;
I2C_InitStruct.I2C_OwnAddress1 = I2C1_OWN_ADDRESS;
I2C_InitStruct.I2C_Ack = I2C_Ack_Enable;
I2C_InitStruct.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;
I2C_InitStruct.I2C_ClockSpeed = I2C_SPEED;
I2C_Init(I2C1, &I2C_InitStruct);

// Включение интерфейса
I2C_Cmd(I2C1, ENABLE);


чтение регистра
CODE
// Проверка готовности линии
while(I2C_GetFlagStatus(I2Cx, I2C_FLAG_BUSY));

// Генерация первого старта
I2C_GenerateSTART(I2Cx, ENABLE);

// Проверка что линия свободна
while(!I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_MODE_SELECT));

// Отправка адреса подчинённого устройства (запись)
I2C_Send7bitAddress(I2Cx, slaveAddress, I2C_Direction_Transmitter);

// Проверка ACK от подчинённого устройства (есть ли такой адрес на шине)
while(!I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));

// Отправка адреса регистра чтения
I2C_SendData(I2Cx, regAddress);

// Проверка ACK от подчинённого устройства
while(!I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_BYTE_TRANSMITTED));

// Генерация повторного старта
I2C_GenerateSTART(I2Cx, ENABLE);

// Проверка что линия свободна
while(!I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_MODE_SELECT));

// Отправка адреса подчинённого устройства (чтение)
I2C_Send7bitAddress(I2Cx, slaveAddress, I2C_Direction_Receiver);

// Проверка ACK от подчинённого устройства
while(!I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED));

// Завершаем приём
I2C_AcknowledgeConfig(I2Cx, DISABLE);

// Проверка что байт принят (данные загружены в регистр DR)
while(!I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_BYTE_RECEIVED));

// Генерируем стоп
I2C_GenerateSTOP(I2C1, ENABLE);

return I2C_ReceiveData(I2Cx);


И после первой отправки адреса устройства ACK я так и не дожидаюсь. Устройство STA381BWS.

Добавил к коду сдвиг адреса Slave'а на один бит влево. Ничего не изменилось.

Сообщение отредактировал Ruslan-maniak - Feb 28 2014, 07:43
Причина редактирования: [codebox] для длинного кода, [code] - для короткого!!!
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Dron_Gus   stm32 i2c   Nov 6 2009, 08:26
- - Dron_Gus   Покопался на форуме ST. Вообщем, хотели как лучше,...   Nov 6 2009, 12:37
- - IgorKossak   Посмотрите здесь свежак: STM32F10xxx devices: adva...   Nov 6 2009, 18:01
- - Dron_Gus   Цитата(IgorKossak @ Nov 6 2009, 21:01) По...   Nov 8 2009, 18:57
|- - KnightIgor   Цитата(Dron_Gus @ Nov 8 2009, 20:57) Тепе...   Jul 11 2012, 08:32
|- - DmitryM   Цитата(KnightIgor @ Jul 11 2012, 12:32) Е...   Jul 11 2012, 10:00
|- - esaulenka   Цитата(KnightIgor @ Jul 11 2012, 12:32) М...   Jul 10 2013, 19:23
- - brag   У меня тоже он че-то не идет. Работает некоторое в...   Aug 12 2011, 22:29
- - rexton   Еще вопрос Пытаюсь запустить обмен по шине на пре...   Jul 10 2012, 07:29
|- - adnega   Цитата(rexton @ Jul 10 2012, 11:29) Еще в...   Jul 10 2012, 09:11
- - kan35   Рекомендации ST по поводу I2C: Это периферийное у...   Jul 10 2012, 10:23
- - sls_   Прошу прощения, разобрался, напутал в чтении.   Jul 18 2012, 09:26
|- - LeonVS   Всем доброго времени суток! Помогите разобрать...   Mar 8 2013, 18:50
|- - KnightIgor   Цитата(LeonVS @ Mar 8 2013, 19:50) Всем д...   Mar 11 2013, 08:49
- - drcepera   Доброго времени суток. Юзаю i2c на STM32F4DISCOVER...   Jul 10 2013, 09:00
|- - Lotor   Цитата(drcepera @ Jul 10 2013, 13:00) тай...   Jul 10 2013, 09:43
- - drcepera   Тээк.. Если прерывание разрешено в таймере (бит Up...   Jul 10 2013, 12:22
|- - _Артём_   Цитата(drcepera @ Jul 10 2013, 15:22) Есл...   Jul 10 2013, 12:45
|- - drcepera   Цитата(_Артём_ @ Jul 10 2013, 16:45) Нужн...   Jul 10 2013, 13:08
|- - Lotor   Цитата(drcepera @ Jul 10 2013, 17:08) то ...   Jul 10 2013, 16:38
- - drcepera   OMG.. Извиняюсь, товарищи. Нашел таки косяк ) Датч...   Jul 19 2013, 09:38
- - Ruslan-maniak   Хочу поднять эту тему. Пытаюсь завести I2C через C...   Feb 25 2014, 11:16
- - kan35   Я убрал всю инициализацию таймеров в CPAL (закомме...   Feb 26 2014, 16:57
- - Ruslan-maniak   Понятно. Спасибо.   Feb 27 2014, 02:06


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 24th July 2025 - 22:27
Рейтинг@Mail.ru


Страница сгенерированна за 0.01401 секунд с 7
ELECTRONIX ©2004-2016