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

Вебинар «Экосистема MEAN WELL. Решения для любых задач электропитания» (20.05.2021)

Приглашаем 20 мая на вебинар, посвященный линейке поставок компании MEAN WELL и ее подходу к производству источников питания — как экосистемы продукции и услуг, которая позволяет подобрать оптимальный источник питания для любых задач электропитания. Рассмотрим весь спектр выпускаемой продукции MEAN WELL в области AC/DC-, DC/DC- и DC/AC-преобразователей с подробным разбором интересных и уникальных новинок, их применении и многое другое.

Подробнее

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

Барьерные силовые клеммы от Degson – расширение складского ассортимента Компэл

Обновленная линейка барьерных клеммных блоков Degson, поступивших на склад Компэл, содержит широкий ряд клемм, подходящих для соединения проводников различного сечения (от 22AWG до 10AWG). Барьерные клеммные колодки сочетают в себе удобство, простоту и надежность соединения. Это достигается за счет ответственного производства и использования высококачественных материалов. Винтовые клеммные блоки барьерного типа Degson предназначены в первую очередь для коммутации в сильноточных цепях, например, в распределительных и измерительных системах.

Подробнее

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

Share this post


Link to post
Share on other sites

Материалы вебинара «Решения Analog Devices для гальванической изоляции. Обзор технологий и новинок»

Опубликованы материалы вебинара, посвященного решениям Analog Devices для гальванической изоляции. На вебинаре рассказали о: технологии гальванической изоляции iCoupler, цифровых изоляторах, технологии isoPower, гальванически изолированных интерфейсах (RS-485, CAN, USB, I2C, LVDS) и многом другом. Материалы вебинара будут интересны разработчикам промышленной автоматики и медицинской техники.

Подробнее

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...

  • Сообщения

    • Да надо конечно... Но я же не могу  вложить в текст песни всю, указанную вами, последовательность мероприятий ... Песня получится размером, примерно, как сочинение того же Ульянова. Попробуйте спеть его работу "Государство и революция"... Никто даже слушать не станет.  Да и нет в России такого народа, который мог бы это осуществить. А тот народ, что есть, готов и дальше жевать сопли и просирать всё чего достигли его отцы и деды... включая не только справедливый общественный строй и права трудящихся, но и территории. А все, кто мог оказать реальное  противодействие... они на давно небесах...с 1945го года уже. Вот потому только на них и надежда, в песне.
    • Всем привет,хочу собрать регулируемый блок питания на LM317-TIP2955,подскажите,диоды MBR10100 подайдут?
    • Вопрос спорный. Резистор нужного номинала и мощности подобрать гораздо проще, чем лампочку с нужными параметрами. Я вот, например, сильно затруднился бы найти лампочку на 220 В с сопротивлением холодной нити десяток килоом.
    • подшивать не научили = шею натрёт...
    • @Vlad90 Если первичная обмотка недомотана, то насыщение сердечника, а значит, и нагрев, гарантированы. Однако, стоит такому трансформатору дать нагрузку, как нагрев чудесным образом снижается, пока снова не начинает расти из-за нагрева обмоток протекающим по ним током.
    • Где может найти другую работу пара тысяч человек, если кроме градообразующего предприятия других производств, в данном населенном пункте (как и в близко прилежащих), просто НЕТ? А те что были, разрушены еще в конце 90-х. Это одному человеку можно еще как-то выкрутиться, а тут такая толпа сразу. Ну кто похитрее конечно смог пристроиться, но на всех рабочих мест просто не было (хоть пахарем, хоть инженером).
  • Similar Content

    • By Михаил Дементьев
      Всем добрый день!
      Столкнулся с такой проблемой. Собрал самодельный igbt, и все хорошо работает, пока подаю на затвор напряжение с источника. Далее через ЦАП подключил stm32f100 к затвору и попытался управлять выходным током биполярника. В итоге вот что получилось: тестирую stm32 без igbt, ЦАП стабильно выдаёт то, чем я прошил микроконтроллер, но как только stm32 подключаю к затвору igbt, то stm32 перестаёт работать, в чем может быть проблема?
    • Guest Тот самый чайник
      By Guest Тот самый чайник
      Добрых времени суток, недавно начал изучать микроконтроллер STM32. Уже собрал контроллер в виде схемы, но не могу понять пару моментов а именно с подключением к нему датчиков. (буду благодарен если картинками кинете ещё).

      Микроконтроллер я как понял он питается и управляется с помощью 3.3В а 5В нежелательно,  поскольку мк может сгореть. Хотя многие говорят можно подать, а в дотушите нету упоминания, можете разъяснить этот момент. (знаю можно устранить с помощью подтягивающего резистора, но всё же, хочу знать от мнение асов и кто уже просветлён).

      Есть датчики температуры, уровень жидкости и её температура, скорости вращения. Их я как понимаю можно подключить на МК через усилитель, ФНЧ и комутатор аналоговых сигналов а затем на МК пустить. (питание через гальваническую развязку сделаю), так можно делать? Интересует схема этих датчиков которые я перечислил, желательно для промышленности поскольку не могу выбрать а какие-то не могу найти потому что не знаю что поставить. 

      Ещё читал что аналоговые датчики можно подключать напрямую из датчиков к МК (через делитель). Что скажите?

      И такой момент, на МК есть вводы и выводы. Т.е. программно в них можно прописать какой пин будет вводом а какой выводом? Дискретным или аналоговым, можете рассказать? Или на статью с разъяснением скиньте.

      Пока что так.

       
    • By admin
      В видео поговорим об энергоэффективности микроконтроллеров. Сравним потребление в режима сна arduino, blue pill с STM32F103 и представителя новой линейки энергоэффективных микроконтроллеров от st — STM32L552.
      Подробную информацию об линейке L5 можно найти тут: https://www.compel.ru/lib/143383
      Пи тест часть 1: https://youtu.be/ozu1IUjH1_Q
      Пи тест часть 2: https://youtu.be/uLOWYE-JJpA
    • By Стальной
      Доброго времени суток!
      Неделю не могу запустить DCMI на STM32F407VET6. 
      Работаю через HAL, инициализация кубом. К МК подключена камера OV7670. Камера дает картинку 640х480, и такое изображение мне негде хранить. Поэтому через фичу CROP хочу вырезать картинку 160х128 из центра под имеющийся экран.
      Ниже примерный код, без настройки камеры. Камера тактируется от 16 МГц MCO. Сигналы поступают на выводы МК, посмотрел осциллографом. У камеры есть некоторые настройки, которые тут в коде не показал, так как они влияют только на представление данных, но не на алгоритм захвата данных.
      /* USER CODE BEGIN PV */ uint16_t DCMI_data[20480] = {0}; //128*160=20480 words uint32_t ptr; /* USER CODE END PV */ //тут еще код куба, пропущу его 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 */ MX_GPIO_Init(); MX_DMA_Init(); MX_DCMI_Init(); /* USER CODE BEGIN 2 */ HAL_GPIO_WritePin(GPIOA, GPIO_PIN_15, GPIO_PIN_SET); //снять ресет с матрицы ptr = (uint32_t)(&DCMI_data[0]); HAL_Delay( 500 ); //начать резать с 512 клока строки (256 пиксель), начать резать с 160 строки //захватить 256 клоков (128 пикселей), захватить 160 строк HAL_DCMI_ConfigCrop(&hdcmi, 512, 160, 256, 160); HAL_DCMI_EnableCrop(&hdcmi); /* USER CODE END 2 */ /* Infinite loop */ /* USER CODE BEGIN WHILE */ while (1) { /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ HAL_DCMI_Start_DMA(&hdcmi, DCMI_MODE_SNAPSHOT, ptr, 10240); //однократный захват, 10240 тетрад, 20480 слов, 160*128=40960 пикселей HAL_Delay(1500); } /* USER CODE END 3 */ } В результате в буфере ничего не появляется, DMA туда ничего не кладёт, проверил. Если не вызывать функцию EnableCrop, но какие-то данные появляются, но на экран их корректно отобразить не получается. Также пытался в камере обрезку включить, а не в МК - снова нет данных. Пробовал разные частоты тактирования матрицы давать - без разницы. Отладчиком увидел, что бит EN в регистре конфигурации потока  DMA не снимается, как будто DMA не получал запросов на транзакции. Помогите, пожалуйста, разобраться.
      Проект на яндексДиске
    • By Карен Григорян
      Здравствуйте, товарищи форумчане!
      У меня вот такая проблемка: есть такая схема:

      По сути тут stm32 на который подаётся некоторое постоянное напряжение, а именно на вход PA1. МК получает его, приводит в цифровую форму (разрядность АЦП равна восьми) и выводит их при помощи восьми GPIO выводов, а именно PB0-PB7. Эти выводы соединены со схемой ЦАП, которая преобразует значение, полученное от stm32 обратно в аналоговую форму и выводит в пробнике R2(1).
      Проблема в том результат выводится не верный. Точнее говоря не всегда верный. Когда я подаю 1В, то на выходе получаю 0,99В, что верно. Но когда, например, подаю 300мВ, то получаю 1.8В, что совсем не верно. Код прошивки предельно прост:
        while (1)
        {
              HAL_ADC_Start_IT(&hadc1);
              HAL_Delay(10);
      }
      Код колбека прерывания:
      void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc)
      {
          if(hadc->Instance == ADC1) //check if the interrupt comes from ACD1
          {
            int adc = HAL_ADC_GetValue(&hadc1);
                  HAL_GPIO_WritePin(GPIOB,GPIO_PIN_0,(adc>>0)&1);
                  HAL_GPIO_WritePin(GPIOB,GPIO_PIN_1,(adc>>1)&1);
                  HAL_GPIO_WritePin(GPIOB,GPIO_PIN_2,(adc>>2)&1);
                  HAL_GPIO_WritePin(GPIOB,GPIO_PIN_3,(adc>>3)&1);
                  HAL_GPIO_WritePin(GPIOB,GPIO_PIN_4,(adc>>4)&1);
                  HAL_GPIO_WritePin(GPIOB,GPIO_PIN_5,(adc>>5)&1);
                  HAL_GPIO_WritePin(GPIOB,GPIO_PIN_6,(adc>>6)&1);
                  HAL_GPIO_WritePin(GPIOB,GPIO_PIN_7,(adc>>7)&1);
          }
              }
      На всякий случай вот настройка АЦП в stm32:

      Вот пример неправильного вычисления:

×
×
  • Create New...