SPI: проблемы связи с датчиком с помощью Arduino
У меня есть датчик, с которым я пытаюсь общаться через 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.
Я не думаю, что это аппаратная проблема, потому что по крайней мере одно из возвращаемых значений является правильным и потому что датчик действительно работает при использовании с другой платформой. Я также экспериментировал с различными задержками между байтами.
@user3668294, 👍0
Обсуждение1 ответ
Измените свой chipSelectPin. Контакт 10 используется исключительно библиотекой SPI. См. Описание Arduino Uno.
Аналогичный вопрос обсуждался здесь.
Спасибо за комментарий. После того, как я переключился с UNO на Galileo (с логическим уровнем 3,3 В), он работал нормально! Я сохранил контакт выбора чипа как 10, и это не было проблемой., @user3668294
Отлично, я рад, что вы решили эту проблему., @Michal Foksa
Вы по существу неверно формулируете проблему. Во-первых, разнесенный код **уже** использует контакт 10 в качестве ведомого выбора, что является "по умолчанию", подразумеваемым оборудованием. Проблема заключается не в том, что вывод 10 используется для *другой* цели и в результате *настроен в качестве входа*, тогда модуль ATmega SPI может работать в ведомом, а не в ведущем режиме. Полностью уместно использовать контакт 10 в качестве ведомого выбора. Также вполне возможно использовать другой вывод, при условии, что вывод 10 все еще настроен в качестве вывода., @Chris Stratton
- Как использовать SPI на Arduino?
- Как увеличить скорость записи на SD-карту в Ардуино
- Как считывать данные с помощью Arduino SPI
- Как передать более 1 байта сразу по шине SPI?
- OVF в последовательном мониторе вместо данных
- Как отправить строку с подчиненного устройства Arduino с помощью SPI?
- Проблема совместного использования MISO с несколькими RFID-считывателями RC522
- Путаница между SPI и I2C для SSD1306 OLED
Может быть или не может быть связано, но текущая ничья вне спецификации для чипа. Из таблицы Atmega 328p: `Ток постоянного тока на вывод ввода/вывода...40,0 мА " и "Ток постоянного тока VCC и GND выводов...200,0 мА"., @JRobert
Спасибо за комментарии. После того, как я переключился с UNO на Galileo (с логическим уровнем, установленным на 3,3 В), он работал отлично!, @user3668294
@JRobert - текущая спецификация, которую вы размещаете, предназначена для контактов ввода-вывода ATmega, но устройство должно получать питание от регулятора Arduino, а не от ATmega., @Chris Stratton