С Новым годом! Форум программистов, компьютерный форум, киберфорум
Электроника для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.75/8: Рейтинг темы: голосов - 8, средняя оценка - 4.75
0 / 0 / 0
Регистрация: 11.04.2019
Сообщений: 6
1

Подскажите, с чего начать реализовывать идею

22.10.2024, 01:01. Показов 1552. Ответов 30
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Добрый день!
Хочу ворваться в область программирования + железо, но совершенно не представляю с чего начать, даже не знаю терминологии, чтобы что-то начать искать

Хочу попробовать сделать такую штуку:
Мотор, на оси катушка с ниткой. К нитке привязан груз.
Задавая с телефона какие-то параметры, мотор опускает-поднимает груз

Как это делается? С чего все начинается?

1) Каким образом программа на телефоне может включать/выключать мотор? Допустим, мне нужно проводное соединение.
Как это сделать проще, и как это бывает?
2) Каким образом я могу получить обратную связь? Я видел, существуют модули лазерного дальномера, что-то типа VL53L0X (GY-VL53L0XV2). Как их подключать и куда, так чтобы на телефоне получить с него параметр, и на его основе включать-выключать мотор?

Может есть где почитать про такие совсем простые вещи? А то на этом форуме я посмотрел темы для новичков - пока что сложно все)
Спасибо за помощь!
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
22.10.2024, 01:01
Ответы с готовыми решениями:

Подскажите, с чего начать?
Здравствуйте! Я хочу научиться программировать микроконтроллеры, подскажите что для этого нужно, и...

База данных "Биржа труда": с чего начать и как реализовывать
Подскажите с чего начинать и как его вообще делать. Не знаю как его делать(( Помогите пожалуйста!!!...

Решил начать изучать графику. Подскажите с чего начать
Решил начать изучать графику в паскале. Подскажите с чего начать. Отличается ли графика Турбо...

Подскажите, с чего начать
Поступил в вуз в надежде, что программированию нас будут учить хоть как-то, но на практике мы его...

30
485 / 442 / 135
Регистрация: 03.02.2013
Сообщений: 1,373
22.10.2024, 02:02 2
купить blue pill/black pill, это stm32, модуль bluetooth типа HC-05, для начала общаться в обычном RS-232, на телефоне в маркете есть стандартные приложения для этого, по поводу VL53L0X выход I2C легко примонтируется к stm32 и с ним так же можно общаться по тому же протоколу, на первое время библиотека HAL пойдёт, наперёд скажу нужно будет программатор st link-v2 или хотя бы преобразователь интерфейсов usb->ttl, желательно всё это)


ну либо второй вариант вместо stm32 и HC-05 брать ESP32 с wifi на борту


когда основы связи проштудируем, займёмся обратной связью)
0
4019 / 2565 / 430
Регистрация: 09.09.2017
Сообщений: 11,436
22.10.2024, 10:17 3
Если нужно готовое устройство, а тратить свое время не хочется, проще заказать разработку кому-нибудь другому.
Если нужно сделать и забыть, проще всего, пожалуй, Ардуино. Там куча готовых библиотек и аппаратных модулей под что угодно. Правда, качество и того и другого где-то на уровне "на 5% лучше, чем ничего".
Если же хотите именно научиться работать с железом, берите контроллер. Лучше сразу на отладочной плате - те же Arduino, BluePill, LonganNano и т.п. Для старых контроллеров вроде AVR или PIC плату можно и самостоятельно изготовить (там корпуса приятные), для современных - без опыта не справитесь. Сразу же закапываете HAL, ардуинскую среду разработки, cvavr и прочие автоконфигураторы, хватаете в обнимку даташит и учебник на выбранный камень, и изучаете.
Лично я бы для "фундаментального" подхода предложил AVR (или PIC, или другую 8-битку но с ним я сам незнаком) или что-то из RISC-V (gd32vf103, ch32v103, ch32v203, ...), потому что у них довольно приятный ассемблер. Преимущество 8-битных контроллеров из прошлого тысячелетия - простота. Мало периферии, мало настроек периферии, мало настроек ядра. И огромное количество готового кода, в который можно подсматривать. В общем, невысокий порог входа даже если начинать с ассемблера. Но это же будет недостатком при практическом применении: в какой-то момент просто не хватит мощности и придется переходить на что-то более современное. Но зная одну архитектуру, это будет несложно.
0
1181 / 656 / 113
Регистрация: 15.05.2012
Сообщений: 4,055
22.10.2024, 15:24 4
Найти сотоварища.
0
652 / 350 / 54
Регистрация: 22.09.2023
Сообщений: 1,029
22.10.2024, 18:47 5
Учебник физики за 8 класс (тогда, кажется, электричество проходили), затем научно-популярные книжки А. Айсберга для младшего школьного возраста "Радио? Это очень просто", "Телевидение? Это очень просто!", "Транзистор? Это очень просто!". Если зацепит - полученных знаний будет достаточно, чтобы перейти к более серьезным книгам - книжка "Барьеры" из библиотечки "Квант" для понимания, как работают полупроводники и уже с этими знаниями - "Искусство схемотехники" Хоровица с Хиллом и "Полупроводниковая схемотехника" Титце с Шенком, Причем, если зацепит - читаться и пониматься будет быстро и легко. Если не зацепит - лучше попробовать себя в чем-то другом.

Без чтения литературы (по советам на форуме) максимум, чего можно добиться - тупо повторить какие-нибудь конструкции из интернета. А если в процессе повторения что-то будет сделано неправильно, шанс добиться работоспособности очень мал.
0
814 / 738 / 96
Регистрация: 23.11.2021
Сообщений: 4,160
Записей в блоге: 10
22.10.2024, 20:34 6
Цитата Сообщение от VogdVogd Посмотреть сообщение
Каким образом программа на телефоне может включать/выключать мотор?
Да элементарно через консоль, TTY-ACM в помощь. Консольных приложений полно, я так дистанционное включение иллюминации через bluetooth делал когда-то, да и просто железяки свои любые могу к лопатофону подключить и управлять. Т.е. ноутбук с собой таскать уже почти не нужно.
Цитата Сообщение от VogdVogd Посмотреть сообщение
Каким образом я могу получить обратную связь?
Микроконтроллер выбирай, самые дешевые варианты - ch32v003, STM32F030 и STM32F103. Ну и так далее… Разве что если уж хочешь к лопате подключить, то нужно выбирать МК с USB, т.е. некоторые самые дешевые отпадают.
Цитата Сообщение от VogdVogd Посмотреть сообщение
А то на этом форуме я посмотрел темы для новичков - пока что сложно все
Тогда ничем не помогу. Хотя бы 10 лет своей жизни, а потратить придется для того, чтобы разбираться в элементарных вопросах.

// кстати, а не Вождь ли ты Рязанов из Татарки? ☺
0
4019 / 2565 / 430
Регистрация: 09.09.2017
Сообщений: 11,436
22.10.2024, 21:04 7
Цитата Сообщение от Eddy_Em Посмотреть сообщение
Микроконтроллер выбирай, самые дешевые варианты - ch32v003, STM32F030 и STM32F103. Ну и так далее…
Плохая идея. На самых дешевых тяжело учиться: не хватает периферии, не хватает ног, не хватает памяти. Выбирать нужно в первую очередь те, по которым больше документации. ATmega8 / 328, stm32f103 в первую очередь.
Отдельно НЕ РЕКОМЕНДУЮ ch32v003: и корпус ущербный (часть важных ног не выведена), и с прошивкой проблемы, и ядро урезанное, и периферии мало. Какой-нибудь ch32v203g8 куда лучше. И корпус с крупным шагом, легко запаять. Мне даже удалось сделать отладочную плату без ЛУТа и принтера, просто резаком.
Кстати, чем хороши stm32 и ch32, для их программирования не нужен программатор, достаточно переходника на UART. Который в любом случае будет нужен для отладки.
0
814 / 738 / 96
Регистрация: 23.11.2021
Сообщений: 4,160
Записей в блоге: 10
22.10.2024, 21:41 8
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
stm32f103 в первую очередь
Хоть в остальном согласен, но насчет этого куска унылого дерьма - против. Это же самый ущербный МК в серии! У него даже CAN с USB одновременно работать не могут! Ну и еще настолько много минусов, что некоторые ребята, отчаявшись, вместо чтения эрраты, городят ногодрыжный I2C (как пример), хотя набортный отлично работает, если уметь читать.

Ну, с другой стороны, не умеющие читать так и сидят на абдуринах, калокубах и прочей дряни. Увы, это так: идиоты в наше время преобладают над нормальными людьми уже значительно выше, чем 95%. И всему виной всякие "соцсети" и тот же интернет. Когда-то люди надеялись, что интернет разовьет мощь человеческого мозга, а оказалось абсолютно наоборот: со всякими "чатоми ЖОПЭТЭ" люди еще более быдлом стали. Увы…

// подозреваю, что в следующие полгода я ничего на этом ресурсе написать не смогу. Таковы уж "правила" мира выблядков…
0
0 / 0 / 0
Регистрация: 11.04.2019
Сообщений: 6
22.10.2024, 23:02  [ТС] 9
abit, Начал читать, гуглить, уже есть за что зацепиться, спасибо!

COKPOWEHEU, Идея попробовать научиться что-то делать самому, но без глубокого погружения в саму схемотехнику. В идеале мне нужен "конструктор", который я бы мог программировать, без необходимости самому допивать усилители-генераторы частот и другое низкоуровневое

pyzhman, Да, займусь этим, если не сольюсь на первых шагах))

Dushevny, К сожалению не для меня. В разное время пробовал разбираться именно со схемотехникой, не вышло. Хочу высокий уровень - программирование, контроллеры, вот это

Eddy_Em, Ага спасибо, буду смотреть-пытаться-понимать. Нет, я не тот Вождь, я из Питера)

Спасибо за советы! Информации в инете море, оказывается, пойду читать)
0
4019 / 2565 / 430
Регистрация: 09.09.2017
Сообщений: 11,436
22.10.2024, 23:34 10
Цитата Сообщение от Eddy_Em Посмотреть сообщение
Хоть в остальном согласен, но насчет этого куска унылого дерьма - против. Это же самый ущербный МК в серии!
Я не спорю, что первый блин у ST вышел не слишком удачным. Но на основе f103 многое сделано как в плане самоделок, так и линеек контроллеров. Взять хотя бы настройку портов, open-drain и подтяжек. У какой-нибудь l151 это реализовано куда лучше, но большинство контроллеров наследуют все-таки схему f103-го.
Еще раз: мы обсуждаем на каком МК писать первые хелло-ворлды. Первые полгода для ТС не будет разницы даже по сравнению с AVR.
Цитата Сообщение от Eddy_Em Посмотреть сообщение
городят ногодрыжный I2C (как пример), хотя набортный отлично работает, если уметь читать.
Как-то не довелось работать с I2C на f103. Но на v303 повозиться пришлось. Какого фига они не генерируют прерывание окончания передачи?! А на vf103 тот же код работать не пожелал... но тут уже было лень разбираться.
Не вспомните случайно, какие там грабли на f103, что куберы пропускают?
Цитата Сообщение от VogdVogd Посмотреть сообщение
COKPOWEHEU, Идея попробовать научиться что-то делать самому, но без глубокого погружения в саму схемотехнику. В идеале мне нужен "конструктор", который я бы мог программировать, без необходимости самому допивать усилители-генераторы частот и другое низкоуровневое
Без погружения именно в схемотехнику или и в программирование тоже? Так-то готовых отладочных плат продается море, начиная с той же ардуинки. А с другой стороны, при разработке под контроллеры схемотехника обычно простая. Максимум - прикинуть на пальцах ограничительный резистор к светодиоду или транзистору. Закон Ома, который проходят в 8 классе. Вот если лезть в аналоговую схемотехнику или тем более в СВЧ - вот там боль.
Так что пока рекомендация прежняя - плата Arduino или BluePill.
А дальше все зависит от целей. Если надо просто быстро и коряво решить бытовую задачу, можно взять ST-HAL с тамошним Кубом или ту же ардуиновскую среду разработки. А если именно научиться программировать, от подобной гадости держитесь подальше.
Цитата Сообщение от VogdVogd Посмотреть сообщение
Dushevny, К сожалению не для меня. В разное время пробовал разбираться именно со схемотехникой, не вышло. Хочу высокий уровень - программирование, контроллеры, вот это
Хотя бы основы будут нужны в любом случае. Но их можно будет изучить и несколько позже, когда дорастете до понимания где и зачем это нужно.
0
652 / 350 / 54
Регистрация: 22.09.2023
Сообщений: 1,029
23.10.2024, 09:57 11
Цитата Сообщение от VogdVogd Посмотреть сообщение
В разное время пробовал разбираться именно со схемотехникой, не вышло.
Поэтому я и рекомендовал начать с книг для самых маленьких, в которых сложные вещи объясняются "на пальцах".
Цитата Сообщение от VogdVogd Посмотреть сообщение
Хочу высокий уровень - программирование, контроллеры
Контроллеры без схемотехники невозможны. Или навсегда ограничить себя ардуиной: нет готовой платы-кубика/библиотеки - задача нерешаема.

Добавлено через 5 минут
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
при разработке под контроллеры схемотехника обычно простая. Максимум - прикинуть на пальцах ограничительный резистор к светодиоду или транзистору. Закон Ома, который проходят в 8 классе
Нужно еще понимать пути протекания тока. Иначе виноваты всегда будут плохие транзисторы, а конструкция наполнена магией и колдовством.
0
4019 / 2565 / 430
Регистрация: 09.09.2017
Сообщений: 11,436
23.10.2024, 10:05 12
Цитата Сообщение от Dushevny Посмотреть сообщение
Контроллеры без схемотехники невозможны. Или навсегда ограничить себя ардуиной
Не надо навсегда. Достаточно с нее стартовать, а если затянет, можно будет и углубить знания.
Цитата Сообщение от Dushevny Посмотреть сообщение
Нужно еще понимать пути протекания тока. Иначе виноваты всегда будут плохие транзисторы, а конструкция наполнена магией и колдовством.
На первом этапе, опять-таки не критично. Когда все устройство состоит из BluePill-а и трех готовых модулей, току особо растекаться некуда.
0
814 / 738 / 96
Регистрация: 23.11.2021
Сообщений: 4,160
Записей в блоге: 10
23.10.2024, 12:07 13
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
какие там грабли на f103, что куберы пропускают?
Не помню. Но у меня самого там что-то не зашло с DMA, поэтому только блокирующие операции использую, к сожалению.
0
4019 / 2565 / 430
Регистрация: 09.09.2017
Сообщений: 11,436
23.10.2024, 12:37 14
Цитата Сообщение от Eddy_Em Посмотреть сообщение
Не помню. Но у меня самого там что-то не зашло с DMA, поэтому только блокирующие операции использую, к сожалению.
Я с DMA и не стал заморачиваться. Там же надо сначала выставить адрес девайса, потом адрес регистра и только потом пойдет поток данных. Получается здоровенная пауза в начале работы.
Проще уж на прерываниях, тем более даже на скорости 400 кб/с их будет не слишком много. Отсюда и моя ненависть: в самом конце, когда последний байт передан, нужно послать STOP, но после него следующее прерывание не возникнет. В результате в моей реализации проверка готовности I2C к следующей транзакции выглядит как "не случился ли таймаут?" + "переданы ли все байты?" + "сбросился ли наконец BUSY?"
Кстати удалось сделать достаточно красивый интерфейс, чтобы модуль сначала передал сколько-то байтов, а потом принял. Может пригодиться если адрес регистра не 8-битный. Но, как я уже говорил, писалось под ch32. Попытался портировать на gd32vf, но что-то не взлетело. На stm не переносил.
1
485 / 442 / 135
Регистрация: 03.02.2013
Сообщений: 1,373
24.10.2024, 03:44 15
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Проще уж на прерываниях
если мы говорим про stm32 то не проще, а накладнее что по ресурсам, что по труду

Добавлено через 4 минуты
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Получается здоровенная пауза в начале работы.
и пауза, конечно только при старте, ну воткнули на 15 миллисекунд позже питание, о чём речь, в момент работы, режим Cycle, никакое прерываение его не обгонит уже, более того МК на это не отвлекается, данные сами обновляются в RAM, проверено лично на датчике с потоком 20Мбит/c на stm32h745, вы же знаете чем отличается гарвардская архитектура от фон-неймана?
0
4019 / 2565 / 430
Регистрация: 09.09.2017
Сообщений: 11,436
24.10.2024, 08:24 16
Цитата Сообщение от abit Посмотреть сообщение
если мы говорим про stm32 то не проще, а накладнее что по ресурсам, что по труду
Сомневаюсь, что I2C в stm32f103 сильно отличается от аналогичного в ch32v303.
Цитата Сообщение от abit Посмотреть сообщение
и пауза, конечно только при старте, ну воткнули на 15 миллисекунд позже питание
Пауза в начале каждой операции обмена, а не только при включении питания. Хочется прочитать 3 байта с датчика? Сначала подожди 200 мкс (~30000 тактов) и только потом запустится DMA.
Цитата Сообщение от abit Посмотреть сообщение
вы же знаете чем отличается гарвардская архитектура от фон-неймана?
Какое отношение способ организации адресного пространства имеет к интерфейсу I2C?
0
814 / 738 / 96
Регистрация: 23.11.2021
Сообщений: 4,160
Записей в блоге: 10
24.10.2024, 08:55 17
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Хочется прочитать 3 байта с датчика? Сначала подожди 200 мкс (~30000 тактов) и только потом запустится DMA.
В таких случаях более выгодно использовать блокирующую операцию. А DMA запускать, когда несколько сот байт надо передать или считать. Хотя, как оказалось (как пример - мои попытки считать сразу все изображение из MLX90640), не все устройства умеют отдать за один присест такой поток данных (там пришлось на 2 куска бить).
0
652 / 350 / 54
Регистрация: 22.09.2023
Сообщений: 1,029
24.10.2024, 09:06 18
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Там же надо сначала выставить адрес девайса, потом адрес регистра и только потом пойдет поток данных. Получается здоровенная пауза в начале работы.
Нет нам никакой паузы. Все реализуется конечным автоматом на прерываниях. Причем даже явной переменной состояния конечного автомата не требуется.
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
void i2c::start(bus_address bus_address, sub_address sub_address, void const * buffer, size_t size, dma & dma)
{
    if((Hw->SR2 & I2C_SR2_BUSY) && !(Hw->CR1 & I2C_CR1_STOP))
    {
        // this function must set I2C_SCL to open drain output mode,
        // generate 9 clock cycles and return I2C_SCL to AF open drain mode
        // to flush possible unread zero-bits (which are pulling SDA low) from slave
        extern void generate_9_i2c_clocks();
 
        Hw->CR1 = 1 * I2C_CR1_SWRST;                // restart to prevent hang-up (sometimes unable to generate START)
        generate_9_i2c_clocks();
    }
    Hw->CR1 = 0;    // remove reset.
 
    Result = true;
    Result.reset();
    Address.Bus = bus_address;
    Address.Register = sub_address;
 
    dma.start(buffer, size);
 
    uint32_t const PCLK_FREQ = APB1CLK;
    uint32_t const SCLK_RISE_FREQ = 1 / 0.000001;
 
    Hw->TRISE = 0
        | (PCLK_FREQ / SCLK_RISE_FREQ + 1) * (I2C_TRISE_TRISE & -I2C_TRISE_TRISE)  // SCL rise timings
        ;
 
 
    uint32_t const SCLK_FREQ = 100000;
    Hw->CCR = 0
        | 0 * I2C_CCR_FS                        // 0 = slow speed (100 kHz), 1 = fast speed (400 kHz)
        | 0 * I2C_CCR_DUTY                      // fast speed duty cycle, Tlow/Thigh, 0 = 2:1, 1 = 16:9
        | PCLK_FREQ / SCLK_FREQ / 2 * (I2C_CCR_CCR & -I2C_CCR_CCR)      // Tlow, Thigh time ticks
        ;
 
    Hw->CR2 = 0
        | PCLK_FREQ / 1000000 * (I2C_CR2_FREQ & -I2C_CR2_FREQ)   // Peripheral Clock Frequency, MHz
        | 1 * I2C_CR2_ITERREN                   // Error Interrupt Enable
        | 1 * I2C_CR2_ITEVTEN                   // Event Interrupt Enable
        | 0 * I2C_CR2_ITBUFEN                   // Buffer Interrupt Enable
        | 1 * I2C_CR2_DMAEN                     // DMA Requests Enable
        | 1 * I2C_CR2_LAST                      // DMA Last Transfer
        ;
 
    Hw->CR1 = 0
        | 1 * I2C_CR1_PE                        // Peripheral enable
        | 0 * I2C_CR1_SMBUS                     // SMBus Mode
        | 0 * I2C_CR1_SMBTYPE                   // SMBus Type
        | 0 * I2C_CR1_ENARP                     // ARP Enable
        | 0 * I2C_CR1_ENPEC                     // PEC Enable
        | 0 * I2C_CR1_ENGC                      // General Call Enable
        | 0 * I2C_CR1_NOSTRETCH                 // Clock Stretching Disable (Slave mode)
        | 1 * I2C_CR1_START                     // Start Generation
        | 0 * I2C_CR1_STOP                      // Stop Generation
        | 0 * I2C_CR1_ACK                       // Acknowledge Enable
        | 0 * I2C_CR1_POS                       // Acknowledge/PEC Position (for data reception)
        | 0 * I2C_CR1_PEC                       // Packet Error Checking
        | 0 * I2C_CR1_ALERT                     // SMBus Alert
        | 0 * I2C_CR1_SWRST                     // Software Reset
        ;
}
 
bool i2c::send(bus_address bus_address, sub_address sub_address, void const * from, size_t size)
{
    Debug_i2c.printf(" tx %02X[%02X]:", bus_address, sub_address);
    // repeat if bus failed.
    for(auto attempts = 0; attempts < 10; ++attempts)
    {
        Mutex.lock();
        start(bus_address, sub_address, from, size, Tx_DMA);
        if(!Result.wait(RTOS_MS((size + 2) * 9 / 100 + 2)) && Result)    // Bus address+W, reg_address, data bytes. 100 bits per mS at 100 kHz bus rate
        {
            Tx_DMA.stop();
            Mutex.unlock();
        }
        else if(Result)
            break;
    }
 
    if(Result)
        Debug_i2c.dump_HEX(from, size);
    else
        Debug_i2c.write("NACK");
 
    return Result;
}
 
bool i2c::receive(bus_address bus_address, sub_address sub_address, void * to, size_t size)
{
    // repeat if bus failed.
    for(auto attempts = 0; attempts < 10; ++attempts)
    {
        Mutex.lock();
        start(bus_address, sub_address, to, size, Rx_DMA);
        if(!Result.wait(RTOS_MS((size + 4) * 9 / 100 + 2)))    // Bus address+W, reg_address, Bus address+R, data bytes. 100 bits per mS at 100 kHz bus rate
        {
            Rx_DMA.stop();
            Mutex.unlock();
        }
        else if(Result)
            break;
    }
 
    Debug_i2c.printf(" rx %02X[%02X]:", bus_address, sub_address);
    if(Result)
        Debug_i2c.dump_HEX(to, size);
    else
        Debug_i2c.write("NACK");
 
    return Result;
}
 
void i2c::rx_dma_handler()
{
    if(Rx_DMA.is_error())
        Result = false;
    Rx_DMA.stop();
    Hw->CR1 |= I2C_CR1_STOP;
    OS::TISRW isr;
    Result.send_isr();
    Mutex.unlock_isr();
    return;
}
 
void i2c::event_handler()
{
    uint32_t Flags = Hw->SR1;
 
    if(Flags & I2C_SR1_SB)
    {
        Hw->DR = Address.Bus;
        Hw->CR2 &= ~I2C_CR2_DMAEN;          // disable bit from prev.transfer to send register address
    }
    else if(Flags & I2C_SR1_ADDR)
    {
        if(!(Address.Bus & (1 << 0)))       // transmit phase
        {
            (void)Hw->SR2;                  // clear ADDR
            Hw->DR = Address.Register;      // start transmission (send register address)
 
            if(Rx_DMA.is_enabled())         // if master receive mode
            {
                Hw->CR1 |= I2C_CR1_START;   // generate Repeated START after address transmission
                Address.Bus |= (1 << 0);
            }
            else                            // master transmit mode
                Hw->CR2 |= I2C_CR2_DMAEN;   // enable DMA for data transfer
 
        }
        else                                // receive phase
        {
            Hw->CR2 |= I2C_CR2_DMAEN;       // enable DMA for data transfer
            if(Rx_DMA.data_size() > 1)
                Hw->CR1 |= I2C_CR1_ACK;
            (void)Hw->SR1;                  // GD32 workaroud to clear ADDR
            (void)Hw->SR2;                  // clear ADDR
        }
 
    }
    else if((Flags & I2C_SR1_BTF) && !Rx_DMA.is_enabled()) // Transmission, Tx done
    {
        Tx_DMA.stop();
        Hw->CR1 |= I2C_CR1_STOP;
        OS::TISRW isr;
        Result.send_isr();
        Mutex.unlock_isr();
        return;
    }
}
 
void i2c::error_handler()
{
    uint32_t Flags = Hw->SR1 & (I2C_SR1_AF | I2C_SR1_BERR | I2C_SR1_ARLO | I2C_SR1_OVR);
    Hw->SR1 = ~Flags;
    if(Flags & I2C_SR1_AF)
    {
        Rx_DMA.stop();
        Tx_DMA.stop();
        Hw->CR1 |= I2C_CR1_STOP;
    }
//    if(Flags == I2C_SR1_BERR)   // Errata 2.4.6
//        return;
    Result = false;
    OS::TISRW isr;
    Result.send_isr();
    Mutex.unlock_isr();
    return;
}
0
814 / 738 / 96
Регистрация: 23.11.2021
Сообщений: 4,160
Записей в блоге: 10
24.10.2024, 09:16 19
Интересный способ задания битов:
Цитата Сообщение от Dushevny Посмотреть сообщение
Код
Hw->CR1 = 0
 | 1 * I2C_CR1_PE // Peripheral enable
 | 0 * I2C_CR1_SMBUS // SMBus Mode
 | 0 * I2C_CR1_SMBTYPE // SMBus Type
 | 0 * I2C_CR1_ENARP // ARP Enable
 | 0 * I2C_CR1_ENPEC // PEC Enable
 | 0 * I2C_CR1_ENGC // General Call Enable
 | 0 * I2C_CR1_NOSTRETCH // Clock Stretching Disable (Slave mode)
 | 1 * I2C_CR1_START // Start Generation
 | 0 * I2C_CR1_STOP // Stop Generation
 | 0 * I2C_CR1_ACK // Acknowledge Enable
 | 0 * I2C_CR1_POS // Acknowledge/PEC Position (for data reception)
 | 0 * I2C_CR1_PEC // Packet Error Checking
 | 0 * I2C_CR1_ALERT // SMBus Alert
 | 0 * I2C_CR1_SWRST // Software Reset
 ;
но в итоге получается огромная портянка. Почему бы просто не писать Hw->CR1 = I2C_CR1_PE | I2C_CR1_START;?
0
652 / 350 / 54
Регистрация: 22.09.2023
Сообщений: 1,029
24.10.2024, 09:30 20
Цитата Сообщение от Eddy_Em Посмотреть сообщение
но в итоге получается огромная портянка.
Зато можно откомментировать каждую строчку, любую (в том числе первую и последнюю) строчку закомментировать при помощи // и можно копировать из проекта в проект, заменяя в нужных местах 0 на 1 и/или наоборот, при этом ни один из битов не будет забыт.
0
24.10.2024, 09:30
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
24.10.2024, 09:30
Помогаю со студенческими работами здесь

Подскажите с чего начать
Здравствуйте, есть желание сделать небольшой сайт. На нем будет выводиться информация в виде ленты...

подскажите с чего начать
решил изучить php+mysql наткнулся на книгу php5 в подлиннике, 2 издание, авторы котеров и...

Подскажите с чего начать?
Так получилось что я вынужден работать только дома, решил начать изучать программирование чтоб хоть...

подскажите с чего начать
8. Имеется шахматная доска. Некоторые поля не ней заняты белыми фигурами и пешками. Каждая занятое...

Подскажите с чего начать
Приветствую вас уважаемые! Недавно ознакомился с Android studio, язык Java. В этом деле я еще...

подскажите с чего начать?
привет, подскажите с какой книги лучше начать изучение WPF? скачал книгу мак дональда WPF 4, но для...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru