Easyelectronics.ru

Электроника для всех
Текущее время: 20 июл 2018, 04:08

Часовой пояс: UTC + 5 часов



    • JLCPCB - Платы прототипов всего за 2$ c бесплатной доставкой (при первом заказе)
    • 10 PCBs за $2 для 2 слоев, $15 для 4 слойной, $74 для 6 слойной платы.
    • Крупнейший китайский производитель прототипных плат. 290000+ клиентов & 8000+ заказов в день!
    • LCSC - Крупнейший китайский онлайн магазин радиодеталей.

Начать новую тему Ответить на тему  [ Сообщений: 116 ]  На страницу Пред.  1, 2, 3, 4, 5  След.
Автор Сообщение
 Заголовок сообщения: Re: Программная реалицация протокола, например 'I2C'
СообщениеДобавлено: 20 июн 2018, 16:46 
Старожил

Зарегистрирован: 26 ноя 2012, 10:28
Сообщения: 2510
Откуда: КЧР, поселок Нижний Архыз
Если оперировать с "классическими типами данных 'С'", то можно очень хорошо сесть в лужу, написав нечто, оперирующее с бинарными данными, под 32-битную архитектуру и пытаясь потом работать с этим же в 64-битной.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Программная реалицация протокола, например 'I2C'
СообщениеДобавлено: 20 июн 2018, 17:04 
Старожил

Зарегистрирован: 19 апр 2016, 11:59
Сообщения: 296
711aa писал(а):
я и дальше планирую хотеть софтовый USB 3.1 и 3.2 на голом ассемблере
Тогда нужно еще хотеть МК способный ногодрыгом принимать и отправлять поток данных не меньше 5 гб/с, обрабатывать не меньше 5 миллиардов прерываний в секунду в которых успевать производить вычисления, т. е. нужен МК с тактовой частотой не меньше 50 ГГц при условии что большинство команд выполняются за один такт, нет ошибок предсказания переходов, у флеша нулевая латентность (или механизмы сводящие ее к нулю), вход в обработчик прерывания за несколько тактов и многое другое.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Программная реалицация протокола, например 'I2C'
СообщениеДобавлено: 20 июн 2018, 17:16 
Только пришел

Зарегистрирован: 15 июн 2018, 03:48
Сообщения: 17
Eddy_Em писал(а):
Если оперировать с "классическими типами данных 'С'", то можно очень хорошо сесть в лужу, написав нечто, оперирующее с бинарными данными, под 32-битную архитектуру и пытаясь потом работать с этим же в 64-битной.

Да понятно всё это, кроссплатформенность, переносимость кода на другие архитектуры, повторное использование кода, но мне, как не профессионалу, класть на эти абстракции c останкинской башни, так же как и на стандарт (не помню как называется) 'правильной' передачи аргументов в функции, типа аргументы передаются только через определенные регистры, а результат возвращается только через 'r0' или 'rax'. За это я и люблю ассемблер, за свободу, я стараюсь соблюдать, но если мне надо вернуть результат в 'r10' или 'rsi', я так и сделаю, влегкую, и ни одна волосинка на моей жопе не шевельнеться


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Программная реалицация протокола, например 'I2C'
СообщениеДобавлено: 20 июн 2018, 17:18 
Только пришел

Зарегистрирован: 15 июн 2018, 03:48
Сообщения: 17
Maik писал(а):
711aa писал(а):
я и дальше планирую хотеть софтовый USB 3.1 и 3.2 на голом ассемблере
Тогда нужно еще хотеть МК способный ногодрыгом принимать и отправлять поток данных не меньше 5 гб/с, обрабатывать не меньше 5 миллиардов прерываний в секунду в которых успевать производить вычисления, т. е. нужен МК с тактовой частотой не меньше 50 ГГц при условии что большинство команд выполняются за один такт, нет ошибок предсказания переходов, у флеша нулевая латентность (или механизмы сводящие ее к нулю), вход в обработчик прерывания за несколько тактов и многое другое.

все так, но вам ведь знакомо слово "ирония"?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Программная реалицация протокола, например 'I2C'
СообщениеДобавлено: 20 июн 2018, 18:20 
Старожил
Аватара пользователя

Зарегистрирован: 22 июл 2017, 11:48
Сообщения: 1951
Дак и ничего страшного с переопределениями. Эти ваши "классические" базовые типы как были, так и остались. Просто на разном "железе" у них может быть разная размерность. Особенно в определении int и short int. Из-за этого понаписано столько переопределений. К тому же язык универсальный и имеет много стандартных библиотек. Но вникать в них вовсе не обязательно. Главное уяснить, что STM32 имеет 32-битную архитектуру с доступом по размеру 32, 16 и 8 бит, поэтому аппаратно реализованы размерности int, short int, char, которые для конкретизации определены дополнительно в именах int32_t, int16_t, int8_t (то же самое с беззаковыми величинами). А вот тип long int (int64_t), имеющий 64-битную размерность, аппаратно не поддерживается, но может эмулироваться в виде пары 32-битных int, и компилятор для этого делает двойные ассемблерные инструкции, работая с парой регистров. Вы по-прежнему можете использовать базовые сишные типы вида int, short int и прочие.
Если уж так ковырять файлы описаний для компилятора, то там можно вообще шею свернуть от сплошных переопределений. Но это забота исключительно компилятора, файлы уже написаны и они практически нигде не требуются. Я даже не буду писать, какие файлы чего там описывают, чтобы не травмировать вашу нервную систему.

711aa писал(а):
[, пишите только номер страницы, когда ссылаетесь на официальный документ..

хм... ну раз так, давайте поищем вместе номер страницы. Документ RM0008 Rev 18, March 2018 (из-за номера ревизии номера страниц могут отличаться), стр. 757, пункт 26.3.3 I2C master mode, затем стр 759, Master transmitter, а также стр. 760, табличка Figure 273. Transfer sequence diagram for master transmitter. Затем стр. 773 и далее, раздел 26.6 I2C registers


Последний раз редактировалось BusMaster 20 июн 2018, 18:22, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Программная реалицация протокола, например 'I2C'
СообщениеДобавлено: 20 июн 2018, 18:21 
Только пришел

Зарегистрирован: 15 июн 2018, 03:48
Сообщения: 17
dev писал(а):
711aa писал(а):
есть 8 классических типов данных 'C':
1. signed char = 1 знаковый байт
2. unsigned char = 1 беззнаковый байт
3. signed short = 2 знаковых байта
4. unsigned short = 2 беззнаковых байта
5. signed int = 4 знаковых байта
6. unsigned int = 4 беззнаковых байта
7. signed long = 8 знаковых байт
8. unsigned long = 8 беззнаковых байт


Это где это такое написано?

Ради любопытства загуглил: http://dfe.petrsu.ru/koi/posob/c/c.htm#g1.2
Я много лет искренне считал, да что там считал, был совершенно уверен, что 'int' это 4 байта, а 'long' это 8 байт, и тут такой удар:
Код:
int   2 (16)   от -32768 до 32767
unsigned int   2 (16)   от 0 до 65535

Жесть какая то, в моем понимании разумеется. Я много лет не кодил на 'C', а другие ЯВУ даже и не пытался смотреть. Признаю, что написал херню.
В моем мире всё в разы проще, есть 'byte', 'word', 'dword' и 'qword', а знаковые они или там адрес содержат какой, решать только мне.
Лишний раз убеждаюсь, что ЯВУ точно не моё, слишком всё сложно.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Программная реалицация протокола, например 'I2C'
СообщениеДобавлено: 20 июн 2018, 18:31 
Только пришел

Зарегистрирован: 15 июн 2018, 03:48
Сообщения: 17
BusMaster писал(а):
Дак и ничего страшного с переопределениями. Эти ваши "классические" базовые типы как были, так и остались. Просто на разном "железе" у них может быть разная размерность. Особенно в определении int и short int. Из-за этого понаписано столько переопределений. К тому же язык универсальный и имеет много стандартных библиотек. Но вникать в них вовсе не обязательно. Главное уяснить, что STM32 имеет 32-битную архитектуру с доступом по размеру 32, 16 и 8 бит, поэтому аппаратно реализованы размерности int, short int, char, которые для конкретизации определены дополнительно в именах int32_t, int16_t, int8_t (то же самое с беззаковыми величинами). А вот тип long int (int64_t), имеющий 64-битную размерность, аппаратно не поддерживается, но может эмулироваться в виде пары 32-битных int, и компилятор для этого делает двойные ассемблерные инструкции, работая с парой регистров. Вы по-прежнему можете использовать базовые сишные типы вида int, short int и прочие.
Если уж так ковырять файлы описаний для компилятора, то там можно вообще шею свернуть от сплошных переопределений. Но это забота исключительно компилятора, файлы уже написаны и они практически нигде не требуются. Я даже не буду писать, какие файлы чего там описывают, чтобы не травмировать вашу нервную систему.

711aa писал(а):
[, пишите только номер страницы, когда ссылаетесь на официальный документ..

хм... ну раз так, давайте поищем вместе номер страницы. Документ RM0008 Rev 18, March 2018 (из-за номера ревизии номера страниц могут отличаться), стр. 757, пункт 26.3.3 I2C master mode, затем стр 759, Master transmitter, а также стр. 760, табличка Figure 273. Transfer sequence diagram for master transmitter. Затем стр. 773 и далее, раздел 26.6 I2C registers

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Программная реалицация протокола, например 'I2C'
СообщениеДобавлено: 20 июн 2018, 18:32 
Старожил
Аватара пользователя

Зарегистрирован: 22 июл 2017, 11:48
Сообщения: 1951
Я же пишу - разное железо с разной размерностью шины АЛУ и адресации. Язык Си зародился еще в те далекие времена, когда вас самих еще не было, а компьютеры в то время занимали полкомнаты пространства. Язык Си получил огромное распространение и он портирован (приспособлен) на совершенно разные платформы (железо) и для языка написано большое число компиляторов. Компилятор "читает" текст и распознает написанное, подбирая из своей базы варианты составления машинных инструкций. Современный компилятор - очень сложный аналитический механизм. Язык один, а "железа" много, даже у одного ARM-а несколько линеек ядер с разным набором инструкций, и компилятор должен всё это учитывать. Именно поэтому родилось столько переопределений.

Да и вообще, с вашей чувствительной нервной системой надо как-то проще относиться ко всем этим сложностям, не перегружать себя лишними подробностями. А то действительно начнете в реале биться головой об пол. Не нужно так себя истязать, оно того не стоит - в расцвете сил оказаться в психиатрической лечебнице.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Программная реалицация протокола, например 'I2C'
СообщениеДобавлено: 20 июн 2018, 18:42 
Старожил

Зарегистрирован: 19 апр 2016, 11:59
Сообщения: 296
711aa писал(а):
'int' это 4 байта, а 'long' это 8 байт
long это 4, а не 8 байт, а int зависит от платформы.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Программная реалицация протокола, например 'I2C'
СообщениеДобавлено: 20 июн 2018, 18:57 
Только пришел

Зарегистрирован: 15 июн 2018, 03:48
Сообщения: 17
BusMaster писал(а):
Да и вообще, с вашей чувствительной нервной системой надо как-то проще относиться ко всем этим сложностям, не перегружать себя лишними подробностями. А то действительно начнете в реале биться головой об пол. Не нужно так себя истязать, оно того не стоит - в расцвете сил оказаться в психиатрической лечебнице.

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Программная реалицация протокола, например 'I2C'
СообщениеДобавлено: 20 июн 2018, 19:22 
Старожил

Зарегистрирован: 26 ноя 2012, 10:28
Сообщения: 2510
Откуда: КЧР, поселок Нижний Архыз
Maik писал(а):
long это 4, а не 8 байт, а int зависит от платформы.

На 64-битной архитектуре long 8-байтный. Поэтому при работе с данными нужно либо их сериализовать, либо использовать строгие типы, не зависящие от архитектуры (правда, придется еще и применять макросы для приведения типов между тупо- средне- и остроконечными архитектурами).


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Программная реалицация протокола, например 'I2C'
СообщениеДобавлено: 20 июн 2018, 19:25 
Старожил

Зарегистрирован: 19 апр 2016, 11:59
Сообщения: 296
Eddy_Em писал(а):
На 64-битной архитектуре long 8-байтный.
Int да, а long должен иметь одинаковый размер 4 байта независимо от платформы. Возможно не всегда это условие соблюдается.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Программная реалицация протокола, например 'I2C'
СообщениеДобавлено: 20 июн 2018, 19:34 
Старожил

Зарегистрирован: 26 ноя 2012, 10:28
Сообщения: 2510
Откуда: КЧР, поселок Нижний Архыз
Maik,
Код:
cat l.c; gcc l.c; ./a.out
#include <stdio.h>

void main(){
   printf("size of long: %lu\n", sizeof(long));
}
size of long: 8


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Программная реалицация протокола, например 'I2C'
СообщениеДобавлено: 20 июн 2018, 20:22 
Старожил
Аватара пользователя

Зарегистрирован: 22 июл 2017, 11:48
Сообщения: 1951
711aa писал(а):
но в сердце вашем живёт ненависть.

Гыыы :))) Сударь, я тут не на приеме психолога. Да и царских особ тут вроде нету, чтобы соблюдать благоговейную почтительность :))))
Не люблю размазывать лишние сюси-пуси, поскольку сам знаю по чем фунт лиха. Ну а в целом, я обычный человек.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Программная реалицация протокола, например 'I2C'
СообщениеДобавлено: 20 июн 2018, 23:19 
Заглядывает иногда

Зарегистрирован: 06 июн 2018, 22:30
Сообщения: 34
Откуда: Киев
BusMaster Что ж ему еще использовать если он просто занимался пересылкой данных) А вот портить регистры в функциях нехорошо. Асм не такой уж и супер сложный, да гибкий си подобный, на нем приятно писать, но вот зачем (на чистом) это конечно вопрос.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Программная реалицация протокола, например 'I2C'
СообщениеДобавлено: 20 июн 2018, 23:21 
Старожил

Зарегистрирован: 19 апр 2016, 11:59
Сообщения: 296
Eddy_Em писал(а):
size of long: 8
Какие платформа и компилятор?
В VS 2010 (x64 приложение), в TDM-GCC 4.9.2 (x64 приложение) и в STM32 (GCC 5.4) sizeof(long) возвращает 4.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Программная реалицация протокола, например 'I2C'
СообщениеДобавлено: 20 июн 2018, 23:37 
Старожил

Зарегистрирован: 13 янв 2018, 21:36
Сообщения: 201
Именно поэтому подключаем stdint.h и забывает sizeof(long) как страшный сон.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Программная реалицация протокола, например 'I2C'
СообщениеДобавлено: 21 июн 2018, 00:59 
Старожил

Зарегистрирован: 26 ноя 2012, 10:28
Сообщения: 2510
Откуда: КЧР, поселок Нижний Архыз
Maik писал(а):
Какие платформа и компилятор?

Обычный комп. Понятное дело, gcc под линуксом и 64 бита. Я уж и не помню, когда выбросил на помойку последнюю intel-based 32-битку!
Подозреваю, под мастдайкой gcc делает sizeof(long) равным 4 байтам только из-за того, что собирает под эмулятором (не помню уж, как эта шняга обзывается). А эмулятор наверняка 32-битный!
Бросайте это говно. Все равно после хрюнделя мастдайки не стало вообще!


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Программная реалицация протокола, например 'I2C'
СообщениеДобавлено: 21 июн 2018, 01:36 
Старожил

Зарегистрирован: 08 авг 2013, 09:43
Сообщения: 751
VladislavS писал(а):
Именно поэтому подключаем stdint.h и забывает sizeof(long) как страшный сон.

Самй правильный совет, на счет типов. Ну его нафиг, stdint.h - часть C99. Нафиг без него писать.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Программная реалицация протокола, например 'I2C'
СообщениеДобавлено: 21 июн 2018, 10:19 
Старожил
Аватара пользователя

Зарегистрирован: 06 ноя 2013, 16:07
Сообщения: 553
Откуда: Германия
VladislavS писал(а):
Именно поэтому подключаем stdint.h и забывает sizeof(long) как страшный сон.


Если хотим определенный размер - используем stdint.h. Если пишем абстрактные вычисления - int/long, не забывая об их диапазонах.

P.S.: MISRA требует использовать stdint.h


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Программная реалицация протокола, например 'I2C'
СообщениеДобавлено: 21 июн 2018, 13:08 
Старожил

Зарегистрирован: 27 мар 2015, 01:22
Сообщения: 1124
Katz писал(а):
vt340 писал(а):
Ну какой RM на мелкий x51, ты же когда на велосипед садишься перед этим инструкцию не читаешь )

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

Так я то именно про мелкий x51, а не про то, что все x51 мелкие

"Любую цель люди понимают иначе, чем человек её указующий.
Следствие первое: Если ясность вашего объяснения исключает ложное толкование, все равно кто-то поймет вас неправильно.
Следствие второе: Если вы уверены, что ваш поступок встретит всеобщее одобрение, кому-то он не понравится." )

_________________
less is more


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Программная реалицация протокола, например 'I2C'
СообщениеДобавлено: 04 июл 2018, 21:52 
Только пришел

Зарегистрирован: 15 июн 2018, 03:48
Сообщения: 17
Выкладываю софтовую реализацию 'I2C', если кому то интересно.

Код не совершенен и умеет только зажигать (инициировать) экран 'SSD1306' на синей пилюле при следующих условиях:
- 'SDA' экрана воткнут в ногу 'PB7'
- 'SCL' экрана воткнут в ногу 'PB6'

При желании, ноги можно и нужно поменять, как и сам код разумеется.
Реализовать вывод символов достаточно просто, но есть один затык, в этом экране рукожопая реализация, т.е. при записи одного байта в память экрана, вместо горизонтальной линии из 8 пикселей, как это и должно быть, получается вертикальная линия и изменить это никак нельзя, возможно это связано с особенностями китайской письменности.
Экран одноцветный и не удобный в программировании, лучше добавить немного денег и взять цветной с разрешением 128x160 пикселей с 'SPI' интерфейсом, написать софтовую реализацию ('SPI' проще, чем 'I2C') и смотреть на цветную картинку.
Разумеется это моё частное мнение.

После углубления в тему, моя уверенность в необходимости софтовой реализации как минимум 'I2C, SPI, UART/USART' ногодрыгом только возрасла, 'USB' пока под вопросом, поскольку это в разы проще, чем читать говно-мануалы и разгребать потоки говно-мыслей неких своеобразно мыслящих людей.

Рекомендую посмотреть видос, в котором вменяемый дядька простым и понятным русским языком, буквально на пальцах объясняет интерфейс 'I2C': https://www.youtube.com/watch?v=_4KD29qnhNM
Вот так, с моей точки зрения, и должны быть написаны мануалы.

А вот собственно и код:
Код:
//======================================================================
.syntax unified
.thumb                     // тип инструкций Thumb
.cpu cortex-m3               // STM32F103C8T6
//======================================================================
//   Таблица векторов   
//======================================================================   
   .word 0x20005000         // SP address => 0x20000000 + 0x5000
   //.word 0x08000000 + reset + 1
   .word 0x20000000 + reset + 1
//======================================================================   
ssd1306:
   .byte 0xAE, 0x20, 0x10, 0xB0, 0xC8, 0x00, 0x10, 0x40
   .byte 0x81, 0xFF, 0xA1, 0xA6, 0xA8, 0x3F, 0xA4, 0xD3
   .byte 0x00, 0xD5, 0xF0, 0xD9, 0x22, 0xDA, 0x12, 0xDB
   .byte 0x20, 0x8D, 0x14, 0x2E, 0xAF, 0x00, 0x00, 0x00
//======================================================================
   .text
//======================================================================
//   reset
//======================================================================
reset:
   bl.w i2c_init            // Инициируем 'GPIO Port B'
   bl.w ssd1306_init         // Инициируем экран 'SSD1306'
//----------------------------------------------------------------------
//   Главный цикл:
//----------------------------------------------------------------------
loop:
   b.w loop
//======================================================================
//   i2c_send_byte
//======================================================================
i2c_send_byte:
   push.w {lr}
//----------------------------------------------------------------------
//   Цикл отправки байта
//----------------------------------------------------------------------   
   mov.w r7, r7, ror #7      // прокатываем бит №7 в бит №0
   movw.w r2, 8            // передаем 8 бит (СТАРШИМ битом ВПЕРЁД)
SEND_NEXT_BIT:               // менять 'SDA' можно только при 'SCL' = 0
   bl.w scl_low            // роняем 'SCL' в ноль, готовим новый клик
   
   str.w r7, [r0, #0x019C]      // поднимаем или роняем 'GPIOB_ODR.7'
   bl.w i2c_delay
   ror.w r7, r7, #31         // готовим к отправке следующий бит
   
   bl.w scl_high            // поднимаем 'SCL' в единицу, генерируем очередной клик
   subs.w r2, r2, #1         // уменьшаем счётчик
   bne.w SEND_NEXT_BIT         // NE: если Z = 0 => счётчик != 0
//----------------------------------------------------------------------
//   Принимаем ACK от ведомого
//----------------------------------------------------------------------
   bl.w scl_low            // роняем 'SCL' в ноль, готовим новый клик
   bl.w sda_high            // поднимаем 'SDA' в единицу, далее ведомый роняет её в '0' = 'ACK' или не роняет = 'NACK'
   bl.w scl_high            // поднимаем 'SCL' в единицу, генерируем клик 'ACK'
   
   //##// Проверяем, уронил ли ведомый 'SDA' в ноль   
   ldr.w r1, [r0, #0x011C]      // читаем 'GPIOB_IDR.7'
   tst.w r1, #0x0001         // 'GPIOB_IDR.7'
   beq.w ACK               // если Z = 1 (бит = 0) => 'ACK'
NACK:
   b.w loop
ACK:
//----------------------------------------------------------------------
   pop.w {pc}
//======================================================================
//   ssd1306_init
//======================================================================
ssd1306_init:
   push.w {lr}
//----------------------------------------------------------------------
   bl.w i2c_start
//----------------------------------------------------------------------
   mov.w r7, #0x78            // отправляем адрес ssd1306
   bl.w i2c_send_byte
   
   adr.w r5, ssd1306         // адрес массива с командами
   mov.w r4, #29            // счётчик цикла
//----------------------------------------------------------------------
//   НАЧАЛО ЦИКЛА
//----------------------------------------------------------------------
SEND_NEXT_COMMAND:
   mov.w r7, #0x80            // коммандный байт
   bl.w i2c_send_byte
   
   ldrb.w r7, [r5], #1         // текущая команда + переход к следующей
   bl.w i2c_send_byte
   
   subs.w r4, r4, #1         // уменьшаем счётчик
   bne.w SEND_NEXT_COMMAND      // NE: если Z = 0 => счётчик != 0
//----------------------------------------------------------------------
   bl.w i2c_stop
   bl.w ssd1306_clear         // очищаем буфер экрана
//----------------------------------------------------------------------
   pop.w {pc}
//======================================================================
//   i2c_start
//======================================================================
i2c_start:
   push.w {lr}
//----------------------------------------------------------------------
//   Загружаем в регистр 'R0' базовый адрес 'GPIO Port B' (bit-banding)
//----------------------------------------------------------------------
   movw.w r0, #0x8000         // r0 = 0x00008000
   movt.w r0, #0x4221         // r0 = 0x42218000
//----------------------------------------------------------------------
   bl.w sda_high            // поднимаем 'SDA' в единицу
   
   // читаем 'GPIOB_IDR', если у 'SDA' не встал, стартануть не получиться, выходим с ошибкой       
   
   bl.w scl_high            // поднимаем 'SCL' в единицу
   bl.w sda_low            // 'SDA' 1->0, при 'SCL' = 1
   
   // читаем 'GPIOB_IDR', если 'SDA' не упал, то шина неисправна, выходим с ошибкой
//----------------------------------------------------------------------
   pop.w {pc}
//======================================================================
//   i2c_stop
//======================================================================
i2c_stop:                  // 'SDA' 0->1, при 'SCL' = 1
   push.w {lr}
//----------------------------------------------------------------------
   bl.w scl_low            // роняем 'SCL' в ноль
   bl.w sda_low            // роняем 'SDA' в ноль
   bl.w scl_high            // поднимаем 'SCL' в единицу
   bl.w sda_high            // поднимаем 'SDA' в единицу
//----------------------------------------------------------------------
   pop.w {pc}
//======================================================================
//   sda_high
//======================================================================
sda_high:                  // 'SDA' = 'PB7' = 1
   push.w {lr}
//----------------------------------------------------------------------
   mov.w r1, #1            // пишем 1 в 'GPIOB_BSRR.7'
   str.w r1, [r0, #0x021C]      // сохраняем регистр 'GPIOB_BSRR'
   bl.w i2c_delay
//----------------------------------------------------------------------
   pop.w {pc}
//======================================================================
//   sda_low
//======================================================================
sda_low:                  // 'SDA' = 'PB7' = 0
   push.w {lr}
//----------------------------------------------------------------------
   mov.w r1, #1            // пишем 1 в 'GPIOB_BRR.7'
   str.w r1, [r0, #0x029C]      // сохраняем регистр 'GPIOB_BRR'
   bl.w i2c_delay
//----------------------------------------------------------------------
   pop.w {pc}
//======================================================================
//   scl_high
//======================================================================
scl_high:                  // 'SCL' = 'PB6' = 1
   push.w {lr}
//----------------------------------------------------------------------
   mov.w r1, #1            // пишем 1 в 'GPIOB_BSRR.6'
   str.w r1, [r0, #0x0218]      // сохраняем регистр 'GPIOB_BSRR'
   bl.w i2c_delay
//----------------------------------------------------------------------
   pop.w {pc}
//======================================================================
//   scl_low
//======================================================================
scl_low:                  // 'SCL' = 'PB6' = 0
   push.w {lr}
//----------------------------------------------------------------------
   mov.w r1, #1            // пишем 1 в 'GPIOB_BRR.6'
   str.w r1, [r0, #0x0298]      // сохраняем регистр 'GPIOB_BRR'
   bl.w i2c_delay
//----------------------------------------------------------------------
   pop.w {pc}
//======================================================================
//   i2c_delay
//======================================================================
i2c_delay:
   push.w {lr}
//----------------------------------------------------------------------
   movw.w r12, #10            // точное число не понятно
loop_d:
   subs.w r12, r12, #1
   bne.w loop_d
//----------------------------------------------------------------------
   pop.w {pc}
//======================================================================
//   i2c_init
//======================================================================
i2c_init:                  // 'PB6 = SCL' и 'PB7 = SDA'
   push.w {lr}
//----------------------------------------------------------------------
//   Конфигурируем регистр 'RCC', адрес 0x40021000 (RM p.50, p.121)
//----------------------------------------------------------------------
   movw.w r0, #0x1000
   movt.w r0, #0x4002         // базовый адрес 'RCC' = 0x40021000
   ldr.w r1, [r0, #0x18]      // читаем регистр 'RCC_APB2ENR' по смещению 0x18
   orr.w r1, 0x0008         // 0b00001000 = бит №3 = 'IOPBEN'
   str.w r1, [r0, #0x18]      // созраняем регистр 'RCC_APB2ENR'
//----------------------------------------------------------------------
//   Конфигурируем 'GPIO Port B', адрес 0x40010C00 (RM p.51, p.194, p.172)
//----------------------------------------------------------------------
   movw.w r2, #0xFFFF         // байты 'PB5-PB0' не трогаем
   movt.w r2, #0x00FF         // байты 'PB7-PB6' обнуляем
   
   movw.w r0, #0x0C00
   movt.w r0, #0x4001         // базовый адрес 'GPIOB' = 0x40010C00
   ldr.w r1, [r0, #0x00]      // читаем регистр 'GPIOB_CRL'
   
   and.w r1, r1, r2         // обнуляем биты №31:24 ('PB7-PB6')
   //andn.w
   movw.w r2, #0x0000         // байты 'PB5-PB0' не трогаем
   movt.w r2, #0x7700         // байты 'PB7-PB6' настраиваем
   
   orr.w r1, r1, r2         // 0x7 => CNF = '01' = 'General purpose output Open-drain', MODE = '11' = 'Output mode, max speed 50 MHz'
   str.w r1, [r0, #0x00]      // сохраняем регистр 'GPIOB_CRL'
//----------------------------------------------------------------------
   pop.w {pc}
//======================================================================


Собирать так:
Код:
   arm-none-eabi-as -o main.o main.asm
   arm-none-eabi-objcopy -O binary main.o main.bin

Прошивать так:
Есть один момент, по умолчанию программа работает ТОЛЬКО в памяти МК, оставляя оригинальную прошивку без изменений, это нужно МНЕ для дебажных целей, поэтому требуется физически переставить джамперы на '1:1'
Прошиваем:
Код:
   st-flash write main.bin 0x20000000

Если есть желание записать именно на флешку, то джамперы менять не требуется, нужно забанить строку:
Код:
   .word 0x20000000 + reset + 1

и разбанить строку:
Код:
   //.word 0x08000000 + reset + 1

После чего прошить так:
Код:
   st-flash write main.bin 0x08000000


Последний раз редактировалось 711aa 06 июл 2018, 07:45, всего редактировалось 2 раз(а).

Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Программная реалицация протокола, например 'I2C'
СообщениеДобавлено: 04 июл 2018, 22:00 
Старожил
Аватара пользователя

Зарегистрирован: 22 июл 2017, 11:48
Сообщения: 1951
Ма-ла-дец!
Цитата:
Экран одноцветный и не удобный в программировании, лучше добавить немного денег и взять цветной с разрешением 128x160 пикселей

Нет, лучше просто перепаять перемычки на SSD1306, включив интерфейс SPI. Дисплей в базе имеет три интерфейса - параллельный, I2C, SPI, и они переключаются перемычками.
А опыты с цветным дисплеем оставьте на потом, когда начнете писать на Си. Иначе вы просто загнетесь с трехкомпонентным пикселем на ассемблере.
Для начала хотябы попробуйте просто прочертить горизонтальные и вертикальные линии на дисплее, нарисовав сетку с шагом 10х10 пикс.

Цитата:
Есть один момент, по умолчанию программа работает ТОЛЬКО в памяти МК, оставляя оригинальную прошивку без изменений,

Да, конечно, только лучше будет, если вы будете ПАМЯТЬ называть конкретно - какая конкретно ПАМЯТЬ в МК. Их там несколько. Одна из них - Flash, вторая SRAM.
А во-вторых, прочтите утилитой от ST содержимое памяти Flash, сохраните бинарник себе на комп и больше не переживайте по поводу потери демо-прошивки.

ЗЫ.
vt340, ну как тебе ТАКОЙ HAL? :)))))) мейнстрим, говоришь?

ЗЫ-2
Цитата:
Код:
//   - если ведомый обосрался, то ронять 'SDA' в '0' будет некому = 'NACK' и это тоже НУЖНО отследить

... да я, блин, сам чуть не обосрался от такого коммента!!!!

и еще ЗЫ-3
Цитата:
'USB' пока под вопросом, поскольку это в разы проще, чем читать говно-мануалы и разгребать потоки говно-мыслей неких своеобразно мыслящих людей.

Ну чтож. Ваше желание - да сбудется. Подкину вам эээ... а, ладно, пусть будут русскоязычные статейки про USB, чтоб остатки мозга не порвали:
http://www.softelectro.ru/usb.html#M3
http://microsin.net/programming/arm-wor ... part1.html

итак, для приготовления каши вам потребуются ингридиенты:
1. Основа единицы информации - дифференциальная разница двух сигналов, дифференциальный "0" и дифференциальный "1".
2. Сопутствующие сигналы - Idle, SE0, и полученные на их основе сигналы Reset, Connect, Disconnect, Suspend, Resume.
3. Основа кодирования NRZI - сигналы J и K, полученные дифференциальным методом, а так же сигнал вставки бита Stuff-bit, и полученные на основе J/K сигналы SOP, EOP.
4. ВременнАя база - очень точное выдерживание интервалов - для Full speed - не хуже ±0,25%
Все ингридиенты смешать и варить, помешивая. Затем добавить:
200 грамм водки, разбирая хотябы самый простой Token пакет,
300 грамм самогону, подсчитывая CRC, без учета Stuff-bit, по полиному 0x25.
Затем, высыпать всё в большой котел и варить три недели, не отходя и читая заклинания про Endpoint-ы, дескрипторы, запросы, классы...

Кароче, если топикстартер не справился даже с простым и очень медленным I2C, то максимум, что выйдет у идейного топикстартера со скоростным USB - кое-как сформировать J/K и SE0 на частоте low-speed ну или максимум full speed, которые не будут производить никакой полезной работы.
Уровень самонадеянности и юнешеского максимализма топикстартера конечно поражает, но так же удивляет кол-во бесполезно потраченного им времени на бесполезную по сути работу. Дисплей SSD1306, который кое-как включается и выводит шумовой мусор из GRAM дисплея - это безусловно весьма полезная работа, на которую было бездарно потрачено чуть более полумесяца жизни.

Ну и конечно, как же я мог пропустить практическое задание для топикстартера по "простому" USB. Вот, любезнейший, будьте добры, прочитайте, плиз, содержимое вот этого совершенно классического пакета USB (full speed!) и скажите, что это за пакет, какую он в себе инфу несет? Подсказка: это один из пакетов, которые идут каждую 1 мс. Пакет именно такой коротенький. Вверху - полная длина его, внизу - увеличенный участок начала пакета. Первый байт = 0х80.
Вложение:
DS1Z_QuickPrint2.jpg
DS1Z_QuickPrint2.jpg [ 82.81 Кб | Просмотров: 119 ]


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Программная реалицация протокола, например 'I2C'
СообщениеДобавлено: 04 июл 2018, 23:20 
Старожил

Зарегистрирован: 11 сен 2012, 11:19
Сообщения: 4783
711aa, перед писаниной на асме под арм, попробуйте сперва отмыться от авр.
А свой "шедевр" вытрите от греха подальше, не ровен час какой нибудь идиот воспользуется...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Программная реалицация протокола, например 'I2C'
СообщениеДобавлено: 05 июл 2018, 00:08 
Старожил

Зарегистрирован: 13 янв 2018, 21:36
Сообщения: 201
ААААА!!!!! Как это развидеть теперь?

Блин, ради чего??? Любой компилятор из ногодрыга на С сделает код в разы лучше!!!


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 116 ]  На страницу Пред.  1, 2, 3, 4, 5  След.

Часовой пояс: UTC + 5 часов


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB