Библиотека под такой протокол
- Войдите на сайт для отправки комментариев
Сб, 17/06/2017 - 20:07
Для работы АЦП на него надо подавать тактовый сигнал (строка 1 на рисунке), стартовый бит (строка 2) и АЦП будет выдавать 13 бит последовательным кодом (строка 3). Стартовый бит можно подавать в формате "длинный" или "короткий" - соответсвенно рисунки 2 и 1.
Есть ли готовая библиотека под такой протокол, чтобы не изобретать велосипед?
короткий старт-бит:
длинный старт-бит:
А чем SPI не подходит? Хоть программная, хоть аппаратная. Верхняя это CLK, средняя это CS,Немного корректировать а нижняя это MISO.
Можно еще веселее средний MOSI взять . Итого CLK/MOSI/MISO . Отправил по MOSI как бы длиный/короткий строб и MISO Заглотнул 2 байта . В Ардуино библиотека SPI.h
Я только начинаю, не судите пожалуйста строго.
Доступна функция отправки 1 байт (8 бит). А мне нужно 1 бит или 14 бит (длинный режим= 13+ 1 стартовый). Как это сделать ? https://www.arduino.cc/en/Reference/SPI http://arduino.ru/Reference/Library/SPI
И как одна функция transfer() http://arduino.ru/Reference/Library/SPI/transfer может использоваться одновременно на чтение и запись?
Понятно, что master передает по MOSI и slave по MISO. Хочу понять глубже - если бы сопряженное устройство было бы двунаправленным , то невольно придется передавать ему байт ради приема байта.
Устройство может трактовать переданный ему байт как управляющую команду, что хорошего выйдет из этого ?
CS - это выбор устройства.
К одним и тем же MOSI, MISO и CLK можно подключить несколько разных устройств. С каким из них общаться, определяет как раз сигнал CS - на выбранном устройстве он низкий, а на всех остальных - высокий.
Если число байт для передачи некратно 8, нужно округлять в большую сторону.
SPI - полнодуплексный протокол. Соответственно, передача одновременно идет в обе стороны.
Ну для АЦП как раз сначала ему передается команда (адрес), и только после этого с него можно получить данные.
У вас 14 бит . Вот и передавайте их двумя посылками по 8 байт. Лишним битам дайте 0. И обратно прием двух посылок по 8 бит. Лишние вы просто игнорируете. SPI это регистр последовательного сдвига , один бит передается и одновременно один бит принимается. 8 тактов идет считавание информации с этого регистра, и потом запись.
В SPI 2 посылки по1 байту это 16 бит без пауз между ними, те 16 тактов, а не 17++++++++ ?
Power up input (PUI) signal. When this pin is tied to VDD, the part is powered up. When tied to VSS,
the part is powered down.
Another way to power down is to set the PUI pin to LOW. When the system needs to be powered up again, the PUI pin needs to be set to HIGH and the Frame Sync pulse needs to be present. It will take two Frame Sync cycles before the pin PCMT will become low impedance.
Если вы хотите потрепаться, то я не буду вам мешать . А если по делу. То CLK в SPI тактует только по делу. Нет посылок приема , то и нет тактов. Передача 8 байт (формировка вашего старт бита) - 8 импульсов, прием байта 8 импульсов, прием еще байта - еще 8 импульсов. Так что хотите лишние испульсы - отправляйте или принимайте в холостую.
Я о другом. Если подряд без задержки послать функцией transfer() в SPI байт 0xFF, а за ним еще один байт 0b11111000, то на линии MOSI будет 13 битов HIGH и 5 битов LOW или на границе между байтами может получиться разрыв в 1 или более тактов ?
Если разрыв, то и SCLK как Вы написали в это время не будет работать и сорвется незаконченный прием из АЦП?
Ничего хорошего пока не получилось, послал 2 байта 0xFF и 0xFF, на выводе MOSI при помощи двух прерываний подсчитал что получается : 2 передних фронта (RISING) импульсов и 2 задних (FALLING). А мне нужно 1 передний и 1 задний фронт.
Как убрать "иголку" между импульсами?
Идем по пути "C:\Program Files (x86)\Arduino\hardware\arduino\avr\libraries\SPI\src\SPI.h"
Открываем файл SPI.h
Очень хорошо протираем глазки и смотрим на строку 220
qwone, спасибо за помощь. Я не знал о существовании transfer16()
в руской версии описания SPI.H (на arduino.ru http://arduino.ru/Reference/Library/SPI ) его нет, но есть в английской https://www.arduino.cc/en/Reference/SPITransfer
receivedVal = SPI.transfer(val)
receivedVal16 = SPI.transfer16(val16)
SPI.transfer(buffer, size)
Еще оказалось есть функция для пользовательского количества бит :
Видимо на АЦП в качестве CS нужно использовать PUI с поправкой на неинверсность:
Но как поступить если на ардуино CS инверсный, а у АЦП не инверсный. Есть в SPI.H настройка для программного инвертирования CS ? Не хочется ставить костыль TTL-инвертор снаружи атмеги ...
За что отвечает CE в SPI, почему-то он не описан в кратком руководстве ?
https://www.arduino.cc/en/Reference/SPI
and one line specific for every device:
А почему не хотите ShiftOut взять и подкорректировать под свои нужды?
Можно, если этот PUI не сбрасывает настройки и после него не нужна реинициализация.
Создать выход CS2 помимо библиотечного и и использовать его. Перед обращением к нужному SPI устройству подавать на CS2 высокий уровень, а по окончании низкий.
SS и CS одно и то же ?
Изменить алгоритм работы CS в библиотечной функции не могу, тк перестанут работать другие SPI устройства с обычным инверсным CS.
Можно, если этот PUI не сбрасывает настройки и после него не нужна реинициализация.
Точно никаких программных настроек не сбрасывает, потому что в этом АЦП их нет.
Спасибо участникам форума, оказавшим помощь. Первую часть проблемы с АЦП решил инвертировав CS. ДЛя этого создал копию стандартной библиотеки с инверсией.
Помогите пожалуйста придумать способ для управления ЦАП (цифро-аналоговым преобразователем). Проблема в том, что для управления требуется 3 сигнала:
1) для тактирования подойдет стандартный SСLK
2) для стартового бита, синхроного с SCKL подходит MOSI
3) также надо передавать данные в DAC, те нужно некое подобие MOSI №2 синхронного с SСLK, которого в SPI нет