Сбой связи 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);
}

Logic Analyzer

Я подключил Arduino к логическому анализатору, и похоже, что код внутри функции настройки не работает. В логическом анализаторе мы видим, что переключается управляющий вывод, который является инструкцией в методе цикла.

Я знаю, что получаю целый цикл, так как вы также можете видеть переключатель управляющего штифта в прошлом, когда я нажимаю кнопку сброса в логическом анализаторе.

Reset Trigger

Этот же результат ничего не происходит в заголовке ICSP и выводах 51(Данные) и 52(Clk).

Надеюсь, я просто делаю глупую ошибку в коде. Благодаря тому, кто сжалится надо мной.

, 👍0

Обсуждение

Попробуйте запрограммировать подозрительный контакт данных как GPIO и переключить его в свой цикл. Кроме того, попробуйте установить делитель часов на 128 или что - то медленное и поставить задержку между вашими манипуляциями с slave select и передачей SPI-в то же время все это должно облегчить захват всего, что происходит. Вы также можете подумать о том, чтобы найти Мега-совместимый код для какой-нибудь другой SPI-штуковины и запустить его просто для того, чтобы увидеть, как линии шевелятся в качестве проверки доверия, @Chris Stratton

@ChrisStratton Stratton Спасибо, я попробую все это, когда приду в лабораторию примерно через 9 часов., @Nathan Cody


1 ответ


0

Я протестировал вашу настройку с помощью моего 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);

  ...

Как вы можете видеть из логического анализатора, вывод в порядке:

Logic analyzer output

Цифры тоже выглядят правильно:

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