STM32 новичку в ARM что к чему

Кто любит RISC в жизни, заходим, не стесняемся.
Ответить
Собутыльник Кота
Аватара пользователя
Сообщения: 2567
Зарегистрирован: Вт май 01, 2018 19:44:47

Сообщение VladislavS »

На пятничную "разборку" не тянет. :( Тык!
Реклама
Друг Кота
Сообщения: 6452
Зарегистрирован: Пт сен 13, 2013 13:11:31

Сообщение a5021 »

Не, так не честно. :) Я был не в курсе, что этот вопрос только что на изи обсуждался.
Реклама
Друг Кота
Аватара пользователя
Сообщения: 3385
Зарегистрирован: Пн окт 11, 2010 19:00:08

Сообщение Мурик »

Это одни из грабель, на которые наступают новички. Просто нужно запомнить что флаги необходимо сбрасывать вначале обработчика, а не в конце.
Друг Кота
Сообщения: 6452
Зарегистрирован: Пт сен 13, 2013 13:11:31

Сообщение a5021 »

Да можно и в конце, только не перед самым выходом. Вот так уже работает:

Код: Выделить всё

void TIM4_IRQHandler(void) {
  GPIOA->ODR ^= 1;
  TIM4->SR = ~TIM_SR_UIF;
  TIM4->SR;
}
Реклама
Эиком - электронные компоненты и радиодетали
Друг Кота
Сообщения: 6452
Зарегистрирован: Пт сен 13, 2013 13:11:31

Сообщение a5021 »

Документация у стм-ов местами просто "Ад и Израиль". Читаю RM0008 (STM32F103) в части I2C операций. Пишут какую-то дикую херню:
The master can decide to enter Transmitter or Receiver mode depending on the LSB of the
slave address sent.

In 7-bit addressing mode,
- To enter Transmitter mode, a master sends the slave address with LSB reset.
- To enter Receiver mode, a master sends the slave address with LSB set
Дебилы вы сраные -- мысленно обращаюсь я к составителям документации -- из-за вас только время лишнее потерял. Не в адресе должен быть "LSB reset", а следующий бит после адреса. При этом, перед записью в I2C_DR, 7 бит адреса должны быть выравняны влево, а оставшийся младший бит уже определять тип операции запись/чтение. Но про это в RM0008 ни пол слова.
Реклама
Собутыльник Кота
Аватара пользователя
Сообщения: 2567
Зарегистрирован: Вт май 01, 2018 19:44:47

Сообщение VladislavS »

Блин, это же стандарт, про это даже на WiKi расписано. Как это может вызывать затруднения?
Реклама
Друг Кота
Сообщения: 6452
Зарегистрирован: Пт сен 13, 2013 13:11:31

Сообщение a5021 »

Вы не из составителей документации будете? Сильно уж не понимаете в чем суть вопроса.
Опытный кот
Аватара пользователя
Сообщения: 819
Зарегистрирован: Вт окт 23, 2012 13:17:25
Откуда: Прокопьевск

Сообщение Oxford »

[uquote="a5021",url="/forum/viewtopic.php?p=3503937#p3503937"]Документация у стм-ов местами просто "Ад и Израиль". Читаю RM0008 (STM32F103) в части I2C операций. Пишут какую-то дикую херню:
The master can decide to enter Transmitter or Receiver mode depending on the LSB of the
slave address sent.

In 7-bit addressing mode,
- To enter Transmitter mode, a master sends the slave address with LSB reset.
- To enter Receiver mode, a master sends the slave address with LSB set
Дебилы вы сраные -- мысленно обращаюсь я к составителям документации -- из-за вас только время лишнее потерял. Не в адресе должен быть "LSB reset", а следующий бит после адреса. При этом, перед записью в I2C_DR, 7 бит адреса должны быть выравняны влево, а оставшийся младший бит уже определять тип операции запись/чтение. Но про это в RM0008 ни пол слова.[/uquote]

Все правильно там написано.
Инженер R@D

Telegram чат: https://t.me/radiowolf или в поиске приложения @radiowolf. Личка:@cncoxford
Контактная информация:
Друг Кота
Сообщения: 6452
Зарегистрирован: Пт сен 13, 2013 13:11:31

Сообщение a5021 »

Я вас поздравляю с этим "открытием". Стало быть, в адресе младший бит надо сбрасывать перед записью и взводить перед чтением? Не хотите попробовать?
Собутыльник Кота
Аватара пользователя
Сообщения: 2567
Зарегистрирован: Вт май 01, 2018 19:44:47

Сообщение VladislavS »

[uquote="a5021",url="/forum/viewtopic.php?p=3503990#p3503990"]Я вас поздравляю с этим "открытием". Стало быть, в адресе младший бит надо сбрасывать перед записью и взводить перед чтением? Не хотите попробовать?[/uquote]Именно так.
Спойлер

Код: Выделить всё

#define EE_HW_ADR 0         //Адрес заданный ножками A0,A1,A2 на микросхеме 24C512
#define EE_I2C_PORT I2C1    //I2C-порт процессора

EE_24C eeprom(EE_I2C_PORT,EE_HW_ADR);  //Создаём объект EEPROM

//Конструктор
EE_24C::EE_24C(I2C_TypeDef *pi2c, uint8_t hw_adr) 
{ 
  pI2C=pi2c; 
  w_adr=0xA0+((hw_adr&0x7)<<1); 
  r_adr=0xA1+((hw_adr&0x7)<<1); 
};

//Чтение байта по адресу
bool EE_24C::ReadByte(uint16_t adr, uint8_t *data)
{
  while((pI2C->SR2 & I2C_SR2_BUSY));
  
  pI2C->CR1 = I2C_CR1_PE | I2C_CR1_START;
  while(!(pI2C->SR1 & I2C_SR1_SB));
  pI2C->DR = w_adr;                               // w_adr = 0xA0
  while(!(pI2C->SR1 & I2C_SR1_ADDR))
  {
    if(pI2C->SR1 & I2C_SR1_AF)
    {
      pI2C->CR1 = I2C_CR1_PE | I2C_CR1_STOP;
      return false;
    }
  };
  pI2C->SR2;
  while(!(pI2C->SR1 & I2C_SR1_TXE));
  pI2C->DR = adr>>8;
  while(!(pI2C->SR1 & I2C_SR1_TXE));
  pI2C->DR = adr;
  while(!((pI2C->SR1 & I2C_SR1_TXE) && (pI2C->SR1 & I2C_SR1_BTF)));   
  pI2C->CR1 = I2C_CR1_PE | I2C_CR1_START | I2C_CR1_ACK;                //START
  while(!(pI2C->SR1 & I2C_SR1_SB));
  pI2C->DR = r_adr;                                                     // r_adr = 0xA1
  while(!(pI2C->SR1 & I2C_SR1_ADDR));
  pI2C->SR2;
  pI2C->CR1 = I2C_CR1_PE | I2C_CR1_STOP;
  while(!(pI2C->SR1 & I2C_SR1_RXNE)); 
  *data = pI2C->DR;
  
  return true;
};
Последний раз редактировалось VladislavS Вт ноя 13, 2018 19:10:26, всего редактировалось 1 раз.
Друг Кота
Сообщения: 6452
Зарегистрирован: Пт сен 13, 2013 13:11:31

Сообщение a5021 »

[uquote="VladislavS",url="/forum/viewtopic.php?p=3504022#p3504022"]Именно так.[/uquote]
У вас со зрением плохо или с английским?
Последний раз редактировалось a5021 Вт ноя 13, 2018 18:52:32, всего редактировалось 1 раз.
Собутыльник Кота
Аватара пользователя
Сообщения: 2567
Зарегистрирован: Вт май 01, 2018 19:44:47

Сообщение VladislavS »

Страница 769.
Изображение
i2c.png
(6.08 КБ) 710 скачиваний
Как это можно по другому трактовать? Address и Device Address это разные вещи. Младший бит адреса отвечает за направление передачи. У всех работает, только ты один д'Артаньян :)

Неужели никогда вот такую картинку не видел?
Изображение
Друг Кота
Аватара пользователя
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

Сообщение dosikus »

a5021, ляпов в мануале на F1 предостаточно, не реагируй так. Бывало и в другие линейки перестаскивали копипастом.
А что у остальных с языком все так плохо?

VladislavS, в цитате четко прописано - режим манипулируется именно младшим битом 7битного адреса , что есть ляп. Я понимаю что у тебя амбиции, но факт есть факт...
Последний раз редактировалось dosikus Вт ноя 13, 2018 19:11:12, всего редактировалось 1 раз.
Друг Кота
Сообщения: 6452
Зарегистрирован: Пт сен 13, 2013 13:11:31

Сообщение a5021 »

[uquote="VladislavS",url="/forum/viewtopic.php?p=3504085#p3504085"]Как это можно по другому трактовать? Address и Device Address это разные вещи.[/uquote]
Ну-ка, ну-ка. В чем принципиальная разница, не сформулируете?
Младший бит адреса отвечает за направление передачи.
Это вы только что из носа выковыряли или мож вам пойти самому вику почитать, которой вы надысь козыряли? Это ничего, что семибитная адресация в I2C ? "Младший бит", в вашей системе координат, восьмым тогда получается. Семибитная адресация восемью битами, да? Это популярное изложение от и для умственно-отсталых?

У всех работает, только ты один д'Артаньян
Вы за себя ответить не можете, но замахиваетесь, как обычно, на ответ за всех. Поздравляю!
Неужели никогда вот такую картинку не видел?
Изображение
Для вас это означает худшее -- у вас все плохо не с английским или зрением, а со зрением и английским одновременно. На этой картинке семь бит в адресе и два вне его. Хоть усрись, а менять LSB в адресе ни к чему хорошему не приведет. Стыдобища!

Добавлено after 1 minute 45 seconds:
[uquote="dosikus",url="/forum/viewtopic.php?p=3504120#p3504120"]a5021, ляпов в мануале на F1 предостаточно, не реагируй так.[/uquote]
Все никак не привыкну.
Друг Кота
Аватара пользователя
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

Сообщение dosikus »

a5021, спасибо HHIMERA в свое время носом ткнул, так же был в непонятках.
Ну не было у них много времени на чистку , надо было быстрей ляпать...
Собутыльник Кота
Аватара пользователя
Сообщения: 2567
Зарегистрирован: Вт май 01, 2018 19:44:47

Сообщение VladislavS »

Можно подумать это я время потерял на этой элементарщине.
[uquote="a5021",url="/forum/viewtopic.php?p=3503937#p3503937"]Дебилы вы сраные -- мысленно обращаюсь я к составителям документации -- из-за вас только время лишнее потерял.[/uquote]

Смотрим страницу 757. Английским по белому написано что адрес передаётся 8-битами.
Изображение
I2C_2.png
(55.6 КБ) 620 скачиваний
Вменяемый человек подумает, а как же это, 7-битный адрес 8-ю битами? А у того кто хоть раз раньше видел что такое I2C даже сомнения не возникнет, что "лишний" бит это и есть RW.

Так что, остынь и читай спецификацию I2C - пригодится в будущем.
Друг Кота
Сообщения: 6452
Зарегистрирован: Пт сен 13, 2013 13:11:31

Сообщение a5021 »

[uquote="dosikus",url="/forum/viewtopic.php?p=3504132#p3504132"]Ну не было у них много времени на чистку , надо было быстрей ляпать...[/uquote]
Это да. Я тут на днях решил экспортнуть PDF референса в текстовый формат и распарсить на предмет имен регистров, их дефолтных значений и смещений относительно базового адреса. В процессе этого выяснилось, что практически каждая глава имеет свои собственные особенности форматирования и нюансы оформления. Лично у меня сложилось впечатление, что документ готовился многими разными людьми и/или командами, которые не имели строгой координации друг с другом. Не знаю, насколько это близко к действительности, но мне показалось, что чуть ни за каждый блок периферии отвечали разные разработчики, которые потом же и составляли документацию. Часть документации, возможно, составлялась техническими писателями, которые к разработчикам не относятся. В итоге получился такой вот компот.
Друг Кота
Аватара пользователя
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

Сообщение dosikus »

VladislavS, спецификацию на i2c разгребал в свое время http://mcu.goodboard.ru/viewtopic.php?id=14.
Для тебя или меня это просто и легко, однако те же адепты SPL и калокуба нарываются на эти "грабли" достаточно регулярно. Почему и говорю, что если берутся описывать интерфейс -так не допускали бы неоднозначеости ...
Друг Кота
Сообщения: 6452
Зарегистрирован: Пт сен 13, 2013 13:11:31

Сообщение a5021 »

[uquote="VladislavS",url="/forum/viewtopic.php?p=3504141#p3504141"]Вменяемый человек подумает, а как же это, 7-битный адрес 8-ю битами?[/uquote]
Это тот же "вменяемый", что недавно утверждал, будто "Address и Device Address это разные вещи" или уже другой?
А у того кто хоть раз раньше видел что такое I2C даже сомнения не возникнет, что "лишний" бит это и есть RW.
Вторично призываю вас научиться говорить и отвечать за себя. Не нужно отвечать за тех, "кто хоть раз раньше видел". Я вот не так давно I2C раскапывал для nrf52832 и референс там просто лютый, если сравнивать с стм-овским, но никаких накладок или недопонимания там у меня не возникло.
Так что, остынь и читай спецификацию I2C - пригодится в будущем.
Засуньте себе ваши сверх-ценные советы.
Собутыльник Кота
Аватара пользователя
Сообщения: 2567
Зарегистрирован: Вт май 01, 2018 19:44:47

Сообщение VladislavS »

Если у тебя обычный I2C столько эмоций вызвал, боюсь представить что будет после USB и Ethernet.
Ответить

Вернуться в «ARM»