SPI несколько байт без пробелов

Xboct
Offline
Зарегистрирован: 12.02.2020

Прошу прощения, начинающий Arduinец, просмотрел несколько похожих тем, но не нашёл в них ответа.

В синтезатор частоты надо послать через SPI несколько байтов для установки частоты, амплитуды, фазового сдвига и пр. Посылаться байты должны сплошным потоком, количество их может быть любое . У меня есть несколько предпочтительных команд в виде 7ми, 3х, 4х байт. 
Пока не получается сплошной поток. Даже если пробую послать 2 байта нулей через SPI.transfer16 ,всё равно есть "палка" между байтами.

Может ли кто либо какой-то простой код показать, как отослать кучу бит одним потоком. Заранее благодарен и надеюсь не заклюёте начинающего.

b707
Offline
Зарегистрирован: 26.05.2017

лучше вы нам покажите, как вы байты посылаете

Xboct
Offline
Зарегистрирован: 12.02.2020

да как я только не пробовал. ( но наверно всё неправильно Ж) )

Вот последний

#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);

    }

b707
Offline
Зарегистрирован: 26.05.2017

А как проверяете, что они не отправляются?

asam
asam аватар
Offline
Зарегистрирован: 12.12.2018

Xboct пишет:

В синтезатор частоты надо послать через SPI несколько байтов для установки частоты, амплитуды, фазового сдвига и пр. Посылаться байты должны сплошным потоком, количество их может быть любое . У меня есть несколько предпочтительных команд в виде 7ми, 3х, 4х байт. 
Пока не получается сплошной поток. Даже если пробую послать 2 байта нулей через SPI.transfer16 ,всё равно есть "палка" между байтами.

Что токое "палка" между байтами ? Данные по SPI передаются либо по фронту либо по спаду SCLK  (в зависимости от настройки) И пауза между байтами может быть сколь угодно большой если SCLK не меняется. Приемник этого просто "не замечает", по крайней мере, пока пауза не выйдет за пределы таймаута 

Xboct
Offline
Зарегистрирован: 12.02.2020

Как не отправляются? Они отправляются. Только между ними ( нулями ) пик появляется. ( А на фото )

Верхняя - MOSi нижняя SS

И ещё не понятно чем определяется время отключение SS ( B на фото )

asam
asam аватар
Offline
Зарегистрирован: 12.12.2018

Xboct пишет:

Как не отправляются? Они отправляются. Только между ними ( нулями ) пик появляется. ( А на фото )

Верхняя - MOSi нижняя SS

И ещё не понятно чем определяется время отключение SS ( B на фото )

А где SCLK? А SS вы же сами управляете. Если на шине только один слейв, то SS можно вообще один раз выставить и больше не дергать. Он нужен если надо с разными устройствами по одной шине общаться.

Xboct
Offline
Зарегистрирован: 12.02.2020

asam пишет:

Что токое "палка" между байтами ? Данные по SPI передаются либо по фронту либо по спаду SCLK  (в зависимости от настройки) И пауза между байтами может быть сколь угодно большой если SCLK не меняется. Приемник этого просто "не замечает", по крайней мере, пока пауза не выйдет за пределы таймаута 

А тайм аут какой? Чем он определяется?

И ещё, можете мне подсказать как передать четыре байта - 2A , 52 , 53 , 54

По идее устройство сбросится и ответит что-то на MISO

b707
Offline
Зарегистрирован: 26.05.2017

Xboct пишет:

И ещё, можете мне подсказать как передать четыре байта - 2A , 52 , 53 , 54

По идее устройство сбросится и ответит что-то на MISO

добавьте второй SPI.Transfer() после первого да и передайте

Xboct
Offline
Зарегистрирован: 12.02.2020

asam пишет:

А где SCLK? А SS вы же сами управляете. Если на шине только один слейв, то SS можно вообще один раз выставить и больше не дергать. Он нужен если надо с разными устройствами по одной шине общаться.

Да, устройство одно. По идее SS не нужен....... А как будет определяться начало и конец информационной посылки? 

SCK я подаю. Просто осцилограф не 4-х канальный. Кстати SCK сдвигается по времени как раз на ширину "палки" между байтами

b707
Offline
Зарегистрирован: 26.05.2017

Xboct пишет:

SCK я подаю. Просто осцилограф не 4-х канальный. Кстати SCK сдвигается по времени как раз на ширину "палки" между байтами

сорри, но по-моему это "горе от ума" называется:)

Прежде чем искать проблемы на осциллографе - стоило просто проверить, принимает ли приемник посылку. А то может и проблемы никаклой нет

Xboct
Offline
Зарегистрирован: 12.02.2020

Вот что получитось при

SPI.transfer16(0x0000);

SPI.transfer16(0x0000);

т.е. 2 раза

Ладно, попробую c "палками" сделать ресет

asam
asam аватар
Offline
Зарегистрирован: 12.12.2018

Xboct пишет:

А тайм аут какой? Чем он определяется?

И ещё, можете мне подсказать как передать четыре байта - 2A , 52 , 53 , 54

По идее устройство сбросится и ответит что-то на MISO

Таймаут может у слейва быть реализован, а может нет. Зависит от SPI контроллера. Какой он там в вашем синтезаторе я не знаю.

надо передать 4 байта?

SPI.transfer(b1);
SPI.transfer(b2);
SPI.transfer(b3);
SPI.transfer(b4);

 

V

 

Xboct
Offline
Зарегистрирован: 12.02.2020

Полез в осцилограф, когда простыми методами не получалось. Может действительно зря 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

asam пишет:
Если на шине только один слейв, то SS можно вообще один раз выставить и больше не дергать.
Не всегда. От устройства зависит. Сейчас точно не вспомню что именно, но попадались устройства, которые "готовились читать" и "завершали приём" по изменению на SS, а если держать всё время выбранным, то не работали.

sadman41
Offline
Зарегистрирован: 19.10.2016

MAX6755 завершает конверсию по SS LOW. Если на входе постоянная активность, то данные обновляться не будут

UPD. Имелся в виду MAX6675. Что-то я в этих одинаковых цифирях уже путаться начинаю.

Xboct
Offline
Зарегистрирован: 12.02.2020

Спасибо друзья. Ваши подсказки внушили мне уверенность и всё заработало.