SPI несколько байт без пробелов
- Войдите на сайт для отправки комментариев
Ср, 12/02/2020 - 02:55
Прошу прощения, начинающий Arduinец, просмотрел несколько похожих тем, но не нашёл в них ответа.
В синтезатор частоты надо послать через SPI несколько байтов для установки частоты, амплитуды, фазового сдвига и пр. Посылаться байты должны сплошным потоком, количество их может быть любое . У меня есть несколько предпочтительных команд в виде 7ми, 3х, 4х байт.
Пока не получается сплошной поток. Даже если пробую послать 2 байта нулей через SPI.transfer16 ,всё равно есть "палка" между байтами.
Может ли кто либо какой-то простой код показать, как отослать кучу бит одним потоком. Заранее благодарен и надеюсь не заклюёте начинающего.
лучше вы нам покажите, как вы байты посылаете
да как я только не пробовал. ( но наверно всё неправильно Ж) )
Вот последний
#include <SPI.h>
void setup() {
SPI.begin();
pinMode(10, OUTPUT); // SS(CS) active - negative
pinMode(11, OUTPUT); // output data
pinMode(12, INPUT); // input data
pinMode(SS, HIGH);
digitalWrite(12, HIGH);
}
void loop() {
digitalWrite(SS, LOW);
SPI.beginTransaction(SPISettings(1000000, MSBFIRST, SPI_MODE0));
SPI.transfer16(0x0000);
SPI.endTransaction();
digitalWrite(SS, HIGH);
}
А как проверяете, что они не отправляются?
В синтезатор частоты надо послать через SPI несколько байтов для установки частоты, амплитуды, фазового сдвига и пр. Посылаться байты должны сплошным потоком, количество их может быть любое . У меня есть несколько предпочтительных команд в виде 7ми, 3х, 4х байт.
Пока не получается сплошной поток. Даже если пробую послать 2 байта нулей через SPI.transfer16 ,всё равно есть "палка" между байтами.
Что токое "палка" между байтами ? Данные по SPI передаются либо по фронту либо по спаду SCLK (в зависимости от настройки) И пауза между байтами может быть сколь угодно большой если SCLK не меняется. Приемник этого просто "не замечает", по крайней мере, пока пауза не выйдет за пределы таймаута
Как не отправляются? Они отправляются. Только между ними ( нулями ) пик появляется. ( А на фото )
Верхняя - MOSi нижняя SS
И ещё не понятно чем определяется время отключение SS ( B на фото )
Как не отправляются? Они отправляются. Только между ними ( нулями ) пик появляется. ( А на фото )
Верхняя - MOSi нижняя SS
И ещё не понятно чем определяется время отключение SS ( B на фото )
А где SCLK? А SS вы же сами управляете. Если на шине только один слейв, то SS можно вообще один раз выставить и больше не дергать. Он нужен если надо с разными устройствами по одной шине общаться.
Что токое "палка" между байтами ? Данные по SPI передаются либо по фронту либо по спаду SCLK (в зависимости от настройки) И пауза между байтами может быть сколь угодно большой если SCLK не меняется. Приемник этого просто "не замечает", по крайней мере, пока пауза не выйдет за пределы таймаута
А тайм аут какой? Чем он определяется?
И ещё, можете мне подсказать как передать четыре байта - 2A , 52 , 53 , 54
По идее устройство сбросится и ответит что-то на MISO
И ещё, можете мне подсказать как передать четыре байта - 2A , 52 , 53 , 54
По идее устройство сбросится и ответит что-то на MISO
добавьте второй SPI.Transfer() после первого да и передайте
А где SCLK? А SS вы же сами управляете. Если на шине только один слейв, то SS можно вообще один раз выставить и больше не дергать. Он нужен если надо с разными устройствами по одной шине общаться.
Да, устройство одно. По идее SS не нужен....... А как будет определяться начало и конец информационной посылки?
SCK я подаю. Просто осцилограф не 4-х канальный. Кстати SCK сдвигается по времени как раз на ширину "палки" между байтами
SCK я подаю. Просто осцилограф не 4-х канальный. Кстати SCK сдвигается по времени как раз на ширину "палки" между байтами
сорри, но по-моему это "горе от ума" называется:)
Прежде чем искать проблемы на осциллографе - стоило просто проверить, принимает ли приемник посылку. А то может и проблемы никаклой нет
Вот что получитось при
SPI.transfer16(0x0000);
SPI.transfer16(0x0000);
т.е. 2 раза
Ладно, попробую c "палками" сделать ресет
А тайм аут какой? Чем он определяется?
И ещё, можете мне подсказать как передать четыре байта - 2A , 52 , 53 , 54
По идее устройство сбросится и ответит что-то на MISO
Таймаут может у слейва быть реализован, а может нет. Зависит от SPI контроллера. Какой он там в вашем синтезаторе я не знаю.
надо передать 4 байта?
SPI.transfer(b1);
SPI.transfer(b2);
SPI.transfer(b3);
SPI.transfer(b4);
V
Полез в осцилограф, когда простыми методами не получалось. Может действительно зря
MAX6755 завершает конверсию по SS LOW. Если на входе постоянная активность, то данные обновляться не будут
UPD. Имелся в виду MAX6675. Что-то я в этих одинаковых цифирях уже путаться начинаю.
Спасибо друзья. Ваши подсказки внушили мне уверенность и всё заработало.