Сбой связи SPI
Я пытаюсь запрограммировать AD5930 с помощью своего Arduino Mega, и я подозреваю, что у меня есть проблема с программным обеспечением или сломанный Mega. Я довольно новичок в кодировании Arduino, поэтому надеюсь, что кто-то здесь знает лучше.
Вот мой код:
#include <SPI.h>
#define DATAOUT 51//MOSI
#define SPI_CLOCK 52//sck
#define SLAVESELECT_1 53//ss
#define CNTRL 36//ss
int freq1 = 0;
int BurstLength1 = 0;
int freq2 = 0;
int BurstLength2 = 0;
int PRF_RATIO = 100;
void setup(){
Serial.begin(9600);
SPI.setBitOrder(MSBFIRST);
SPI.setDataMode(SPI_MODE1);
byte i;
byte clr;
pinMode(DATAOUT, OUTPUT);
pinMode(CNTRL, OUTPUT);
digitalWrite(CNTRL, LOW);
pinMode(SPI_CLOCK, OUTPUT);
pinMode(SLAVESELECT_1,OUTPUT);
digitalWrite(SLAVESELECT_1,HIGH); //отключить устройство
SPI.begin();
digitalWrite(SLAVESELECT_1,LOW); //Включить устройство
SPI.transfer(0x0E); //Send Fstart Write Enable to Control Reg
SPI.transfer(0x13);
digitalWrite(SLAVESELECT_1,HIGH);
digitalWrite(SLAVESELECT_1,LOW);
SPI.transfer(0xC7); //Send Frequency to Fstart one byte at a time
SPI.transfer(0x4C);
digitalWrite(SLAVESELECT_1,HIGH);
digitalWrite(SLAVESELECT_1,LOW);
SPI.transfer(0xD0); //Send Frequency to Fstart one byte at a time
SPI.transfer(0x93);
digitalWrite(SLAVESELECT_1,HIGH);
digitalWrite(SLAVESELECT_1,LOW);
SPI.transfer(0x06); //Send Fdelta Write Enable to Control Reg
SPI.transfer(0x13);
digitalWrite(SLAVESELECT_1,HIGH);
digitalWrite(SLAVESELECT_1,LOW);
SPI.transfer(0x20); //Send Frequency to Fdelta one byte at a time
SPI.transfer(0x00);
digitalWrite(SLAVESELECT_1,HIGH);
digitalWrite(SLAVESELECT_1,LOW);
SPI.transfer(0x30); //Send Frequency to Fdelta one byte at a time
SPI.transfer(0x00);
digitalWrite(SLAVESELECT_1,HIGH);
digitalWrite(SLAVESELECT_1,LOW);
SPI.transfer(0x10); //Send Number of Increments
SPI.transfer(0x02);
digitalWrite(SLAVESELECT_1,HIGH);
digitalWrite(SLAVESELECT_1,LOW);
SPI.transfer(0x40); //Send tINT Register
SPI.transfer(0xEB);
digitalWrite(SLAVESELECT_1,HIGH);
digitalWrite(SLAVESELECT_1,LOW);
SPI.transfer(0x80); //Tburst Register
SPI.transfer(0x0A);
digitalWrite(SLAVESELECT_1,HIGH);
SPI.end();
}
void loop() {
digitalWrite(CNTRL, HIGH);
delay(1);
digitalWrite(CNTRL, LOW);
delay(25);
}
Я подключил Arduino к логическому анализатору, и похоже, что код внутри функции настройки не работает. В логическом анализаторе мы видим, что переключается управляющий вывод, который является инструкцией в методе цикла.
Я знаю, что получаю целый цикл, так как вы также можете видеть переключатель управляющего штифта в прошлом, когда я нажимаю кнопку сброса в логическом анализаторе.
Этот же результат ничего не происходит в заголовке ICSP и выводах 51(Данные) и 52(Clk).
Надеюсь, я просто делаю глупую ошибку в коде. Благодаря тому, кто сжалится надо мной.
@Nathan Cody, 👍0
Обсуждение1 ответ
Я протестировал вашу настройку с помощью моего Mega, и она сработала нормально после нескольких изменений.
- Вы действительно должны сначала установить высокий уровень SS, прежде чем даже делать его выходным. Таким образом, подтягивание активируется, а затем в тот момент, когда вы выводите его, оно остается высоким, а не понижается, а затем возвращается к высокому, что выглядит для цели как импульс SS.
- Вам не нужно выполнять вызовы pinMode() для других контактов SPI.
- Вызовите SPI.begin() последним - после установки SS high.
void setup(){
Serial.begin(9600);
SPI.setBitOrder(MSBFIRST);
SPI.setDataMode(SPI_MODE1);
/// -----CHANGES--------
digitalWrite(SLAVESELECT_1,HIGH); //отключить устройство
pinMode(SLAVESELECT_1,OUTPUT);
/// -------------
SPI.begin();
digitalWrite(SLAVESELECT_1,LOW); //Enable device
SPI.transfer(0x0E); //Отправить запись Fstart Позволяет управлять Reg
SPI.transfer(0x13);
digitalWrite(SLAVESELECT_1,HIGH);
digitalWrite(SLAVESELECT_1,LOW);
SPI.transfer(0xC7); //Частота отправки для запуска по одному байту за раз
SPI.transfer(0x4C);
digitalWrite(SLAVESELECT_1,HIGH);
...
Как вы можете видеть из логического анализатора, вывод в порядке:
Цифры тоже выглядят правильно:
Time [s], Analyzer Name, Decoded Protocol Result
-0.000001752000000,SPI,MOSI: 0x0E; MISO: 0x00
0.000001248000000,SPI,MOSI: 0x13; MISO: 0x00
0.000014496000000,SPI,MOSI: 0xC7; MISO: 0x00
0.000017496000000,SPI,MOSI: 0x4C; MISO: 0x00
0.000030744000000,SPI,MOSI: 0xD0; MISO: 0x00
0.000033744000000,SPI,MOSI: 0x93; MISO: 0x00
0.000046992000000,SPI,MOSI: 0x06; MISO: 0x00
0.000049992000000,SPI,MOSI: 0x13; MISO: 0x00
0.000063240000000,SPI,MOSI: 0x20; MISO: 0x00
0.000066240000000,SPI,MOSI: 0x00; MISO: 0x00
0.000079488000000,SPI,MOSI: 0x30; MISO: 0x00
0.000082486000000,SPI,MOSI: 0x00; MISO: 0x00
0.000095736000000,SPI,MOSI: 0x10; MISO: 0x00
0.000098734000000,SPI,MOSI: 0x02; MISO: 0x00
0.000111984000000,SPI,MOSI: 0x40; MISO: 0x00
0.000114982000000,SPI,MOSI: 0xEB; MISO: 0x00
0.000128232000000,SPI,MOSI: 0x80; MISO: 0x00
0.000131230000000,SPI,MOSI: 0x0A; MISO: 0x00
Попробуйте внести изменения в код и посмотрите, что произойдет.
Помог ли этот ответ? Если да, пожалуйста, примите это. Если нет, пожалуйста, объясните, почему нет. Stack Exchange рассматривает этот вопрос как "без ответа". Чтобы помочь другим, приятно знать, сработал ли ответ или нет., @Nick Gammon
- Как использовать SPI на Arduino?
- Разница между массивом char и массивом unsigned char
- Отправка строки из RPi в Arduino - Рабочий код
- Arduino UNO + Ethernet Shield + ЖК-дисплей + RFID, но RFID не работает
- Разница в распиновке (типы?) Uno/Mega
- Проблема связи SPI Arduino
- GPS автономный робот
- Автоматизированную парковка с воротами, датчиком, кнопкой. Как определить, сколько времени каждая машина провела внутри?
Попробуйте запрограммировать подозрительный контакт данных как GPIO и переключить его в свой цикл. Кроме того, попробуйте установить делитель часов на 128 или что - то медленное и поставить задержку между вашими манипуляциями с slave select и передачей SPI-в то же время все это должно облегчить захват всего, что происходит. Вы также можете подумать о том, чтобы найти Мега-совместимый код для какой-нибудь другой SPI-штуковины и запустить его просто для того, чтобы увидеть, как линии шевелятся в качестве проверки доверия, @Chris Stratton
@ChrisStratton Stratton Спасибо, я попробую все это, когда приду в лабораторию примерно через 9 часов., @Nathan Cody