SPI пропускает биты
- Войдите на сайт для отправки комментариев
Вс, 27/03/2016 - 03:30
Суть в том что я должен получить 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); }
Может быть, после 48-й строки добавить задержку? А вообще, кто-то обещал передачу по интерфейсу SPI без ошибок? Особенно, если это, например, на макетке сделано?
Включить в Saleae анализатор, возможно это позволит понять, где ошибка (если она есть).
На диаграммах видны данные, 1, 110100, 0, они же выводятся в монитор.
Что теряется?
увы задержка не помогла
да но мне нужно именно 00000010 01101000 00000000 пропускаются нули до и часть после едениц
анализатор я подключал к ведомому, т.е. на уровне сигналов всё выходит правильно а записывается или выводиться через ардуинку уже с косяком
да но мне нужно именно 00000010 01101000 00000000 пропускаются нули до и часть после едениц
анализатор я подключал к ведомому, т.е. на уровне сигналов всё выходит правильно а записывается или выводиться через ардуинку уже с косяком
До они не пропускаются, а не рисуются print'ом. Я не знаю есть ли библиотека у дуни с выводом ведущих нулей, но её несложно самому быстренько сделать. Т.е. 001101, он напишет как 1101. Исправьте строки println("bufx') на print("bufx: ") - без ln, ничерта невозможно увидеть динамику.
До они не пропускаются, а не рисуются print'ом. Я не знаю есть ли библиотека у дуни с выводом ведущих нулей, но её несложно самому быстренько сделать. Т.е. 001101, он напишет как 1101. Исправьте строки println("bufx') на print("bufx: ") - без ln, ничерта невозможно увидеть динамику.
Что там насчёт не давать плохих примеров? :))) Ладно, не гордый:
Что там насчёт не давать плохих примеров? :))) Ладно, не гордый:
Ой... :)))
да но мне нужно именно 00000010 01101000 00000000 пропускаются нули до и часть после едениц
анализатор я подключал к ведомому, т.е. на уровне сигналов всё выходит правильно а записывается или выводиться через ардуинку уже с косяком
Да, это я не туда смотрел, по диаграмме все правильно. Нужно только проверить одну вещь. На диаграмме видно, что Slave выдает данные по заднему фронту клока от мастера, вполне возможно, что мастер ждет данные по переднему фронту, например. Короче у мастера и слейва должно быть одинаково настроены SPI. Слейв тоже ардуина с такойже библиотекой или нет? Если нет, тогда искать различия настройки битов CPOL (полярность тактового сигнала), CPHA (фаза тактового сигнала). Исправлять нужно на Слейве, хотя можно и мастером поиграться. А еще лучше не играться, а разобраться, чтобы одинаково настроить оба устройства.
Тут народ думает, что тебе незначащие нули нужны, не обращай на них внимания, у тебя "проблема" со значащими нулями.
в качестве slave у меня приёма-передатчик, spi настроены правильно и там и там, проверено в даташитах, после долгих танцев с бубном мне удалось склеить биты со всеми значимыми нулями, по всей видимости проблема была действительно в функции вывода в com порт. В общем благодаря костылям я заставил работать всё как мне нужно, всем спасибо за помощь надеюсь что к этому вопросу мы больше не вернёмся.
Хочешь сказать, что некорректно работает Serial.println(value, BIN)?
А поделиться решением?
А тут кто-то советова ведущие нули рисовать... :)))
Ты о чем?