Jump to content

    
Sign in to follow this  
billidean

I2C на плате STM32F4Discovery

Recommended Posts

Добрый день.

Изучаю работу с 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 - по даташиту.

 

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

 

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

Edited by IgorKossak
[codebox] для длинного кода. [code]-для короткого!!!

Share this post


Link to post
Share on other sites

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

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

 

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

 

Share this post


Link to post
Share on other sites
содержимое MX_I2C1_Init покажите и перед while(1) напишите

__enable_interrupt();

 

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

Share this post


Link to post
Share on other sites

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

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

Edited by Arlleex

Share this post


Link to post
Share on other sites

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

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

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites
А вообще рекомендую потратить часок на изучение 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

Edited by op3op3

Share this post


Link to post
Share on other sites
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:

Share this post


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

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

 

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

Share this post


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

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

Share this post


Link to post
Share on other sites
Про кривизну: Вы утверждаете, что минус на минус дает плюс?

 

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

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

Типа ASM vs C

C vs C++

RTOS vs plain C

 

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

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

 

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

 

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

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

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

Share this post


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

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

 

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

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

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

 

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

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

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

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

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

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

 

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

 

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

Edited by картошка

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this