Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: STM8S - правда, что UART в режиме SPI выплёвывает данные только LSB-ом вперёд?
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Все остальные микроконтроллеры > STM8
InsolentS
Собственно сабж. Какой же тогда толк от такого SPI??
scifi
Цитата(InsolentS @ Nov 15 2012, 11:13) *
Собственно сабж. Какой же тогда толк от такого SPI??

Не нравится - не кушайте. А если очень надо, то и такой пригодится. К тому же никто не мешает переставлять биты в софте.
InsolentS
Цитата(scifi @ Nov 15 2012, 17:21) *
Не нравится - не кушайте. А если очень надо, то и такой пригодится. К тому же никто не мешает переставлять биты в софте.

Дело не в том - нравится или не нравится. Это большой подводный камень, который не заметно с первого взгляда. Мне надо было 2 SPI и 1 UART в устройстве, я заложил 2 SPI аппаратных, а UART решил сделать софтовым. Вот только 2ой "аппаратный SPI" подкачал, пришлось делать его тоже софтовым sad.gif
Биты я бы с удовольствием переставил. Если бы в instruction set была команда реверса, как в cortex.
Я ничего против не имею stm8, с удовольствием его использую. Ожидал ответы, типа "ты пропустил битик такой-то в регистре таком-то, установи его и всё попрёт" sm.gif
_Артём_
Цитата(InsolentS @ Nov 15 2012, 14:29) *
Если бы в instruction set была команда реверса, как в cortex.
Я ничего против не имею stm8, с удовольствием его использую. Ожидал ответы, типа "ты пропустил битик такой-то в регистре таком-то, установи его и всё попрёт" sm.gif

Можно через таблицу переставить. Не подходит?
scifi
Ещё возможен такой вариант:
Код
uint8_t bitrev(uint8_t byte)
{
        asm("RLC A"); asm("RRCW X");
        asm("RLC A"); asm("RRCW X");
        asm("RLC A"); asm("RRCW X");
        asm("RLC A"); asm("RRCW X");
        asm("RLC A"); asm("RRCW X");
        asm("RLC A"); asm("RRCW X");
        asm("RLC A"); asm("RRCW X");
        asm("RLC A"); asm("RRCW X");
        asm("RLWA X, A");
        return byte;
}

33 такта вместе с вызовом функции и возвратом.
Update
А вот такой код на 6 тактов быстрее:
Код
uint8_t bitrev(uint8_t byte)
{
        asm("LD 0, A");
        asm("SRL A");
        asm("AND A, #0x55");
        asm("LD 1, A");
        asm("LD A, 0");
        asm("AND A, #0x55");
        asm("SLA A");
        asm("OR A, 1");
        asm("LD 0, A");
        asm("SRL A");
        asm("SRL A");
        asm("AND A, #0x33");
        asm("LD 1, A");
        asm("LD A, 0");
        asm("AND A, #0x33");
        asm("SLA A");
        asm("SLA A");
        asm("OR A, 1");
        asm("SWAP A");
        return byte;
}
InsolentS
Цитата(_Артём_ @ Nov 15 2012, 18:53) *
Можно через таблицу переставить. Не подходит?

Нет, не хотелось бы расходовать память программ, её мало sm.gif

Цитата(scifi @ Nov 15 2012, 19:49) *
-

Спасибо за код, думаю, многим он пригодится. У меня тоже получалось порядка 30 тактов.
В моём случае проще сделать софтовый SPI - к счастью, на втором конце сидит АЦП, общение с которым происходит достаточно редко.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2024 Invision Power Services, Inc.