Jump to content

Recommended Posts

Здравствуйте. Нужно разобраться с принципом работы интерфейса I2C на Stm32. понимаю, что материала в интернете много, но почему-то даже просто структура, где определяются параметры, у меня другая.

Моя вот такая:

typedef struct
{
  uint32_t I2C_Timing;  
  uint32_t I2C_AnalogFilter;      
  uint32_t I2C_DigitalFilter; 
  uint32_t I2C_Mode;  
  uint32_t I2C_OwnAddress1;
  uint32_t I2C_Ack;
  uint32_t I2C_AcknowledgedAddress;
}I2C_InitTypeDef;

Те, что даются в примерах, в статьях, такая:

typedef struct
{
  uint32_t I2C_ClockSpeed;          
 
  uint16_t I2C_Mode;                
 
  uint16_t I2C_DutyCycle;           
 
  uint16_t I2C_OwnAddress1;         
 
  uint16_t I2C_Ack;                 
 
  uint16_t I2C_AcknowledgedAddress; 
}I2C_InitTypeDef;

 

Найдя пример на этом форуме (https://forum.cxem.net/index.php?/topic/202586-i2c-%D0%B2-stm32f030/) увидел, что используются параметры такие же, что и у меня, но теперь не понятно, откуда такие значения берут и по какой логике. 

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

Программирую в keil uVision v5
Отладочная плата stm32f0 disco

МК stm32f0030r8

Благодарю заранее.

Share this post


Link to post
Share on other sites

https://terraideas.ru/article/podklyuchenie-am2320-po-i2c-k-stm32f030c8t6-8 у меня прекрасно работает это

Структура вроде бы как у вас

I2C_InitTypeDef i2c;
I2C_StructInit(&i2c);
I2C_DeInit(AM_I2C);

i2c.I2C_AnalogFilter = I2C_AnalogFilter_Enable;
i2c.I2C_DigitalFilter = 0;
i2c.I2C_Mode = I2C_Mode_I2C;
// Любой адрес, так как МК в режиме мастера, он не используется
i2c.I2C_OwnAddress1 = 0x38;
i2c.I2C_Ack = I2C_Ack_Enable;
i2c.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;
// 100kHz описание выше в тексте
i2c.I2C_Timing = 0x20303E5D;
I2C_Init(AM_I2C, &i2c);
I2C_Cmd(AM_I2C, ENABLE);

 

42 минуты назад, One _ moment сказал:

где можно найти исчерпывающую информацию

собственно рефренс мануал + коменты к структурам. я кодил в кокосе, там к каждому полю расписано что это...

Да и тут полезно почитать если именно разобраться хотите. https://ru.wikipedia.org/wiki/I²C

Там и про адреса, и про то как устроен протокол и про бит подтверждения. Странно что на вики решили перевести практически все и даже нет описания понятия такого как Ack :)

если знаете английский, имхо лучше английское описание на вики почитать...

Share this post


Link to post
Share on other sites

I2C настраивается в пару строчек по даташиту. Без всяких структур.

 

Скрытый текст

//Включаем тактирование модуля I2C1
    RCC->APB1ENR |= RCC_APB1ENR_I2C1EN;
    
    //Настраиваем модуль I2C1
    I2C1->TIMINGR = 0x00401D29; //тайминг - 0x00401D29
    I2C1->CR1 |= I2C_CR1_PE;    //Включаем модуль

 

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

Share this post


Link to post
Share on other sites

Металл-композит как альтернатива ферриту: дроссели Panasonic семейства ETQP

Современные электронные устройства требуют все более компактных и эффективных компонентов. Новые металл-композитные дроссели обладают рядом преимуществ перед дросселями с ферритовым сердечником. Они не имеют ярко выраженного насыщения, обладают отличными частотными свойствами и способны работать при температурах до 150°C и выше. Все это делает их альтернативой стандартным дросселям с ферритовым сердечником в широком спектре автомобильных и промышленных приложений.

Подробнее

22 минуты назад, elki сказал:

I2C настраивается в пару строчек

как и со структурами, не обязательно заполнять все, хотя все же думаю на две строки будет больше :) И вопрос собственно был по структурам

22 минуты назад, elki сказал:

Без всяких структур.

если посмотреть мои сообщения в стм для новичка, я тоже пишу, что только регистры, никаких структур, и половина моих проектов без структур, а потом через год я открываю, а я пишу редко... и вижу I2C_ClockSpeed = 100000; и я понимаю что это, а потом открываю I2C1->TIMINGR = 0x00401D29; и я лезу в ДШ чтобы разобрать что же тут)

даже более простые вещи, нужно запомнить название регистра и название бита, чтобы понять куда что вписать, то же выставление флага Ack сходу легко вспомнить что это регистр OAR1? вот хал я не могу заставить себя юзать, это считаю перебор, но структуры не так ужасны, чтобы не лезть лишний раз в даташит )

но это мое мнение)) оно может отличаться от вашего) я и сам пишу то так то так)

Скрытый текст

но, когда это на работе, правда это не связано с МК, а просто программирование, там куча людей кодить, и там куда приятней читать более понятный код, который практически не увеличивает размер прошивки благодаря макросам, чем лазить по коду и искать что же эти цифры сделали которе написал твой напарник)

 

Edited by DrobyshevAlex

Share this post


Link to post
Share on other sites

Я всегда отлично помню что это за запись I2C1->TIMINGR = 0x00401D29; Тут кроме тайминга ничего быть не может. Запоминать не надо, надо пользоваться документацией, когда пишешь постоянно оно уже само запоминается где что и как. Структуры конечно не так ужасны как хал, я против них ничего и не имею. Просто растет портянка кода.

Share this post


Link to post
Share on other sites
                     

Новые литиевые ХИТы Fanso работают даже при +150ºС!

Когда приходится учитывать работу в экстремальных условиях, к выбору электронных компонентов подходишь с особой тщательностью. Высокие температуры, большие перепады давления, труднодоступность – все это требует специальной продукции. Склад КОМПЭЛ пополнился новыми литиевыми ХИТами Fanso, стабильно работающими даже при температуре до 150 ºС. Батарейки имеют номинальное напряжение 3,6 В, обладают ёмкостью от 700 до 14000 мАч, работоспособны в широком температурном диапазоне -20…150ºС и имеют низкий саморазряд (не более 3% в год в нормальных условиях хранения).

Подробнее о высокотемпературной линейке

11 часов назад, DrobyshevAlex сказал:

Структура вроде бы как у вас

Мне просто ещё интересно, почему структуры разные? Я полагаю, что это просто как версия, но не знаю, насколько это верно

Edited by Falconist

Share this post


Link to post
Share on other sites

Структура это от версии cmsis видимо разные у вас. Это ж просто вспомогательная структура которая потом в функции будет раскиданна по тем же регистрам. 

Edited by DrobyshevAlex

Share this post


Link to post
Share on other sites

Join the conversation

You are posting as a guest. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  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.

Loading...

  • Similar Content

    • By Sanchous
      Я делаю проект с использованием stm32, до этого я работал с arduino, и подобных проблем не было, при прошивке МК эти кодом (сгенерированым при помощи cubeMX):
      /* USER CODE BEGIN Header */ /** ****************************************************************************** * @file : main.c * @brief : Main program body ****************************************************************************** * @attention * * <h2><center>&copy; Copyright (c) 2020 STMicroelectronics. * All rights reserved.</center></h2> * * This software component is licensed by ST under BSD 3-Clause license, * the "License"; You may not use this file except in compliance with the * License. You may obtain a copy of the License at: * opensource.org/licenses/BSD-3-Clause * ****************************************************************************** */ /* USER CODE END Header */ /* Includes ------------------------------------------------------------------*/ #include "main.h" /* Private includes ----------------------------------------------------------*/ /* USER CODE BEGIN Includes */ /* USER CODE END Includes */ /* Private typedef -----------------------------------------------------------*/ /* USER CODE BEGIN PTD */ /* USER CODE END PTD */ /* Private define ------------------------------------------------------------*/ /* USER CODE BEGIN PD */ /* USER CODE END PD */ /* Private macro -------------------------------------------------------------*/ /* USER CODE BEGIN PM */ /* USER CODE END PM */ /* Private variables ---------------------------------------------------------*/ /* USER CODE BEGIN PV */ /* USER CODE END PV */ /* Private function prototypes -----------------------------------------------*/ void SystemClock_Config(void); /* USER CODE BEGIN PFP */ /* USER CODE END PFP */ /* Private user code ---------------------------------------------------------*/ /* USER CODE BEGIN 0 */ /* USER CODE END 0 */ /** * @brief The application entry point. * @retval int */ int main(void) { /* USER CODE BEGIN 1 */ /* USER CODE END 1 */ /* MCU Configuration--------------------------------------------------------*/ /* Reset of all peripherals, Initializes the Flash interface and the Systick. */ HAL_Init(); /* USER CODE BEGIN Init */ /* USER CODE END Init */ /* Configure the system clock */ SystemClock_Config(); /* USER CODE BEGIN SysInit */ /* USER CODE END SysInit */ /* Initialize all configured peripherals */ /* USER CODE BEGIN 2 */ /* USER CODE END 2 */ /* Infinite loop */ /* USER CODE BEGIN WHILE */ while (1) { /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ } /* USER CODE END 3 */ } /** * @brief System Clock Configuration * @retval None */ void SystemClock_Config(void) { RCC_OscInitTypeDef RCC_OscInitStruct = {0}; RCC_ClkInitTypeDef RCC_ClkInitStruct = {0}; /** Initializes the CPU, AHB and APB busses clocks */ RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI; RCC_OscInitStruct.HSIState = RCC_HSI_ON; RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT; RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE; if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) { Error_Handler(); } /** Initializes the CPU, AHB and APB busses clocks */ RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2; RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSI; RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1; RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1; if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0) != HAL_OK) { Error_Handler(); } } /* USER CODE BEGIN 4 */ /* USER CODE END 4 */ /** * @brief This function is executed in case of error occurrence. * @retval None */ void Error_Handler(void) { /* USER CODE BEGIN Error_Handler_Debug */ /* User can add his own implementation to report the HAL error return state */ /* USER CODE END Error_Handler_Debug */ } #ifdef USE_FULL_ASSERT /** * @brief Reports the name of the source file and the source line number * where the assert_param error has occurred. * @param file: pointer to the source file name * @param line: assert_param error line source number * @retval None */ void assert_failed(uint8_t *file, uint32_t line) { /* USER CODE BEGIN 6 */ /* User can add his own implementation to report the file name and line number, tex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */ /* USER CODE END 6 */ } #endif /* USE_FULL_ASSERT */ /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ С использованием такого make скрипта:
      ########################################################################################################################## # File automatically-generated by tool: [projectgenerator] version: [3.5.2] date: [Mon Feb 03 16:34:48 MSK 2020] ########################################################################################################################## # ------------------------------------------------ # Generic Makefile (based on gcc) # # ChangeLog : # 2017-02-10 - Several enhancements + project update mode # 2015-07-22 - first version # ------------------------------------------------ ###################################### # target ###################################### TARGET = test ###################################### # building variables ###################################### # debug build? DEBUG = 1 # optimization OPT = -Og ####################################### # paths ####################################### # Build path BUILD_DIR = build ###################################### # source ###################################### # C sources C_SOURCES = \ Src/main.c \ Src/stm32f1xx_it.c \ Src/stm32f1xx_hal_msp.c \ Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_gpio_ex.c \ Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_tim.c \ Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_tim_ex.c \ Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal.c \ Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_rcc.c \ Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_rcc_ex.c \ Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_gpio.c \ Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_dma.c \ Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_cortex.c \ Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_pwr.c \ Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_flash.c \ Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_flash_ex.c \ Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_exti.c \ Src/system_stm32f1xx.c # ASM sources ASM_SOURCES = \ startup_stm32f103xb.s ####################################### # binaries ####################################### PREFIX = arm-none-eabi- # The gcc compiler bin path can be either defined in make command via GCC_PATH variable (> make GCC_PATH=xxx) # either it can be added to the PATH environment variable. ifdef GCC_PATH CC = $(GCC_PATH)/$(PREFIX)gcc AS = $(GCC_PATH)/$(PREFIX)gcc -x assembler-with-cpp CP = $(GCC_PATH)/$(PREFIX)objcopy SZ = $(GCC_PATH)/$(PREFIX)size else CC = $(PREFIX)gcc AS = $(PREFIX)gcc -x assembler-with-cpp CP = $(PREFIX)objcopy SZ = $(PREFIX)size endif HEX = $(CP) -O ihex BIN = $(CP) -O binary -S ####################################### # CFLAGS ####################################### # cpu CPU = -mcpu=cortex-m3 # fpu # NONE for Cortex-M0/M0+/M3 # float-abi # mcu MCU = $(CPU) -mthumb $(FPU) $(FLOAT-ABI) # macros for gcc # AS defines AS_DEFS = # C defines C_DEFS = \ -DUSE_HAL_DRIVER \ -DSTM32F103xB # AS includes AS_INCLUDES = # C includes C_INCLUDES = \ -IInc \ -IDrivers/STM32F1xx_HAL_Driver/Inc \ -IDrivers/STM32F1xx_HAL_Driver/Inc/Legacy \ -IDrivers/CMSIS/Device/ST/STM32F1xx/Include \ -IDrivers/CMSIS/Include \ -IDrivers/CMSIS/Include # compile gcc flags ASFLAGS = $(MCU) $(AS_DEFS) $(AS_INCLUDES) $(OPT) -Wall -fdata-sections -ffunction-sections CFLAGS = $(MCU) $(C_DEFS) $(C_INCLUDES) $(OPT) -Wall -fdata-sections -ffunction-sections ifeq ($(DEBUG), 1) CFLAGS += -g -gdwarf-2 endif # Generate dependency information CFLAGS += -MMD -MP -MF"$(@:%.o=%.d)" ####################################### # LDFLAGS ####################################### # link script LDSCRIPT = STM32F103C8Tx_FLASH.ld # libraries LIBS = -lc -lm -lnosys LIBDIR = LDFLAGS = $(MCU) -specs=nano.specs -T$(LDSCRIPT) $(LIBDIR) $(LIBS) -Wl,-Map=$(BUILD_DIR)/$(TARGET).map,--cref -Wl,--gc-sections # default action: build all all: $(BUILD_DIR)/$(TARGET).elf $(BUILD_DIR)/$(TARGET).hex $(BUILD_DIR)/$(TARGET).bin ####################################### # build the application ####################################### # list of objects OBJECTS = $(addprefix $(BUILD_DIR)/,$(notdir $(C_SOURCES:.c=.o))) vpath %.c $(sort $(dir $(C_SOURCES))) # list of ASM program objects OBJECTS += $(addprefix $(BUILD_DIR)/,$(notdir $(ASM_SOURCES:.s=.o))) vpath %.s $(sort $(dir $(ASM_SOURCES))) $(BUILD_DIR)/%.o: %.c Makefile | $(BUILD_DIR) $(CC) -c $(CFLAGS) -Wa,-a,-ad,-alms=$(BUILD_DIR)/$(notdir $(<:.c=.lst)) $< -o $@ $(BUILD_DIR)/%.o: %.s Makefile | $(BUILD_DIR) $(AS) -c $(CFLAGS) $< -o $@ $(BUILD_DIR)/$(TARGET).elf: $(OBJECTS) Makefile $(CC) $(OBJECTS) $(LDFLAGS) -o $@ $(SZ) $@ $(BUILD_DIR)/%.hex: $(BUILD_DIR)/%.elf | $(BUILD_DIR) $(HEX) $< $@ $(BUILD_DIR)/%.bin: $(BUILD_DIR)/%.elf | $(BUILD_DIR) $(BIN) $< $@ $(BUILD_DIR): md $@ ####################################### # clean up ####################################### clean: -rm -fR $(BUILD_DIR) ####################################### # dependencies ####################################### -include $(wildcard $(BUILD_DIR)/*.d) # *** EOF *** При прошивке через st-link программой stm32 st-link utulity, я получаю ошибку: "File empty or corrupted!"
    • Guest Владимир
      By Guest Владимир
      Доброго времени суток.
      Есть условный  конвейер, и по нему двигаются N-ыме товары с qr штрихкодами. Нужно разработать сканер, который чем быстрее будет работать, тем лучше.
      Посоветуйте какие то камеры и статьи/книги о подобном.
    • Guest User1324
      By Guest User1324
      Здравствуйте, помогите подключить USB-флешку к STM32F103RCT6, нужна дополнить принципиальную схему. Если есть возможность нарисовать.
    • By Tokes
      Здравствуйте.
      CUBEMX + CUBEIDE + PUTTY + STLINK V2
      Есть blue pill. Создал новый проект в CUBEMX. Включил там USB как COM порт. Завёл приём сообщений (модифицировал static CDC_Receive_FS функцию). Всё хорошо работает ровно до тех пор, пока в CUBEIDE не нажимаю F11 (build + flash + debug). После этого необходимо руками вытаскивать и засовывать кабель, чтобы можно было продолжать пользоваться терминалом. В то же время достаточно коснуться контакта "USB-" - и происходит тот самый желанный реконнект, после которого достаточно нажать restart session в терминале и всё продолжает работать нормально. 
      Вопрос - как сделать программно, чтобы при старте устройство ("com port" или "usb com emulator") само себя "переподключало"?
    • By Стальной
      Здравствуйте!
      Интересует мнение коллег по правильному питанию мощных МК. Имеется STM32F722VCT6. Делаю для себя новый отладочный стенд. На нем будут обкатываться различные задачи, поставлю плюсом к МК всякую периферию, обязательно i2c память (из серии AT24Cxx), MAX3485, возможно какой-то дисплей, SD-карту, может быть SIM900 и NAND. Первичный источник - думаю, USB хватит.
      Вопрос - как организовать питание МК? Имеет ли смысл цифровую часть (а мб и часть периферийного зоопарка) питать импульсной системой, а аналоговую часть кренкой? Или всё кренкой запитать? Какие идеи?
      Спасибо)
      ЗЫ Сейчас использую стенд на STM32F407VET6, сделанный на коленках, все кренкой питается. Но там периферия изготавливается по мере необходимости и надевается отдельно на гребенки.
  • Сообщения

    • К 23 февраля объявляется скидка на неделю... В честь праздника ценник на комплект -6000 рублей. По окончании ровно недели- ценник верну
    • У многих китайцев, которые работают в экономических зонах РФ (ТОР), уже имеется наше гражданство и их невозможно ограничить в пропуске границы. И таких уже дофига.
    • Объявляется праздничная скидка на неделю, дальше цену возвращаем. Цена в течение недели будет 5700.
    • Предпраздничная цена )))600+пересыл.
    • Не только эта причина, есть и другая - отечественные мастерские еще с прошлого века прославились кидаловом. Поэтому Витюше верят больше.  Опять же, если Витюша и кинет, то ему, в отличие от мастерской, можно запросто морду набить.   
    • @malenich , это для вас рашка, а для меня Россия. Это моя Родина, я гражданин этой страны и проживаю в ней с рождения. И меня, как гражданина России, волнуют в первую очередь наши российские проблемы, по крайней мере гораздо больше внутриукраинских, особенно таких, которые характерны для многих стран, включая и мою. Поведение наших пропагандистских СМИ понятно - им за это бешеные бабки платят, но Вы-то  на кой ляд тащите сюда их пропаганду? Кто Вас до детей допустил, у Вас же начисто отключено критическое мышление! Чему Вы их научите? Кричать хайль?   @Pont 007 , протесты против размещения с подозрением на заражение понятны, но вот официальный запрет на въезд в страну  граждан страны пахнет совсем по другому: Россия прекратит пропуск граждан Китая через свою границу с нуля часов 20 февраля по местному времени — распоряжение об этом накануне подписал премьер Михаил Мишустин.
×
×
  • Create New...