Про SPI

Здесь принимаются все самые невообразимые вопросы... Главное - не стесняйтесь. Поверьте, у нас поначалу вопросы были еще глупее :)
Ответить
Аватара пользователя
Alek Lem
Вымогатель припоя
Сообщения: 526
Зарегистрирован: Вс дек 28, 2014 18:35:34
Откуда: Луганск

Про SPI

Сообщение Alek Lem »

Читаю datasheet на АЦП MCP3201. Вопрос по временной диаграмме SPI:

Изображение

В принципе, понятно. По переднему фронту clock данные проходят на МК, при этом, первый принятый байт является старшим (?,?,0,B11...B7), а второй байт - младшим (B6..B0). После приёма бита B0, если не отключить CS, то данные начинают передаваться в обратном порядке, а после передачи двух байт -- нули до бесконечности.

Мне непонятно, в каком прядке передаются биты младшего и старшего байтов. Судя по клокам, в старшем байте первыми передались биты ?,?,0 и вплоть до B7. В младшем байте аналогично первым зашел B6, а последний B0. Но судя по расположению битов в регистре, в старшем байте первыми прошли биты B7, B6 и т.д. Ведь в SPI первый зашедший бит -- это младший бит в регистре ? То есть, чем правее, тем "первее" или я ошибаюсь ?
Аватара пользователя
mickbell
Друг Кота
Сообщения: 16373
Зарегистрирован: Пт мар 30, 2012 05:17:29
Откуда: Екатеринбург

Re: Про SPI

Сообщение mickbell »

Alek Lem писал(а):Читаю datasheet на АЦП MCP3201. Вопрос по временной диаграмме SPI:
Не совсем понятен вопрос. В первом абзаце всё расписано так, как нарисовано на временной диаграмме - то есть, я думаю, правильно. И порядок там же указан: СНАЧАЛА передаются два "ничего" (HI-Z), потом ноль, далее значащие биты, НАЧИНАЯ со старшего. А дальше уже ваша задача - настроить, чтобы SPI принимал данные, начиная со старшего бита и по переднему фронту клоков. То, что нарисовано снизу - это то, что будет после приёма обоих байтов в регистрах МК.
Alek Lem писал(а):Мне непонятно, в каком прядке передаются биты младшего и старшего байтов. Судя по клокам, в старшем байте первыми передались биты ?,?,0 и вплоть до B7. В младшем байте аналогично первым зашел B6, а последний B0.
Да вроде так.
Alek Lem писал(а):Но судя по расположению битов в регистре, в старшем байте первыми прошли биты B7, B6 и т.д. Ведь в SPI первый зашедший бит -- это младший бит в регистре ? То есть, чем правее, тем "первее" или я ошибаюсь ?
Почему??? B7 и B6 вообще относятся к разным регистрам. Потом, расположение битов в регистре вообще никак не связано с порядком приёма их.

PS. Именно с этим АЦП я не работал, но не думаю, что микрочип (это ведь его изделие?) в документации написал не так, как есть на самом деле - на него это не похоже.
И хрюкотали зелюки,
Как мюмзики в мове.

На каждый РКН
Найдётся VPN.
Аватара пользователя
Alek Lem
Вымогатель припоя
Сообщения: 526
Зарегистрирован: Вс дек 28, 2014 18:35:34
Откуда: Луганск

Re: Про SPI

Сообщение Alek Lem »

mickbell писал(а):Почему??? B7 и B6 вообще относятся к разным регистрам.
Опечатка, конечно. Имел ввиду B7, потом B8, потом B9...и т.д.

mickbell писал(а):Потом, расположение битов в регистре вообще никак не связано с порядком приёма их.
Вооот, за подтверждением этой мысли я и пришел. Ориентировался я на подобную картинку:

Изображение

Судя по этой картинке, в Master первый прошел бит 7, поэтому он младший в сдвиговом регистре.

mickbell писал(а):PS. Именно с этим АЦП я не работал, но не думаю, что микрочип (это ведь его изделие?) в документации написал не так, как есть на самом деле - на него это не похоже.
В правильности документации Microchip я не сомневаюсь. Но я не был уверен, что правильно истолковал микрочиповскую диаграмму. А еще эта терминология: MSB и LSB может быть как старший/младший значащий БИТ и как старший/младший значащий БАЙТ.

И еще вопрос вдогонку. Сразу после приёма первого байта могу ли я остановить клоки аппаратного SPI на Atmega8, не отключая микросхему, т.е. не поднимая бит выбора CS (SS) в "1", так как это показано на временной диаграмме в момент передачи бита B6 ? На сколько я помню, нельзя. И единственное, что мне приходит пока в голову -- это либо после приёма старшего байта за время периода клока "быстро" скопировать информацию со сдвигового регистра -- пока фронт клока еще не изменился. Либо, чтобы не торопиться, сразу же увеличить коэффициент делителя клока до максимума (128) и не спеша все сделать.
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15546
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Re: Про SPI

Сообщение BOB51 »

Если используется аппаратный блок - лучше с "досрочным доступом" и прочим "рукоприкладством" не предусмотренным документацией не мудрить.
Можно конечно программно замутить...
НО...
Аппаратный протокол внешнего устройства рассчитан из того, что изложено в документации на устройство.
Досрочное окончание запроса (недостаток тактовых импульсов в частности) может привести к сбою во внешнем устройстве (сбой последовательности адресации, незавершенность последней операции и/или из оного проистекаюшши).
Гораздо вернее выполнить полный цикл по протоколу, а затем, уже в процессе обработки принятых данных, "отбросить лишнее" методами самого МК.
:roll:
Аватара пользователя
Alek Lem
Вымогатель припоя
Сообщения: 526
Зарегистрирован: Вс дек 28, 2014 18:35:34
Откуда: Луганск

Re: Про SPI

Сообщение Alek Lem »

BOB51 писал(а):Досрочное окончание запроса (недостаток тактовых импульсов в частности) может привести к сбою во внешнем устройстве (сбой последовательности адресации, незавершенность последней операции и/или из оного проистекаюшши).
Гораздо вернее выполнить полный цикл по протоколу, а затем, уже в процессе обработки принятых данных, "отбросить лишнее" методами самого МК.
:roll:
Нет, Вы кажется, не поняли мой вопрос. Я хочу оборвать тактовые импульсы не с целью ДОСРОЧНО прервать передачу байта для более удобной обработки данных. Пишу на ассемблере и пару строчек кода перекидки битов с байта на байт меня не напрягут совершенно.
СпойлерОтклоняясь от темы замечу, что Microchip и это продумала.

Код: Выделить всё

After the second eight clocks have been sent to the device, the MCU receive register will contain the lowest-order seven bits and the B1 bit repeated as the A/D Converter has begun to shift out LSB first data with the extra clock. 
Typical procedure would then call for the lower-order byte of data to be shifted right by one bit to remove the extra B1 bit. The B7 bit is then transferred from the high-order byte to the lower-order byte, and then the higher-order byte is shifted one bit to the right as well. Easier manipulation of the converted data can be obtained by using this method.

Тут говорится, что после приёма двух байт данных АЦП, если не отключать клоки и сигнал выбора, продолжит сдвигать биты вправо и после первого же сдвига бит B0 станет самым правым в младшем байте , а бит 7 перейдет из старшего байта в младший и станет там самым левым, соответственно. И тогда младший байт уже не нужно никак обрабатывать - он готов родименький к использованию.

Но я спрашиваю про реализацию ЗАЯВЛЕННОЙ Microchip-ом задержки тактового импульса при передачи бита B6 (см. временную диаграмму, такт 9). Связано эта задержка с тем, как я понял, что после приёма старшего байта я не отключаю микрсхему, как обычно делается в однобайтной передаче, а продолжаю считывать всё слово целиком. И мне нужно быстро снять данные из сдвигового регистра SPI контроллера, пока данные в нём не изменились, иначе я потеряю информацию. Поэтому в девятом такте генерация импульсов прекращается. В принципе, я могу заранее поставить частоту тактовых импульсов такой (скажем, Fclk = Fcpu/4 или Fclk = Fcpu/8) , чтобы за время одного клока я успел скопировать сдвиговый регистр и тогда мне не надо тормозить импульсы. Но если я хочу работать на частоте Fclk = Fcpu/2, тогда после приёма первого байта нужно что-то думать. Например, следующей командой изменить частоту с Fcpu/2 до Fcpu/16, например. То есть, временно затянуть генератор импульсов SPI. На самом деле, мне не критично, Fcpu/4 или Fcpu/2, так что могу поставить Fcpu/4 и не мучится, просто спортивный интерес -- как сделать, если я не успеваю скопировать регистр.

Добавлено after 5 hours 24 minutes 35 seconds:
Создается ощущение, что разобрался с обеими вопросами. По поводу расположения первого вошедшего бита в регистр сдвига. Я, как "Master", сам решаю, первый вошедший бит будет расположен в конце слева или в конце справа регистра. То есть, я решаю в какую сторону будет "двигаться" карусель MISO-MISO, MOSI-MOSI.
Изображение

На рисунке направление выбрано так, чтобы первый вошедший бит из Slave был слева. Из переводной инструкции к AVR от Евстифеева:

Порядок передачи разрядов данных определяется состоянием разряда DORD регистра SPCR. Если разряд установлен в «1», первым передается младший разряд байта, если же сброшен в «0» — старший разряд.

По поводу второго вопроса: как остановить CLOCK, после передачи первого байта. Я невнимательно читал документацию к AVR:
Передача данных осуществляется следующим образом. При записи в регистр данных SPI ведущего микроконтроллера запускается генератор тактового сигнала модуля SPI, и данные начинают поразрядно выдаваться на вывод MOSI и соответственно поступать на вывод MOSI ведомого микроконтроллера. После выдачи последнего разряда текущего байта генератор тактового сигнала останавливается с одновременной установкой в «1» флага «Конец передачи» (SPIF). После этого ведущий микроконтроллер может начать передачу следующего байта.
Одновременно с передачей данных от ведущего к ведомому происходит передача и в обратном направлении при условии, что на входе SS ведомого присутствует напряжение НИЗКОГО уровня.

То есть, после приёма первого байта, тактовые импульсы автоматически прекращаются. Для приёма второго байта мне нужно загрузить в регистр данных SPI какое-либо число и "карусель" опять начнет крутиться.
Аватара пользователя
mickbell
Друг Кота
Сообщения: 16373
Зарегистрирован: Пт мар 30, 2012 05:17:29
Откуда: Екатеринбург

Re: Про SPI

Сообщение mickbell »

Вы обмен совершаете через аппаратный SPI или занимаетесь ногодрыганием? В последнем случае я не понял, что мешает вообще прекратить генерировать клоки до перекидывания байта.
По-моему, кто-то непонятно объясняет. Или кто-то не понимает нормально рассказанное. :)))
И хрюкотали зелюки,
Как мюмзики в мове.

На каждый РКН
Найдётся VPN.
Аватара пользователя
Alek Lem
Вымогатель припоя
Сообщения: 526
Зарегистрирован: Вс дек 28, 2014 18:35:34
Откуда: Луганск

Re: Про SPI

Сообщение Alek Lem »

Никакого ногодрыгания, аппаратный SPI. Вроде, разобрался. Он сам останавилвает клоки после приёма первого байта. И направление передачи я сам выбираю.
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15546
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Re: Про SPI

Сообщение BOB51 »

Та задержка более условна.
Собственно даже аппаратный SPI дает непрервыность в пределах одного байта - затем бедет некотроая задержка при досылке в регистр очередного байта данных. А уж насколько - зависит от соотношения выбранной скорости обмена и собственной скорости исполнения команд в МК.
8)
Ответить

Вернуться в «Теория»