Easyelectronics.ru

Электроника для всех
Текущее время: 18 ноя 2018, 15:52

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



    • JLCPCB - Прототипы 10 PCBs всего за 2$ (100*100mm, 2-layer)
    • Как мы делаем платы, смотрите на YouTube
    • Крупнейшая китайская фабрика прототипов. 300000+ заказчиков и 10000+ заказов в день!
    • LCSC - Крупнейший китайский онлайн магазин комплектующих.

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

Зарегистрирован: 22 июл 2017, 11:48
Сообщения: 2478
Быть может и можно всё это софтово мутить, но как только представишь себе объем работы по декодированию/кодированию, приему/передаче NRZI, обнаружению/формированию сервисных сигналов линии - так прям аж не по себе становится. Ну максимум, на что хватит, так это на low-speed. Какой уж там hi-speed, не заикаясь уже о super-speed. Да ну ево нахрен, вы чо. Пусть топикстартер с софтовым I2C на базовой 100 кГц вначале помудохается. Через месяц убитого летнего времени у него даже и мысли пропадут о софтовом USB.


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

Зарегистрирован: 27 мар 2015, 01:22
Сообщения: 1337
Софтовый usb неинтересно [потому что никому не надо], интересно jtag


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

Зарегистрирован: 15 июн 2018, 03:48
Сообщения: 17
vadiv писал(а):
http://elisbred.blogspot.com/2014/04/i2c-stm32.html

Спасибо братишка, приедет анализатор с алика, повошкаюсь

BusMaster писал(а):
Быть может и можно всё это софтово мутить, но как только представишь себе объем работы по декодированию/кодированию, приему/передаче NRZI, обнаружению/формированию сервисных сигналов линии - так прям аж не по себе становится. Ну максимум, на что хватит, так это на low-speed. Какой уж там hi-speed, не заикаясь уже о super-speed. Да ну ево нахрен, вы чо. Пусть топикстартер с софтовым I2C на базовой 100 кГц вначале помудохается. Через месяц убитого летнего времени у него даже и мысли пропадут о софтовом USB.

Скорее всего так и будет, пока есть желание помудохаюсь, а там как карта ляжет.

Вообще то я заинтересовался софтовой реализацией из-за отсутствия нормального описания аппаратной. Я не понимаю код на языках высокого уровня, нет голый классический 'C' я читаю, но как только начинаются ипанутые типы данных с тремя подчеркиваниями, препроцессорные макросы и вызовы функций, не понятно что и как делающих, я нихрена не понимаю, так то в сети полно примеров на 'C' + либы, а мне надо понимать какой бит возвести, какой сбросить, в каком регистре, в какой последовательности и почему именно так, а не иначе. Я не нашел вменяемой пошаговой инициации аппаратного I2C на голых регистрах (которых 9 штук, описание битов есть в 'RM', а вот последовательности инициации нет, ткните носом, если кто знает) именно под STM32F103C8T6, под Discovery пожалуйста. Вот и подумал, что софтовый проще будет.

Неделю вошкался над тем, как завести STM32F103C8T6+SSD1306 на голом асме, сегодня получилось, кому надо вот код (аппаратно зависимый, запускать ТОЛЬКО НА СИНЕЙ ПИЛЮЛЕ и без гарантий) комментариев и оптимизаций пока нет:
Код:
//======================================================================
// st-flash read /tmp/stm32_dump.bin 0x8000000 0x10000
// st-flash write test.bin 0x8000000
//======================================================================
.syntax unified
.thumb                     // тип инструкций Thumb
.cpu cortex-m3               // STM32F103C8T6
//======================================================================
//   Таблица векторов   
//======================================================================   
   .word 0x20005000         // SP address => 0x20000000 + 0x5000
   .word 0x08000000 + reset + 1
//======================================================================
   .text
//======================================================================
reset:
//----------------------------------------------------------------------
//   RCC->APB1ENR |= RCC_APB1Periph_I2C1
//----------------------------------------------------------------------
   movw.w r0, #0x101C
   movt.w r0, #0x4002

   movw.w r2, #0x0000
   movt.w r2, #0x0020

   ldr.w r1, [r0]
   orr.w r1, r1, r2
   str.w r1, [r0]
//----------------------------------------------------------------------
//   RCC->APB2ENR |= RCC_APB2Periph_GPIOB
//----------------------------------------------------------------------
   movw.w r0, #0x1018
   movt.w r0, #0x4002

   ldr.w r1, [r0]
   orr.w r1, r1, #0x0008
   str.w r1, [r0]
//----------------------------------------------------------------------
//   I2C_Init(I2C1, &i2c);
//----------------------------------------------------------------------
// CR2
   movw.w r0, #0x5404
    movt.w r0, #0x4000         // CR2

    movw.w r2, #0xFFC0

    ldr.w r1, [r0]
    and.w r1, r1, r2            // Clear frequency FREQ[5:0] bits
    orr.w r1, r1, #36            // 36000000/1000000=36
    str.w r1, [r0]
   
// CCR
    //I2C1->CR1 &= CR1_PE_Reset;
   movw.w r0, #0x5400
   movt.w r0, #0x4000         // CR1

   movw.w r2, #0xFFFE

   ldr.w r1, [r0]
   and.w r1, r1, r2         // Disable the selected I2C peripheral to configure TRISE
   str.w r1, [r0]
   
   //I2C1->TRISE = (uint16_t)(((freqrange * (uint16_t)300) / (uint16_t)1000) + (uint16_t)1);
   //I2C1->TRISE = 36*300/1000+1 = 11.8 = 11
   movw.w r0, #0x5420
   movt.w r0, #0x4000         // TRISE
   movw.w r1, #11
   str.w r1, [r0]
   
   movw.w r0, #0x541C
   movt.w r0, #0x4000         // CCR
   movw.w r1, #0x801E
   str.w r1, [r0]
   
// CR1
   //I2C1->CR1 |= CR1_PE_Set;
   movw.w r0, #0x5400
   movt.w r0, #0x4000         // CR1
   
   movw.w r2, #0xFBF5
   
   ldr.w r1, [r0]
   and.w r1, r1, r2            // CR1_CLEAR_Mask
   orr.w r1, r1, #1            // Enable the selected I2C peripheral
   str.w r1, [r0]
   
//OAR1
   //I2C1->OAR1 = 0x4015
   movw.w r0, #0x5408
   movt.w r0, #0x4000         // OAR1
   movw.w r1, #0x4015
   str.w r1, [r0]
//----------------------------------------------------------------------
//   GPIO_Init(GPIOB, &gpio);
//----------------------------------------------------------------------
   movw.w r0, #0x0C00
   movt.w r0, #0x4001

   movw.w r2, #0x0000
   movt.w r2, #0xFF00

   ldr.w r1, [r0]
   orr.w r1, r1, r2
   str.w r1, [r0]

   //I2C1->CR1 |= 0x00000001;   //CR1_PE_Set;
   movw.w r0, #0x5400
   movt.w r0, #0x4000
   
   ldr.w r1, [r0]
   orr.w r1, r1, #1
   str.w r1, [r0]
//----------------------------------------------------------------------
   movw.w r0, #2500
pause:
   subs.w r0, r0, #1
   bne.w pause
//----------------------------------------------------------------------
//   SSD1306_Init();
//----------------------------------------------------------------------
   movw.w r3, #0xAE         // display off
   bl.w i2c_write
   
   movw.w r3, #0x20         //
   bl.w i2c_write
   
   movw.w r3, #0x10         //
   bl.w i2c_write
   
   movw.w r3, #0xB0         //
   bl.w i2c_write
   
   movw.w r3, #0xC8         //
   bl.w i2c_write
   
   movw.w r3, #0x00         //
   bl.w i2c_write
   
   movw.w r3, #0x10         //
   bl.w i2c_write
   
   movw.w r3, #0x40         //
   bl.w i2c_write
   
   movw.w r3, #0x81         //
   bl.w i2c_write
   
   movw.w r3, #0xFF         //
   bl.w i2c_write
   
   movw.w r3, #0xA1         //
   bl.w i2c_write
   
   movw.w r3, #0xA6         //
   bl.w i2c_write
   
   movw.w r3, #0xA8         //
   bl.w i2c_write
   
   movw.w r3, #0x3F         //
   bl.w i2c_write
   
   movw.w r3, #0xA4         //
   bl.w i2c_write
   
   movw.w r3, #0xD3         //
   bl.w i2c_write
   
   movw.w r3, #0x00         //
   bl.w i2c_write
   
   movw.w r3, #0xD5         //
   bl.w i2c_write
   
   movw.w r3, #0xF0         //
   bl.w i2c_write
   
   movw.w r3, #0xD9         //
   bl.w i2c_write
   
   movw.w r3, #0x22         //
   bl.w i2c_write
   
   movw.w r3, #0xDA         //
   bl.w i2c_write
   
   movw.w r3, #0x12         //
   bl.w i2c_write
   
   movw.w r3, #0xDB         //
   bl.w i2c_write
   
   movw.w r3, #0x20         //
   bl.w i2c_write
   
   movw.w r3, #0x8D         //
   bl.w i2c_write
   
   movw.w r3, #0x14         //
   bl.w i2c_write
   
   movw.w r3, #0xAF         // display on
   bl.w i2c_write
//----------------------------------------------------------------------
//   Главный цикл:
//----------------------------------------------------------------------
loop:
   b.w loop
//======================================================================
//   i2c_write
//======================================================================
i2c_write:
   push.w {lr}
//----------------------------------------------------------------------
//   START
//----------------------------------------------------------------------
   //I2C1->CR1 |= I2C_CR1_START;
   movw.w r0, #0x5400
   movt.w r0, #0x4000         // CR1
   
   ldr.w r1, [r0]
   orr.w r1, r1, #0x0100      // 0b00000001 00000000
   str.w r1, [r0]
   
   // Wait till I2C is busy, #20000
   movw.w r0, #0x5414
   movt.w r0, #0x4000         // SR1
   
L1:
   ldr.w r1, [r0]
   ands.w r1, r1, #0x0001      // 0b00000001   SR1.SB
   beq.w L1               // EQ: Z = 1
   
   // Enable ack if we select it
   //if(ack) I2Cx->CR1 |= I2C_CR1_ACK;
   
   movw.w r0, #0x5410
   movt.w r0, #0x4000         // DR
   
   movw.w r1, #0x78         // address
   str.w r1, [r0]            // mov [DR], 0x78 = 0x3C << 1
   
   // Wait till finished
   movw.w r0, #0x5414
   movt.w r0, #0x4000         // SR1
   
L2:
   ldr.w r1, [r0]
   ands.w r1, r1, #0x0002      // 0b00000010   SR1.ADDR
   beq.w L2               // EQ: Z = 1
   
   movw.w r0, #0x5418
   movt.w r0, #0x4000         // SR2
   ldr.w r1, [r0]            // просто читаем SR2
//----------------------------------------------------------------------
//   WRITE_DATA_REG
//----------------------------------------------------------------------
   // Wait till I2C is not busy anymore
   movw.w r0, #0x5414
   movt.w r0, #0x4000         // SR1
   
L3:
   ldr.w r1, [r0]
   ands.w r1, r1, #0x0080      // 0b00000010   SR1.TXE
   beq.w L3               // EQ: Z = 1
   
   movw.w r0, #0x5410
   movt.w r0, #0x4000         // DR
   
   movw.w r1, #0x00         // reg #0
   str.w r1, [r0]            // mov [DR], 0x00
//----------------------------------------------------------------------
//   WRITE_DATA_DATA
//----------------------------------------------------------------------
   // Wait till I2C is not busy anymore
   movw.w r0, #0x5414
   movt.w r0, #0x4000         // SR1
   
L4:
   ldr.w r1, [r0]
   ands.w r1, r1, #0x0080      // 0b10000000   SR1.TXE
   beq.w L4               // EQ: Z = 1
   
   movw.w r0, #0x5410
   movt.w r0, #0x4000         // DR
   
   str.w r3, [r0]            // mov [DR], r3
//----------------------------------------------------------------------
//   STOP
//----------------------------------------------------------------------
   movw.w r0, #0x5414
   movt.w r0, #0x4000         // SR1
   
L5:
   ldr.w r1, [r0]
   ands.w r1, r1, #0x0080      // 0b10000100   SR1.TXE || SR1.BTF
   beq.w L5               // EQ: Z = 1
   
   movw.w r0, #0x5400
   movt.w r0, #0x4000         // CR1
   
   ldr.w r1, [r0]
   orr.w r1, r1, #0x0200      // CR1.STOP
   str.w r1, [r0]            //
//----------------------------------------------------------------------
   pop.w {pc}
//======================================================================

Код сырой, кривой и ничего не делает, кроме инициализации аппаратного 'I2C' и OLED SSD1306, выводит мусор, но как база может пригодиться.
Постфиксы '.w' в инструкциях можно опустить, это мои религиозные взгляды, коментировать которые я не буду.

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

Прошивать (под Линукс) так:
Код:
st-flash write test.bin 0x8000000


Если у кого есть код 'C' на голых регистрах, поделитесь pls
Я имею ввиду такое:
Код:
I2C1->CR1 |= I2C_CR1_START;


А не такое:
Код:
    GPIO_InitTypeDef GPIO_InitStructure;
    RCC_APB2PeriphClockCmd( I2C_RCC_APB2Periph_GPIO, ENABLE );
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_SCL | GPIO_Pin_SDA;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;
    GPIO_Init( I2C_GPIO, &GPIO_InitStructure );

Второй вариант в сети гигабайтами можно выкачивать, но лично я его не воспринимаю


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

Зарегистрирован: 27 сен 2016, 19:56
Сообщения: 18
Цитата:
а мне надо понимать какой бит возвести, какой сбросить, в каком регистре, в какой последовательности и почему именно так, а не иначе. Я не нашел вменяемой пошаговой инициации аппаратного I2C на голых регистрах (которых 9 штук, описание битов есть в 'RM', а вот последовательности инициации нет, ткните носом, если кто знает)


Сюда иди
http://mcu.goodboard.ru/viewtopic.php?id=14

dosikus все расписал а alexsam под stm32f103 "переводил"


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

Зарегистрирован: 26 ноя 2012, 10:28
Сообщения: 3002
Откуда: КЧР, поселок Нижний Архыз
711aa, 103 — самая неудачная из STM32. Лучше по возможности ею не пользоваться. Скажем, на тех же F0 (лично я пробовал на 030 и 042) с I2C таких проблем нет. Но да: по-человечески с DMA его все равно не попользуешь, т.к. и там есть уйма косяков. Но в блокирующем режиме работает на ура. Хотя, конечно, блокирующий режим — это почти такая же содомия, как и ногодрыг...


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

Зарегистрирован: 18 май 2013, 20:43
Сообщения: 3746
Откуда: Кемеровская область, Киселевск
Eddy_Em про 103 не пори чушь ей больно

_________________
RADIOWOLF.RU


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

Зарегистрирован: 26 ноя 2012, 10:28
Сообщения: 3002
Откуда: КЧР, поселок Нижний Архыз
Oxford, ты errata 103'ей читал? Толщина не смутила? И описание косяков I2C…


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

Зарегистрирован: 18 май 2013, 20:43
Сообщения: 3746
Откуда: Кемеровская область, Киселевск
Eddy_Em, у тебя в голове Errata, список не смущает ошибок ДНК?

_________________
RADIOWOLF.RU


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

Зарегистрирован: 22 июл 2017, 11:48
Сообщения: 2478
Во бля... Не, ну это уже пиздец, извините за выражение... Софтовая реализация на ассемблере? Да ну нах! Ну куда это годится? Я думал, чел (топикстартер) - программист писюковый (PC, комп), как минимум на "плюсах" (C++) пишет... А он оказывается выше ассемблера не волокет. Где он там в Сях нашел тройные подчеркивания? С подчеркиваниями - это переопределения типов, на которые смотреть и не надо. Всегда и везде остаются базовые сишные типы, такие как int, unsigned int, char, short int, которые имеют более конкретные переопределения в виде uint32_t, uint8_t, int16_t - просто и понятно. Они тоже переопределены через имена с подчеркиваниями, но на промежуточные действия не надо обращать внимания, в конечном счете важно, что uint8_t приводит к базовому сишному unsigned char, и однозначно обозначает целое число в диапазоне 0...255.
Если топикстартер, как он выразился, "нихрена не понимает в Си", то надо учить этот самый Си.

Да и на ассемблере то - хня вышла, то же самое "нихрена не понимаю". Абсолютно все команды принудительно с .w - шириной 32 бита. Это не религиозные взгляды, чел, это непонимание механизма. bl.w в 32-битной ширите имеет огромный диапазон перехода, в отличие от bl.n шириной 16 бит, диапазона которого хватит уж точно в этом коде.
И ТС кроме как movw.w, ничего больше не знает. Это тяжкое наследие ПИКоводства, чувак. Полноценно писать на ассемблере для АРМ - это же мозги свернуть надо. Больше сотни инструкций, разные ядра имеют разный набор инструкций, почти каждая инструкция имеет 15 вариантов условного исполнения, да еще и у многих есть несколько вариантов второго операнда, да еще многие инструкции имеют варианты в 16-битной и в 32-битной ширине, с разными ограничениями по диапазону и составу операндов.
А помимо регистра r0 да r1 там еще доталова этих регистров. 32-битные инструкции имеют доступ к регистрам выше r7.
Вобщем, с этим вашим ассемблерным "кодом" только пальцем жопу чесать. Вы вот обижаетесь, когда вам по делу говорят, но тем не менее, это правда.
Так что ну уж не пятью ассемблерными инструкциями типа mov/movt мастрячить софтовый USB 2.0, это уж стопудово, чувак.


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

Зарегистрирован: 27 мар 2015, 01:22
Сообщения: 1337
BusMaster писал(а):
Я думал, чел (топикстартер) - программист

Да, я тоже ошибся, доморощенный хацкер оказался, но ведь как дышал, как дышал )


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

Зарегистрирован: 22 июл 2017, 11:48
Сообщения: 2478
Угу. Кстати, еще раз глянув ассемблерный код. А с чего это кул-хацкер вдруг решил, что ЭТО - софтовый I2C? Судя по цифрам в mov/movt получается адрес 0х40005410, что указывает на I2C1 (базовый адрес 0ч40005400), конкретно на регистр DR (смещение +0х10). То есть I2C получается как раз точнёхонько аппаратный, на модуле I2C1.
Так что, че тут топикстартер нам мозги втирает со своим софтовым интерфейсом??? Чо он гонит то??
Чел не знает и не хочет учить язык Си, а нам тут мозги трахает желанием написать впоследствии софтовый USB 2/3. А пока что как он будет на ассемблере картинку рисовать на SSD1306 то? Он со шрифтами загнется там к чертям с пятью ассемблерными инструкциями, которые он успел выучить. Там, если грубо посчитать все варианты, то для овладения ассемблером получится словарь в несколько тысяч слов. Чо херней то страдать? Проще Си выучить.

Кстати, в референс-мануале RM0008 четко и однозначна написана последовательность действий - че какой регистр какой бит куда нажать и че проверить, куда че переслать.
Да и вообще, эта самая "запись на регистрах" - это тоже тот же самый язык Си, только усложненный структурами, указателями, дефайнами. На первый взгляд простота записи кроется в огромном заголовочнике, в котором в результате большого количества дефайнов и указателей на структуры пришли к весьма простой записи I2C->CR1 |= I2C_CR1_PE или I2C1->DR = 0x52. Если убрать все навороты, то получится простое обращение по адресу: *(uint32_t*)0x40005410 = 0x52


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

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

Зарегистрирован: 13 июл 2016, 11:05
Сообщения: 319
vt340 писал(а):
Софтовый usb неинтересно [потому что никому не надо], интересно jtag


Лет 10-15 назад видел софтовый USB на каком-то PIC-е.
Кому-то ж надо было. :-)


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

Зарегистрирован: 27 мар 2015, 01:22
Сообщения: 1337
serglg писал(а):
vt340 писал(а):
Софтовый usb неинтересно [потому что никому не надо], интересно jtag


Лет 10-15 назад видел софтовый USB на каком-то PIC-е.
Кому-то ж надо было. :-)

10 лет в эмбеде == вечность
Вот аппаратный usb в простом как три копейки мк за 20 руб - http://mcu.goodboard.ru/viewtopic.php?id=89
[Попиарю ch55 пока selevo зависает в сказочных джунглях "китайских" чипов [хотя они примерно такие же китайские как stm32 швейцарские]]


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

Зарегистрирован: 26 ноя 2012, 10:28
Сообщения: 3002
Откуда: КЧР, поселок Нижний Архыз
vt340, лучше дальше одной линейки МК не вылезать. Задолбаешься же RM'ы с даташитами курить!
А тут вообще 51-я серия...
Хотя, признаться честно, иной раз нужен элементарный пятирублевый 8-ногий МК с 8кБ флеша и сотней кБ ОЗУ для реализации простейших вещей. Но приходится ставить 15-рублевый 20-ногий...


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

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


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

Зарегистрирован: 26 ноя 2012, 10:28
Сообщения: 3002
Откуда: КЧР, поселок Нижний Архыз
На велосипеде мне регистры туда-сюда тыркать не надо! Чего не скажешь об МК...
Сейчас обхожусь RM/datasheet на STM8S и STM32F0. Если дальше — это ужас!


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

Зарегистрирован: 22 июл 2017, 11:48
Сообщения: 2478
Eddy_Em писал(а):
vt340, лучше дальше одной линейки МК не вылезать. Задолбаешься же RM'ы с даташитами курить!

Это почему это? Нет, ну если для ваши поделок хватает F0, то пожалста, не вылезайте. Но ведь не F0 же единым ссыт человек... :)


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

Зарегистрирован: 26 ноя 2012, 10:28
Сообщения: 3002
Откуда: КЧР, поселок Нижний Архыз
Если мне понадобится аппаратный float, придется 4-ю серию курить, не спорю. Пока, к счастью, не нужно. И нет нужды тратить лишних 2-3 месяца на ознакомление с даташитами и написание сниппетов для дальнейшего использования.


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

Зарегистрирован: 27 мар 2015, 01:22
Сообщения: 1337
Eddy_Em писал(а):
На велосипеде мне регистры туда-сюда тыркать не надо! Чего не скажешь об МК...
Сейчас обхожусь RM/datasheet на STM8S и STM32F0. Если дальше — это ужас!

Ужас ужас там их аж 20 штук )


Вложения:
sfr8051.gif
sfr8051.gif [ 8.3 Кб | Просмотров: 1078 ]
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Программная реалицация протокола, например 'I2C'
СообщениеДобавлено: 20 июн 2018, 12:42 
Старожил

Зарегистрирован: 26 ноя 2012, 10:28
Сообщения: 3002
Откуда: КЧР, поселок Нижний Архыз
Маловато как-то для МК, который умеет UART, SPI, I2C, USB и т.п...


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

Зарегистрирован: 23 янв 2016, 15:37
Сообщения: 690
Eddy_Em писал(а):
Сейчас обхожусь RM/datasheet на STM8S и STM32F0. Если дальше — это ужас!

Если взять, допустим, F0 и F3(с FPU), то на уровне их общей периферии это практически идентичные чипы, разве что ADC там существенно отличается.


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

Зарегистрирован: 18 май 2013, 20:43
Сообщения: 3746
Откуда: Кемеровская область, Киселевск
Сейчас все дорожает импортное.. гайки затягиваются. Еще в феврале цены были другие...

_________________
RADIOWOLF.RU


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

Зарегистрирован: 28 янв 2010, 11:56
Сообщения: 2870
Откуда: Винница
vt340 писал(а):
Ну какой RM на мелкий x51, ты же когда на велосипед садишься перед этим инструкцию не читаешь )

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

_________________
Китайская комплектация - европейское качество!


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

Зарегистрирован: 15 июн 2018, 03:48
Сообщения: 17
vadiv писал(а):
Цитата:
а мне надо понимать какой бит возвести, какой сбросить, в каком регистре, в какой последовательности и почему именно так, а не иначе. Я не нашел вменяемой пошаговой инициации аппаратного I2C на голых регистрах (которых 9 штук, описание битов есть в 'RM', а вот последовательности инициации нет, ткните носом, если кто знает)


Сюда иди
http://mcu.goodboard.ru/viewtopic.php?id=14

dosikus все расписал а alexsam под stm32f103 "переводил"

Видел раньше эту страницу и не углядел, глаз уже замылился, спасибо.

Eddy_Em писал(а):
711aa, 103 — самая неудачная из STM32. Лучше по возможности ею не пользоваться. Скажем, на тех же F0 (лично я пробовал на 030 и 042) с I2C таких проблем нет.

STM32 для меня не самоцель, это просто подопытная лабораторная крыса, на которой мне проще отработать интересующие меня моменты, поэтому только китайский дешман, заказал еще на алике 'STM32F030F4P6', хотел начать с нее, но 103 раньше приехала, а 030 до сих пор нет.

BusMaster писал(а):
Во бля... Не, ну это уже пиздец, извините за выражение... Софтовая реализация на ассемблере? Да ну нах! Ну куда это годится? Я думал, чел (топикстартер) - программист писюковый (PC, комп), как минимум на "плюсах" (C++) пишет... А он оказывается выше ассемблера не волокет. Где он там в Сях нашел тройные подчеркивания? С подчеркиваниями - это переопределения типов, на которые смотреть и не надо. Всегда и везде остаются базовые сишные типы, такие как int, unsigned int, char, short int, которые имеют более конкретные переопределения в виде uint32_t, uint8_t, int16_t - просто и понятно. Они тоже переопределены через имена с подчеркиваниями, но на промежуточные действия не надо обращать внимания, в конечном счете важно, что uint8_t приводит к базовому сишному unsigned char, и однозначно обозначает целое число в диапазоне 0...255.
Если топикстартер, как он выразился, "нихрена не понимает в Си", то надо учить этот самый Си.

Именно про эти самые блядские переопределения я и говорю, есть 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 беззнаковых байт

Назовите мне хотя бы одну разумную причину, по которой их нужно переопределять, например так:
Код:
typedef unsigned int      uint_least32_t;
typedef unsigned int      uintptr_t;
typedef unsigned int      uint_fast32_t;

Или вот еще:
Код:
typedef __off64_t off_t;
typedef __ssize_t ssize_t;

Мне, к примеру, не понятно что это за сраные 'off_t' и 'ssize_t', которые, и миллион им подобных, в сишном коде встречаются постоянно.

BusMaster писал(а):
Угу. Кстати, еще раз глянув ассемблерный код. А с чего это кул-хацкер вдруг решил, что ЭТО - софтовый I2C? ...

Ну так взгляните еще-еще раз:
711aa писал(а):
Код сырой, кривой и ничего не делает, кроме инициализации аппаратного 'I2C'...

Написан так, что бы просто заработало, это мой кривой перевод с 'C', про 'красоту' и мои познания в ассемблере - "ах оставьте эти ваши ..."

BusMaster писал(а):
Чел не знает и не хочет учить язык Си, а нам тут мозги трахает...

Первое утверждение в самую точку, а второе, почему 'нам', говорите за себя, дело то добровольное, я же вас не принуждаю. Вы уважаемый (не в огорчение), слишком эмоциональный, быстро делаете выводы и вешаете ярлыки, вам это не мешает в реальной жизни? Да я знаю, что это не мое дело, поэтому вопрос риторический.
Опять же предлагаю не устраивать срач, не нравиться тема дискуссии, или сам ТС, или его взгляды, или ..., просто проходите мимо, полно других веток, а меня в личный бан, навечно, поскольку я и дальше планирую хотеть софтовый USB 3.1 и 3.2 на голом ассемблере, буду принудительно добавлять постфикс '.w' и далее по списку.
Да и вообще, спорить о вкусах и предпочтениях это тупиковое направление с бесконечным циклом, не находите? Предлагаю не делать этого.

BusMaster писал(а):
Кстати, в референс-мануале RM0008 четко и однозначна написана последовательность действий - че какой регистр какой бит куда нажать и че проверить, куда че переслать.

А вот это уже конструктивная критика, за это спасибо, пишите только номер страницы, когда ссылаетесь на официальный документ.

BusMaster писал(а):
Да и вообще, эта самая "запись на регистрах" - это тоже тот же самый язык Си, только усложненный структурами, указателями, дефайнами. На первый взгляд простота записи кроется в огромном заголовочнике, в котором в результате большого количества дефайнов и указателей на структуры пришли к весьма простой записи I2C->CR1 |= I2C_CR1_PE или I2C1->DR = 0x52. Если убрать все навороты, то получится простое обращение по адресу: *(uint32_t*)0x40005410 = 0x52

Ну сразу бы так, в таком формате не грех и пообщаться.


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

Зарегистрирован: 06 ноя 2013, 16:07
Сообщения: 579
Откуда: Германия
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 беззнаковых байт


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


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

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


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

Сейчас этот форум просматривают: Cujo


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

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

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