SPI пропускает биты

Heven
Offline
Зарегистрирован: 27.03.2016

Суть в том что я должен получить 24 бита от SPI ведомого, но при выводе в com порт видно что часть из них теряется.

#include <SPI.h>
int SLE = 7;
int CE = 4;
unsigned long adfReg[14]; 
unsigned long getRSSI1 = 0x147;
void setup()
{
  Serial.begin(9600);
  pinMode(SLE, OUTPUT);
  pinMode(CE, OUTPUT);
  SPI.begin();
  digitalWrite(SLE, LOW);
  digitalWrite(CE, HIGH);
  delay (50);
  adfReg[0] = 0x7A922170;      
  adfReg[1] = 0xA9011;
  adfReg[2] = 0x800F5A12;
  adfReg[3] = 0x6F2353;
  adfReg[4] = 0x00154;
  adfReg[5] = 0x2AA05;
  adfReg[6] = 0x2DD008A6;
  adfReg[7] = 0x6A31E9;
  adfReg[8] = 0x0AA2A;
  adfReg[9] = 0x02F7B;
  adfReg[10] = 0x0000C;
  adfReg[11] = 0x0032D;
  adfReg[12] = 0x147;
  delay (50);
  
  for (int k = 0; k<13; k++)
 {
   SPI.transfer(adfReg[k] >> 24);
   SPI.transfer(adfReg[k] >> 16);
   SPI.transfer(adfReg[k] >> 8);
   SPI.transfer(adfReg[k] >> 0);
   digitalWrite(SLE, HIGH);
   delay (50);
   digitalWrite(SLE, LOW);
   delay (100);
 } 
 }
 
void loop()
{

   SPI.transfer(getRSSI1 >> 8);
   SPI.transfer(getRSSI1 >> 0);
   digitalWrite(SLE, HIGH);
   byte  buf1 = SPI.transfer(0);
   byte  buf2 = SPI.transfer(0);
   byte  buf3 = SPI.transfer(0);
   Serial.println("buf1");
   Serial.println(buf1,BIN);
   Serial.println("buf2");
   Serial.println(buf2,BIN);
   Serial.println("buf3");
   Serial.println(buf3,BIN);
   digitalWrite(SLE, LOW);
   delay (10);
 }

faeton
faeton аватар
Offline
Зарегистрирован: 21.03.2016

Может быть, после 48-й строки добавить задержку? А вообще, кто-то обещал передачу по интерфейсу SPI без ошибок? Особенно, если это, например, на макетке сделано?

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

Включить в Saleae анализатор, возможно это позволит понять, где ошибка (если она есть).
На диаграммах видны данные, 1, 110100, 0, они же выводятся в монитор.
Что теряется?

Heven
Offline
Зарегистрирован: 27.03.2016

увы задержка не помогла

 

Heven
Offline
Зарегистрирован: 27.03.2016

да но мне нужно именно 00000010   01101000   00000000  пропускаются нули до и часть после едениц

анализатор я подключал к ведомому, т.е. на уровне сигналов всё выходит правильно а записывается или выводиться через ардуинку уже с косяком

 

 

faeton
faeton аватар
Offline
Зарегистрирован: 21.03.2016

Heven пишет:

да но мне нужно именно 00000010   01101000   00000000  пропускаются нули до и часть после едениц

анализатор я подключал к ведомому, т.е. на уровне сигналов всё выходит правильно а записывается или выводиться через ардуинку уже с косяком

До они не пропускаются, а не рисуются print'ом. Я не знаю есть ли библиотека у дуни с выводом ведущих нулей, но её несложно самому быстренько сделать. Т.е. 001101, он напишет как 1101. Исправьте строки println("bufx') на print("bufx: ") - без ln, ничерта невозможно увидеть динамику.

 

char[8] ToBin(byte x); {
   char t[8]; //я не знаю как в С писать в результат фуyкции сразу :)
   for (byte i=0; i<=7; i++)  {t[i]=(x and 1<<i==0) ? '0' :  '1';};
   ToBin=t;
};

 

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

faeton пишет:

До они не пропускаются, а не рисуются print'ом. Я не знаю есть ли библиотека у дуни с выводом ведущих нулей, но её несложно самому быстренько сделать. Т.е. 001101, он напишет как 1101. Исправьте строки println("bufx') на print("bufx: ") - без ln, ничерта невозможно увидеть динамику.

 

char[8] ToBin(byte x); {
   char t[8]; //я не знаю как в С писать в результат фуyкции сразу :)
   for (byte i=0; i<=7; i++)  {t[i]=(x and 1<<i==0) ? '0' :  '1';};
   ToBin=t;
};

 

Что там насчёт не давать плохих примеров? :))) Ладно, не гордый:

const char* ToBin(byte x) 
{
  static char t[9] = {0}; 
   for (byte i=0; i<=7; i++)  {t[i]=(x & (1<<i) == 0 ) ? '0' :  '1';};
   t[8] = 0; // мы ж указатель на строку возвращаем, надо завершающий ноль.
   return t;
};

 

faeton
faeton аватар
Offline
Зарегистрирован: 21.03.2016

DIYMan пишет:

Что там насчёт не давать плохих примеров? :))) Ладно, не гордый:

Ой... :))) 

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

Heven пишет:

да но мне нужно именно 00000010   01101000   00000000  пропускаются нули до и часть после едениц

анализатор я подключал к ведомому, т.е. на уровне сигналов всё выходит правильно а записывается или выводиться через ардуинку уже с косяком

Да, это я не туда смотрел, по диаграмме все правильно. Нужно только проверить одну вещь. На диаграмме видно, что Slave выдает данные по заднему фронту клока от мастера, вполне возможно, что мастер ждет данные по переднему фронту, например. Короче у мастера и слейва должно быть одинаково настроены SPI. Слейв тоже ардуина с такойже библиотекой или нет? Если нет, тогда искать различия настройки битов CPOL (полярность тактового сигнала), CPHA (фаза тактового сигнала). Исправлять нужно на Слейве, хотя можно и мастером поиграться. А еще лучше не играться, а разобраться, чтобы одинаково настроить оба устройства.

Тут народ думает, что тебе незначащие нули нужны, не обращай на них внимания, у тебя "проблема" со значащими нулями.

 

Heven
Offline
Зарегистрирован: 27.03.2016

в качестве slave у меня приёма-передатчик, spi настроены правильно и там и там, проверено в даташитах, после долгих танцев с бубном мне удалось склеить биты со всеми значимыми нулями, по всей видимости проблема была действительно в функции вывода в com порт. В общем благодаря костылям я заставил работать всё как мне нужно, всем спасибо за помощь надеюсь что к этому вопросу мы больше не вернёмся.

 

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

Хочешь сказать, что некорректно работает Serial.println(value, BIN)?
А поделиться решением?

faeton
faeton аватар
Offline
Зарегистрирован: 21.03.2016

kisoft пишет:
Хочешь сказать, что некорректно работает Serial.println(value, BIN)? А поделиться решением?

А тут кто-то советова ведущие нули рисовать... :)))

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

Ты о чем?