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

 
 
 
Reply to this topicStart new topic
> stm32f030f4 i2c непонятка
eeak
сообщение Dec 20 2015, 19:29
Сообщение #1





Группа: Новичок
Сообщений: 2
Регистрация: 20-12-15
Пользователь №: 89 772



Доброго времени.
Переезжаю с AVRки на STM32. Необходимо запустить i2c шину на самом маленьком камне семейства, а именно stm32f030f4. Никак не могу заставить камень проявить какую либо активность на шине.

CODE
GPIO_InitTypeDef GPIO_InitStructure;
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_InitStructure.GPIO_OType = GPIO_OType_OD;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_PinAFConfig(GPIOA, GPIO_PinSource9, GPIO_AF_1);
GPIO_PinAFConfig(GPIOA, GPIO_PinSource10, GPIO_AF_1);

I2C_DeInit(I2C1);
I2C_InitTypeDef I2C_InitStructure;
I2C_InitStructure.I2C_Ack = I2C_Ack_Enable;
I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;
I2C_InitStructure.I2C_AnalogFilter = I2C_AnalogFilter_Enable;
I2C_InitStructure.I2C_DigitalFilter = 1;
I2C_InitStructure.I2C_Mode = I2C_Mode_I2C;
I2C_InitStructure.I2C_OwnAddress1 = 0x4;
I2C_InitStructure.I2C_Timing = 0x10805E89;
I2C_Init(I2C1,&I2C_InitStructure);

I2C_Cmd(I2C1, ENABLE);
while ((I2C_BUS->CR1 & I2C_CR1_PE)==0) {}; // Жду пока включится

I2C_BUS->CR2 &= ~I2C_CR2_RD_WRN; // Режим передачи
I2C_BUS->CR2 &= ~I2C_CR2_NBYTES; // Очистить размер данных
I2C_BUS->CR2 |= Size<<I2C_OFFSET_CR2_NBYTES; // Установить размер данных
I2C_BUS->CR2 &= ~I2C_CR2_SADD; // Очистить адрес ведомого устройства
I2C_BUS->CR2 |= Adress; // Установить адрес ведомого устройства
I2C_BUS->CR2 |= I2C_CR2_START; // Выдать старт на шину
while ((I2C_BUS->ISR & I2C_ISR_BUSY)==0) {}; // Ожидать выдачу старта


Здесь, насколько я понимаю, SDA должна быть прижата к земле, но этого не происходит. Вижу это осциллографом. Хотя флаг I2C_ISR_BUSY устанавливается. Далее...

Код
    // Сейчас либо I2C запросит первый байт для отправки,
    // Либо взлетит NACK-флаг, говорящий о том, что микросхема не отвечает.
    // Если взлетит NACK-флаг, отправку прекращаем.
    while ((((I2C_BUS->ISR & I2C_ISR_TXIS)==0) && ((I2C_BUS->ISR & I2C_ISR_NACKF)==0)) && (I2C_BUS->ISR & I2C_ISR_BUSY)) {};


На этой строчке все виснет.
Проверил на 2ух камнях, т.к. подозревал что порт умер. Подтяжка обоих линий к питанию 4к7.
Голова кипит уже, подскажите в чем ошибка.

Сообщение отредактировал IgorKossak - Dec 20 2015, 21:35
Причина редактирования: [codeebox] для длинного кода, [code] - для короткого!
Go to the top of the page
 
+Quote Post
Tarbal
сообщение Dec 20 2015, 21:13
Сообщение #2


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

Группа: Свой
Сообщений: 1 351
Регистрация: 21-05-10
Пользователь №: 57 439



Проверьте, что тактовые импульсы идут на сам модули и на порт. Насколько мне известно это два разных истогника. По крайней мере их в разных регистрах разрешают. Ответьте себе на вопрос какова частота тактовых импульсов.
Go to the top of the page
 
+Quote Post
KnightIgor
сообщение Dec 21 2015, 08:17
Сообщение #3


Знающий
****

Группа: Участник
Сообщений: 643
Регистрация: 29-05-09
Из: Германия
Пользователь №: 49 725



Цитата(Tarbal @ Dec 20 2015, 22:13) *
Проверьте, что тактовые импульсы идут на сам модули и на порт. Насколько мне известно это два разных истогника. По крайней мере их в разных регистрах разрешают. Ответьте себе на вопрос какова частота тактовых импульсов.

Из кода ТС видно:
Код
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1, ENABLE);

Самому ТС отвечу, что I2C под отладчиком может вести себя неожиданно, или же отладчик не будет успевать ловить промежуточные состояния (пока такт остановится, и т.д.).
Мой совет: даже если непосредственная работа с регистрами нравится больше, возьмите периферийную библиотеку и попробуйте через нее. Когда заработает, перенесете все на регистры - непонятки можно подсмотреть в библиотеке.
Go to the top of the page
 
+Quote Post
eeak
сообщение Dec 21 2015, 20:43
Сообщение #4





Группа: Новичок
Сообщений: 2
Регистрация: 20-12-15
Пользователь №: 89 772



За четыре дня мозгокипения я перепробовал кажется все, и разные SPL в том числе. Было стойкое ощущение что проблема кроется в инициализации, но неоднократные перепроверки не приводили к успеху. Все оказалось гораздо прозаичнее...

В библиотеке кокоса указано:
Код
@arg GPIO_AF_1: USART2, CEC, Tim3, USART1, IR_OUT,EVENTOUT, I2C1, I2C2, TIM15
...
...
@arg GPIO_AF_4: TIM14, I2C1 (only for STM32F0XX_LD and STM32F030X6 devices)

Как оказалось это ошибочные данные, правильная запись именно GPIO_AF_4.

Всем спасибо, едем дальше.
Go to the top of the page
 
+Quote Post

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

 


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


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