STM32 новичку в ARM что к чему
- Сообщения: 2567
- Зарегистрирован: Вт май 01, 2018 19:44:47
- Реклама
- Сообщения: 6452
- Зарегистрирован: Пт сен 13, 2013 13:11:31
Не, так не честно.
Я был не в курсе, что этот вопрос только что на изи обсуждался.
- Сообщения: 3385
- Зарегистрирован: Пн окт 11, 2010 19:00:08
Это одни из грабель, на которые наступают новички. Просто нужно запомнить что флаги необходимо сбрасывать вначале обработчика, а не в конце.
- Сообщения: 6452
- Зарегистрирован: Пт сен 13, 2013 13:11:31
Да можно и в конце, только не перед самым выходом. Вот так уже работает:
Код: Выделить всё
void TIM4_IRQHandler(void) {
GPIOA->ODR ^= 1;
TIM4->SR = ~TIM_SR_UIF;
TIM4->SR;
}- Сообщения: 6452
- Зарегистрирован: Пт сен 13, 2013 13:11:31
Документация у стм-ов местами просто "Ад и Израиль". Читаю RM0008 (STM32F103) в части I2C операций. Пишут какую-то дикую херню:
Дебилы вы сраные -- мысленно обращаюсь я к составителям документации -- из-за вас только время лишнее потерял. Не в адресе должен быть "LSB reset", а следующий бит после адреса. При этом, перед записью в I2C_DR, 7 бит адреса должны быть выравняны влево, а оставшийся младший бит уже определять тип операции запись/чтение. Но про это в RM0008 ни пол слова.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
- Реклама
- Сообщения: 6452
- Зарегистрирован: Пт сен 13, 2013 13:11:31
Вы не из составителей документации будете? Сильно уж не понимаете в чем суть вопроса.
[uquote="a5021",url="/forum/viewtopic.php?p=3503937#p3503937"]Документация у стм-ов местами просто "Ад и Израиль". Читаю RM0008 (STM32F103) в части I2C операций. Пишут какую-то дикую херню:
Все правильно там написано.
Дебилы вы сраные -- мысленно обращаюсь я к составителям документации -- из-за вас только время лишнее потерял. Не в адресе должен быть "LSB reset", а следующий бит после адреса. При этом, перед записью в I2C_DR, 7 бит адреса должны быть выравняны влево, а оставшийся младший бит уже определять тип операции запись/чтение. Но про это в RM0008 ни пол слова.[/uquote]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
Все правильно там написано.
Инженер R@D
Telegram чат: https://t.me/radiowolf или в поиске приложения @radiowolf. Личка:@cncoxford
Telegram чат: https://t.me/radiowolf или в поиске приложения @radiowolf. Личка:@cncoxford
- Сообщения: 6452
- Зарегистрирован: Пт сен 13, 2013 13:11:31
Я вас поздравляю с этим "открытием". Стало быть, в адресе младший бит надо сбрасывать перед записью и взводить перед чтением? Не хотите попробовать?
- Сообщения: 2567
- Зарегистрирован: Вт май 01, 2018 19:44:47
[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 раз.
- Сообщения: 2567
- Зарегистрирован: Вт май 01, 2018 19:44:47
Страница 769.
Как это можно по другому трактовать? Address и Device Address это разные вещи. Младший бит адреса отвечает за направление передачи. У всех работает, только ты один д'Артаньян 
Неужели никогда вот такую картинку не видел?

Неужели никогда вот такую картинку не видел?

- Сообщения: 3604
- Зарегистрирован: Пн июл 28, 2008 22:12:01
a5021, ляпов в мануале на F1 предостаточно, не реагируй так. Бывало и в другие линейки перестаскивали копипастом.
А что у остальных с языком все так плохо?
VladislavS, в цитате четко прописано - режим манипулируется именно младшим битом 7битного адреса , что есть ляп. Я понимаю что у тебя амбиции, но факт есть факт...
А что у остальных с языком все так плохо?
VladislavS, в цитате четко прописано - режим манипулируется именно младшим битом 7битного адреса , что есть ляп. Я понимаю что у тебя амбиции, но факт есть факт...
Последний раз редактировалось dosikus Вт ноя 13, 2018 19:11:12, всего редактировалось 1 раз.
- Сообщения: 6452
- Зарегистрирован: Пт сен 13, 2013 13:11:31
[uquote="VladislavS",url="/forum/viewtopic.php?p=3504085#p3504085"]Как это можно по другому трактовать? Address и Device Address это разные вещи.[/uquote]
Ну-ка, ну-ка. В чем принципиальная разница, не сформулируете?
Добавлено after 1 minute 45 seconds:
[uquote="dosikus",url="/forum/viewtopic.php?p=3504120#p3504120"]a5021, ляпов в мануале на F1 предостаточно, не реагируй так.[/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
a5021, спасибо HHIMERA в свое время носом ткнул, так же был в непонятках.
Ну не было у них много времени на чистку , надо было быстрей ляпать...
Ну не было у них много времени на чистку , надо было быстрей ляпать...
- Сообщения: 2567
- Зарегистрирован: Вт май 01, 2018 19:44:47
Можно подумать это я время потерял на этой элементарщине.
[uquote="a5021",url="/forum/viewtopic.php?p=3503937#p3503937"]Дебилы вы сраные -- мысленно обращаюсь я к составителям документации -- из-за вас только время лишнее потерял.[/uquote]
Смотрим страницу 757. Английским по белому написано что адрес передаётся 8-битами.
Вменяемый человек подумает, а как же это, 7-битный адрес 8-ю битами? А у того кто хоть раз раньше видел что такое I2C даже сомнения не возникнет, что "лишний" бит это и есть RW.
Так что, остынь и читай спецификацию I2C - пригодится в будущем.
[uquote="a5021",url="/forum/viewtopic.php?p=3503937#p3503937"]Дебилы вы сраные -- мысленно обращаюсь я к составителям документации -- из-за вас только время лишнее потерял.[/uquote]
Смотрим страницу 757. Английским по белому написано что адрес передаётся 8-битами.
Так что, остынь и читай спецификацию I2C - пригодится в будущем.
- Сообщения: 6452
- Зарегистрирован: Пт сен 13, 2013 13:11:31
[uquote="dosikus",url="/forum/viewtopic.php?p=3504132#p3504132"]Ну не было у них много времени на чистку , надо было быстрей ляпать...[/uquote]
Это да. Я тут на днях решил экспортнуть PDF референса в текстовый формат и распарсить на предмет имен регистров, их дефолтных значений и смещений относительно базового адреса. В процессе этого выяснилось, что практически каждая глава имеет свои собственные особенности форматирования и нюансы оформления. Лично у меня сложилось впечатление, что документ готовился многими разными людьми и/или командами, которые не имели строгой координации друг с другом. Не знаю, насколько это близко к действительности, но мне показалось, что чуть ни за каждый блок периферии отвечали разные разработчики, которые потом же и составляли документацию. Часть документации, возможно, составлялась техническими писателями, которые к разработчикам не относятся. В итоге получился такой вот компот.
Это да. Я тут на днях решил экспортнуть PDF референса в текстовый формат и распарсить на предмет имен регистров, их дефолтных значений и смещений относительно базового адреса. В процессе этого выяснилось, что практически каждая глава имеет свои собственные особенности форматирования и нюансы оформления. Лично у меня сложилось впечатление, что документ готовился многими разными людьми и/или командами, которые не имели строгой координации друг с другом. Не знаю, насколько это близко к действительности, но мне показалось, что чуть ни за каждый блок периферии отвечали разные разработчики, которые потом же и составляли документацию. Часть документации, возможно, составлялась техническими писателями, которые к разработчикам не относятся. В итоге получился такой вот компот.
- Сообщения: 3604
- Зарегистрирован: Пн июл 28, 2008 22:12:01
VladislavS, спецификацию на i2c разгребал в свое время http://mcu.goodboard.ru/viewtopic.php?id=14.
Для тебя или меня это просто и легко, однако те же адепты SPL и калокуба нарываются на эти "грабли" достаточно регулярно. Почему и говорю, что если берутся описывать интерфейс -так не допускали бы неоднозначеости ...
Для тебя или меня это просто и легко, однако те же адепты SPL и калокуба нарываются на эти "грабли" достаточно регулярно. Почему и говорю, что если берутся описывать интерфейс -так не допускали бы неоднозначеости ...
- Сообщения: 6452
- Зарегистрирован: Пт сен 13, 2013 13:11:31
[uquote="VladislavS",url="/forum/viewtopic.php?p=3504141#p3504141"]Вменяемый человек подумает, а как же это, 7-битный адрес 8-ю битами?[/uquote]
Это тот же "вменяемый", что недавно утверждал, будто "Address и Device Address это разные вещи" или уже другой?
Это тот же "вменяемый", что недавно утверждал, будто "Address и Device Address это разные вещи" или уже другой?
Вторично призываю вас научиться говорить и отвечать за себя. Не нужно отвечать за тех, "кто хоть раз раньше видел". Я вот не так давно I2C раскапывал для nrf52832 и референс там просто лютый, если сравнивать с стм-овским, но никаких накладок или недопонимания там у меня не возникло.А у того кто хоть раз раньше видел что такое I2C даже сомнения не возникнет, что "лишний" бит это и есть RW.
Засуньте себе ваши сверх-ценные советы.Так что, остынь и читай спецификацию I2C - пригодится в будущем.
- Сообщения: 2567
- Зарегистрирован: Вт май 01, 2018 19:44:47
Если у тебя обычный I2C столько эмоций вызвал, боюсь представить что будет после USB и Ethernet.


