SPI: проблемы связи с датчиком с помощью Arduino

spi

У меня есть датчик, с которым я пытаюсь общаться через SPI, используя Arduino UNO. Это мой первый раз, когда я использую SPI, и я испытываю некоторые проблемы, которые, я надеюсь, просто из-за некоторого недопонимания с моей стороны. Я написал простой код, чтобы выполнить одну основную операцию: включить вентилятор датчика. Arduino питается через 2,1 - мм разъем ствола с помощью адаптера постоянного тока 1,5 А. Контакты 5V, GND, MOSI, MISO, SS и SCK на Arduino подключены к соответствующим контактам на датчике. Датчик получает питание от Arduino, рисуя до 250 мА (с включенным вентилятором).

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

Command_byte: 0x03
Bytes: 0x03, 0x00
Bytes_in: 0xF3, 0x03
Time_between_current_and_next_byte: 1.7ms, NA
Note: 1ms would be adequate delay between command byte and following byte

Исходя из моего понимания этого, чтобы включить вентилятор, мне нужно отправить командный байт (0x03), затем подождать 1,7 мс и отправить еще один байт (0x00). Мой код для этого выглядит следующим образом:

#include <SPI.h>
const int chipSelectPin = 10;

void setup() {      
  Serial.begin(9600);

  SPI.begin();
  pinMode(chipSelectPin, OUTPUT);
  SPI.setClockDivider(SPI_CLOCK_DIV32); //set clock to 500kHz
  SPI.setDataMode(SPI_MODE1);
  SPI.setBitOrder(MSBFIRST);
  delay(10000); // Let the sensor settle for 10 seconds

  digitalWrite(chipSelectPin, LOW);
  indata = SPI.transfer(0x03); //command byte for fan on
  Serial.println(indata);// value returned should be 0xF3
  delay(2);
  indata = SPI.transfer(0x00); //Turn on fan
  digitalWrite(chipSelectPin, HIGH);
  Serial.println(indata);// value returned should be 0x03     
}


void loop() {}

Когда я посылаю командный байт, возвращаемое значение (которое выводится на терминал) равно 243, что соответствует ожидаемому шестнадцатеричному значению 0xF3. Однако вторая команда не включает вентилятор, и второе возвращаемое значение равно 231, что не соответствует ожидаемому шестнадцатеричному значению 0x03.

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

, 👍0

Обсуждение

Может быть или не может быть связано, но текущая ничья вне спецификации для чипа. Из таблицы Atmega 328p: `Ток постоянного тока на вывод ввода/вывода...40,0 мА " и "Ток постоянного тока VCC и GND выводов...200,0 мА"., @JRobert

Спасибо за комментарии. После того, как я переключился с UNO на Galileo (с логическим уровнем, установленным на 3,3 В), он работал отлично!, @user3668294

@JRobert - текущая спецификация, которую вы размещаете, предназначена для контактов ввода-вывода ATmega, но устройство должно получать питание от регулятора Arduino, а не от ATmega., @Chris Stratton


1 ответ


-1

Измените свой chipSelectPin. Контакт 10 используется исключительно библиотекой SPI. См. Описание Arduino Uno.

Аналогичный вопрос обсуждался здесь.

,

Спасибо за комментарий. После того, как я переключился с UNO на Galileo (с логическим уровнем 3,3 В), он работал нормально! Я сохранил контакт выбора чипа как 10, и это не было проблемой., @user3668294

Отлично, я рад, что вы решили эту проблему., @Michal Foksa

Вы по существу неверно формулируете проблему. Во-первых, разнесенный код **уже** использует контакт 10 в качестве ведомого выбора, что является "по умолчанию", подразумеваемым оборудованием. Проблема заключается не в том, что вывод 10 используется для *другой* цели и в результате *настроен в качестве входа*, тогда модуль ATmega SPI может работать в ведомом, а не в ведущем режиме. Полностью уместно использовать контакт 10 в качестве ведомого выбора. Также вполне возможно использовать другой вывод, при условии, что вывод 10 все еще настроен в качестве вывода., @Chris Stratton