Arduino Array Scope с SPI
когда я пытаюсь выполнить следующий код, SPI работает правильно (см. График осциллографа).
#include <SPI.h>
void setup() {
SPI.begin();
}
void loop() {
SPI.beginTransaction(SPISettings(100000, MSBFIRST, SPI_MODE3));
byte a[] = {0xC,0xFF,0xFF,0xFF};
SPI.transfer(a, 4);
SPI.endTransaction();
delay(10);
}
Однако когда я перемещаю объявление массива в глобальное, оно больше не работает. (см. Следующий график осциллографа) Почему это так?
#include <SPI.h>
byte a[] = {0xC,0xFF,0xFF,0xFF};
void setup() {
SPI.begin();
}
void loop() {
SPI.beginTransaction(SPISettings(100000, MSBFIRST, SPI_MODE3));
SPI.transfer(a, 4);
SPI.endTransaction();
delay(10);
}
@user1441016, 👍4
Обсуждение1 ответ
Лучший ответ:
Когда вы вызываете SPI.transfer(a, 4);
, любые "полученные данные" хранятся в вашем байтовом массиве a[]
. Исходные данные перезаписываются.
Если вы распечатаете содержимое массива до и после вызова функции SPI.transfer()
, вы увидите на последовательном мониторе, что происходит с содержимым вашего массива.
Вот 2 тестовых скетча, иллюстрирующих разницу между массивом с глобальной областью действия и массивом со статической областью действия.
Глобальный охват
// Sketch uses 2344 bytes (7%) of program storage space.
// Global variables use 193 bytes (9%) of dynamic memory.
#include <SPI.h>
byte a[] = {0xC,0xFF,0xFF,0xFF};
void setup() {
SPI.begin();
Serial.begin(9600);
}
void loop() {
SPI.beginTransaction(SPISettings(100000, MSBFIRST, SPI_MODE3));
for(int i = 0; i < 4; i++){
Serial.print(a[i]);
}
Serial.println();
SPI.transfer(a, 4);
SPI.endTransaction();
for(int i = 0; i < 4; i++){
Serial.print(a[i]);
}
Serial.println('\n');
delay(1000);
}
Статическая область
// Sketch uses 2410 bytes (7%) of program storage space.
// Global variables use 193 bytes (9%) of dynamic memory.
#include <SPI.h>
void setup() {
SPI.begin();
Serial.begin(9600);
}
void loop() {
SPI.beginTransaction(SPISettings(100000, MSBFIRST, SPI_MODE3));
byte a[] = {0xC,0xFF,0xFF,0xFF};
for(int i = 0; i < 4; i++){
Serial.print(a[i]);
}
Serial.println();
SPI.transfer(a, 4);
SPI.endTransaction();
for(int i = 0; i < 4; i++){
Serial.print(a[i]);
}
Serial.println('\n');
delay(1000);
}
Следующий скетч должен решить эту проблему. Использование const
keword перед объявлением массива b[]
необязательно.
// Sketch uses 2436 bytes (7%) of program storage space.
// Global variables use 197 bytes (9%) of dynamic memory.
#include <SPI.h>
const byte b[] = {0xC,0xFF,0xFF,0xFF};
void setup() {
SPI.begin();
Serial.begin(9600);
}
void loop() {
SPI.beginTransaction(SPISettings(100000, MSBFIRST, SPI_MODE3));
byte a[] = {0xC,0xFF,0xFF,0xFF};
for(int i = 0; i < 4; i++){
Serial.print(a[i]);
}
Serial.println();
SPI.transfer(a, 4);
SPI.endTransaction();
memcpy(a, b, sizeof(b));
for(int i = 0; i < 4; i++){
Serial.print(a[i]);
}
Serial.println('\n');
delay(1000);
}
Последнее редактирование. Размер компиляции может быть уменьшен на 66 байт благодаря ключевому слову static.
// Sketch uses 2370 bytes (7%) of program storage space.
// Global variables use 197 bytes (9%) of dynamic memory.
#include <SPI.h>
const byte b[] = {0xC,0xFF,0xFF,0xFF};
void setup() {
SPI.begin();
Serial.begin(9600);
}
void loop() {
SPI.beginTransaction(SPISettings(100000, MSBFIRST, SPI_MODE3));
static byte a[] = {0xC,0xFF,0xFF,0xFF};
for(int i = 0; i < 4; i++){
Serial.print(a[i]);
}
Serial.println();
SPI.transfer(a, 4);
SPI.endTransaction();
memcpy(a, b, sizeof(b));
for(int i = 0; i < 4; i++){
Serial.print(a[i]);
}
Serial.println('\n');
delay(1000);
}
Для получения дополнительной информации см.: Arduino.cc
- Как использовать SPI на Arduino?
- Путаница между SPI и I2C для SSD1306 OLED
- Неправильная документация для выводов Mega2560 SPI?
- Взаимодействие с датчиком SSI?
- Ответ нескольких ведомых устройств (Arduino Mega 2560) через SPI
- SPI с преобразователем уровня на другом конце соединения
- Проблема с выводом MISO в SPI
- Можно ли подключить много (20+) датчиков SPI к Arduino Mega?
это не обязательно что-то связанное с SPI ... используйте
byte a[] = {'a', 'b', 'c', 'd'};
и сделайтеserial.write(a[0])
, чтобы вывести значение на последовательный монитор ... посмотрите, будет ли результат таким же, @jsotolaИз кода, который вы показываете, я не вижу никаких проблем. Это должно сработать. Хм..., @the busybee