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

    

I2C на плате STM32F4Discovery

Добрый день.

Изучаю работу с STM32F407 с применением HAL-библиотек.

Завис на изучении I2C. Пробую вести обмен с микросхемой CS43L22, которая стоит на плате.

По схеме на плату вижу подключение ног I2C этой микросхемы к пинам PB6(SCL) и PB9(SDA)

post-59925-1517926600_thumb.png

Также по схеме вижу их подтяжку к питанию через 4,7 кОм

post-59925-1517926605.png

В STM32CubeMX создал проект и настроил эти пины STM-ки на интерфейс I2C

post-59925-1517926609_thumb.png

настроил скорость и параметры пинов (скорость обмена сделал маленькую - 10кГц, но пробовал и 100кГц)

post-59925-1517926612_thumb.pngpost-59925-1517926617_thumb.png

В даташите на CS43L22 нашел циклограмму чтения

post-59925-1517926621_thumb.png

и пытаюсь вычитать ИД микросхемы, т.е. регистр с адресом 0х01

int main(void)
{
 /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
 HAL_Init();
 /* Configure the system clock */
 SystemClock_Config();
 /* Initialize all configured peripherals */
 MX_GPIO_Init();
 MX_TIM6_Init();
 MX_I2C1_Init();

LCD_init();
LCD_clear();

HAL_TIM_Base_Start(&htim6);
HAL_TIM_Base_Start_IT(&htim6);

 while (1)
 {
	LCD_clear();
	LCD_Cursor(0, 0);
	LCD_write_String("BEGIN");
	HAL_Delay(1000);

	LCD_clear();
	LCD_Cursor(0, 0);
	aTxBuffer[0] = 0x01;
	LCD_clear();
	LCD_Cursor(0, 0);
	LCD_write_String("Wait ready...");
	while( HAL_I2C_GetState(&hi2c1) != HAL_I2C_STATE_READY )
	{
		LCD_clear();
		LCD_Cursor(0, 0);
		LCD_write_String("Not ready...");
	}
	HAL_Delay(1000);
	LCD_clear();
	LCD_Cursor(0, 0);
	LCD_write_String("Wait write...");
	while(HAL_I2C_Master_Transmit(&hi2c1, (uint16_t)0x94, aTxBuffer, (uint16_t)1, (uint32_t) 1000) != HAL_OK)
	{
		if(HAL_I2C_GetError(&hi2c1) != HAL_I2C_ERROR_AF)
		{
			LCD_clear();
			LCD_Cursor(0, 0);	// позиция курсора начинается с 0
			LCD_write_String("Buffer ERROR!");
		}
	}
	while( HAL_I2C_GetState(&hi2c1) != HAL_I2C_STATE_READY )
	{
		LCD_clear();
		LCD_Cursor(0, 0);
		LCD_write_String("..CONTINUE..");
	}
	LCD_clear();
	LCD_Cursor(0, 0);
	LCD_write_String("Write OK!");
	I2C_ReadBuffer(&hi2c1, (uint16_t)0x94, (uint16_t)1);

	HAL_Delay(1000);

 }

}

Т.е. я сначала записываю адрес этого регистра 0х01 (использую стандартную ф-цию HAL_I2C_Master_Transmit), затем собираюсь читать (уже использую свою ф-цию I2C_ReadBuffer)...но до чтения прога не доходит, зависает в цикле while(HAL_I2C_Master_Transmit(&hi2c1, (uint16_t)0x94, aTxBuffer, (uint16_t)1, (uint32_t) 1000) != HAL_OK).

Адрес микросхемы 0х94 - по даташиту.

 

Находил несколько статей по работе именно с этой микросхемой на этой плате, код примерно такой же. Смотрел видео-пример по работе с часами реального времени, там код вообще совпадает.

 

Если кто работал с этой микросхемой, подскажите плз, где я мог накосячить? Код минимальный.

Изменено пользователем IgorKossak
[codebox] для длинного кода. [code]-для короткого!!!

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


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

Теоретически он не может повиснуть, должен вернуть ошибку timeout.

А timeout работает через прерывания systick, он у вас включен и настроен?

 

Или в отладчике пошагово посмотрите где повис.

 

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


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

содержимое MX_I2C1_Init покажите и перед while(1) напишите

__enable_interrupt();

 

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

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


Ссылка на сообщение
Поделиться на другие сайты
содержимое MX_I2C1_Init покажите и перед while(1) напишите

__enable_interrupt();

 

По-умолчанию, после старта MCU прерывания разрешены, поэтому нет необходимости разрешать их.

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


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

что то мне подсказывает, что просто не включен клок... __I2C1_CLK_ENABLE();

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


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

А вообще рекомендую потратить часок на изучение I2C целевого STM32 и написать свои функции чтения/записи (попутно обработку ошибок реализовать, в частности, зависание шины).

Наблюдаю тенденцию каждого третьего вопроса как раз про эти ваши HAL-ы. Создается впечатление, что это г*вно изобретение ленивых людей похуже индусских драйверов на встроенное железо... :biggrin:

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

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


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

Спасибо всем, текущая проблема решена...

Не увидел сначала на схеме, что на Reset по умолчанию подан ноль. Подцепил порт PD4, подал на него 1 - и все заработало.

Но это я только начал с этим разбираться, возможно дальше еще на что-нибудь "наступлю" :biggrin: ...тогда продолжу эту тему..

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


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

Выше неправильный вывод - просто HAL очень удобная отмазка - " а у меня не работает". Не спорю, есть "тонкие места", да и самому приходилось патчить код - но вот так вот клеймить фекалиями не стоит.

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


Ссылка на сообщение
Поделиться на другие сайты
А вообще рекомендую потратить часок на изучение I2C целевого STM32 и написать свои функции чтения/записи (попутно обработку ошибок реализовать, в частности, зависание шины).

Наблюдаю тенденцию каждого третьего вопроса как раз про эти ваши HAL-ы. Создается впечатление, что это г*вно изобретение ленивых людей похуже индусских драйверов на встроенное железо... :biggrin:

HAL stm-овский проект, который активно развивается и его вылизывают на сотнях, тысячах проектов. а ваши самопальные библиотеки, заточенные под ваши личные проекты, используете только вы и сколько там косяков вам еще предстоит узнать. RTOS, файловую систему, .... вы видимо тоже свои пишете, по ночам, в свободное от основной работы время..

 

billidean, в репозитории куба есть готовый драйвер CS43L22, можно в нем глянуть как реализовано

смотрите куда в кубе у вас настроено сохранение Help > Updater Settings > Firmware Repository

драйвер

~/STM32Cube/Repository/STM32Cube_FW_F4_V1.19.0/Drivers/BSP/Components/cs43l22/

 

готовые рабочие проекты с примерами использования этого драйвера

~/STM32Cube/Repository/STM32Cube_FW_F4_V1.19.0/Projects/STM32F401-Discovery/Examples/BSP/readme.txt

~/STM32Cube/Repository/STM32Cube_FW_F4_V1.19.0/Projects/STM32F411E-Discovery/Examples/BSP/readme.txt

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

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


Ссылка на сообщение
Поделиться на другие сайты
HAL stm-овский проект, который активно развивается и его вылизывают на сотнях, тысячах проектов. а ваши самопальные библиотеки, заточенные под ваши личные проекты, используете только вы и сколько там косяков вам еще предстоит узнать. RTOS, файловую систему, .... вы видимо тоже свои пишете, по ночам, в свободное от основной работы время..

 

billidean, в репозитории куба есть готовый драйвер CS43L22, можно в нем глянуть как реализовано

смотрите куда в кубе у вас настроено сохранение Help > Updater Settings > Firmware Repository

драйвер

~/STM32Cube/Repository/STM32Cube_FW_F4_V1.19.0/Drivers/BSP/Components/cs43l22/

 

готовые рабочие проекты с примерами использования этого драйвера

~/STM32Cube/Repository/STM32Cube_FW_F4_V1.19.0/Projects/STM32F401-Discovery/Examples/BSP/readme.txt

~/STM32Cube/Repository/STM32Cube_FW_F4_V1.19.0/Projects/STM32F411E-Discovery/Examples/BSP/readme.txt

Я бы посмотрел, как Вы "HAL stm-овский проект, который активно развивается и его вылизывают на сотнях, тысячах проектов..." на самолетный блок поставили бы, и если ни дай бог оно откажет или вывалится в HardFault... Тенденция лепить говно везде, я смотрю, очевидно набирает обороты.

В общем, с Вами мне все понятно, обсуждать тут и нечего. Всего Вам наилучшего :laughing:

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


Ссылка на сообщение
Поделиться на другие сайты
Я бы посмотрел, как Вы "HAL stm-овский проект, который активно развивается и его вылизывают на сотнях, тысячах проектов..." на самолетный блок поставили бы, и если ни дай бог оно откажет или вывалится в HardFault... Тенденция лепить говно везде, я смотрю, очевидно набирает обороты.

В общем, с Вами мне все понятно, обсуждать тут и нечего. Всего Вам наилучшего :laughing:

 

Не везде требуется самолетная надежность. Я вот использую HAL, максимальный уровень оптимизации, сотни проборов, годы эксплуатации, сбоев нет. Все зависит от задачи и от кривизны рук.

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


Ссылка на сообщение
Поделиться на другие сайты
Не везде требуется самолетная надежность. Я вот использую HAL, максимальный уровень оптимизации, сотни проборов, годы эксплуатации, сбоев нет. Все зависит от задачи и от кривизны рук.

Про кривизну: Вы утверждаете, что минус на минус дает плюс?

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


Ссылка на сообщение
Поделиться на другие сайты
Про кривизну: Вы утверждаете, что минус на минус дает плюс?

 

Некоторые до сих пор на ассемблере пишут и ничего.

Тут вопрос скорее всего религиозный который возникал не раз.

Типа ASM vs C

C vs C++

RTOS vs plain C

 

Дело в том кто с чего начал свое обучение.

Перейти на новые инструменты не просто.

 

Сам никогда Cube не пользовался, но в свете системных администраторов Ардуино HAL не такое и зло.

 

Автору топика хочу посоветовать купить (если нет) логический анализатор типа китайский клон Saleae.

Стоит копейки, но жизнь облегчает в разы.

Когда настраиваю перефирею сразу подключаю его на порты микроконтроллера и все становится ясно.

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


Ссылка на сообщение
Поделиться на другие сайты
HAL stm-овский проект, который активно развивается и его вылизывают на сотнях, тысячах проектов. а ваши самопальные библиотеки, заточенные под ваши личные проекты, используете только вы и сколько там косяков вам еще предстоит узнать. RTOS, файловую систему, .... вы видимо тоже свои пишете, по ночам, в свободное от основной работы время..

Косяки не пишу уже лет так 15, из 20 ... к примеру.

 

Кто его развивает ? Специалисты ?! Кто будет вылаживать нормальный код, труд обкатанный годами во всеобщее пользование ?, это мягко говоря - антисоциально по отношению к проффесионалам.

Для всех этих hardware опен сорсе - есть много общего: очень сложно выкорчевать, нереально дописать, присел - раб (трать время = деньги) - так как читать не умеешь документацию.

Из всех неудобных мест по применению "универсального" кода - микроконтроллеры занимают первое место, так как постоянно приходится иметь дело с компромиссами (размер + скорость + оптимальная архитектура задачи + оптимальная работа с периферией). Применение языковых подходов для оптимизации кода, требует знания возможности и методов адресации процессорного ядра применяемого микроконтроллера. Всё это лучшее в существующей реализации кхала - отсутствует. А когда она будет допилена - то превратится в обычный код разработчика, с которым спорите по целесобразности применения кхала. Имел в виду разработчика со стажем, а не студента мечтателя.

 

1. Выгода применения аппаратной системы прерывания CORTEX - убита в корне. (ленивой программной реализацией - откатили до уровня 7TDMI).

2. Килобайты кода к контексте прерываний. (благо дело можно настроить приоритеты и разрешить вложенные, но это уже извращения на ровном месте).

3. Включаются прерывания, которые не разрешал. Корявая обработка. (неожиданные отработки прерываний, которые принципиально по архитектуре задачи не планировал и не разрешал)

4. Разработчики теряются и неправильно реализуют состояния программных статусов. (непонятный блуд с программными флагами и состояниями, невозможность гибкости в плане быстрого реагирования )

5. Неумение работать даже с банальным UART, документацию не читают !!! (I2C)

6. Доведение до ума требует гарантированного выкорчевывания - 98 % кода, с куда более большими затратами по вниманию и времени.

 

Любое из этого для меня лично критически - не приемлемо.

 

STDLIB на stm32f7 - уже не поддерживается - жаль.

Изменено пользователем картошка

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


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

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти
Авторизация