Столкновение между pySerial, отправляющей данные в Arduino и SPI между Arduino и чипом SRAM - PullRequest
0 голосов
/ 19 апреля 2019

Я в процессе отправки массива в Arduino Nano через pySerial, который после получения Nano отправляет напрямую на чип SRAM с использованием SPI.Однако при выполнении кода, связанного с SPI (например, установка режима передачи для отправки отдельных байтов), передача данных из Python блокируется.

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

# Python code
import serial      
import time                                    #To use delay functions   
ArduinoNano = serial.Serial('com6',9600)       #Create Serial port object called ArduinoNano
x = ArduinoNano.readline()                     #Read the serial data and print it
print(x)

gImage_1 = bytes([
0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,
0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XC0,
0X00,0X00,0X00,0X00,0X00,0X00]);

t = 0
for t in gImage_1:
    ArduinoNano.write(bytes([t]))
    y = ArduinoNano.readline()
    print(y)


----------
# Arduino Code
#include <SPI.h>

#define WRSR        1       // Write to the Status Register
#define WRITE       2       // Write command
#define ByteMode    0x00    // Byte mode (read/write one byte at a time)
#define SS1         10      // Slave Select Line for Nano

uint16_t address = 0;       // create a 16 bit variable to hold the address
byte incomingData = 0;      // data from pySerial
int dataCount = 0;

void SetMode(char Mode);
void WriteByte(uint16_t address, byte data_byte);

void setup() 
{
  pinMode(SS1, OUTPUT);                          
  Serial.begin(9600);
  SPI.begin;
  Serial.println("Hello! Waiting... ");
  SetMode(ByteMode);
}

void loop() 
{
  while(Serial.available() > 0)
  {
    address = dataCount;
    incomingData = Serial.read();
    WriteByte(address, incomingData);
    Serial.println(incomingData);
    dataCount += 1;
  }
}

void SetMode(char Mode)                          // Select for single or multiple byte transfer
{                         
  digitalWrite(SS1, LOW);                        // set SPI slave select LOW;
  SPI.transfer(WRSR);                            // command to write to status register
  SPI.transfer(Mode);                            // set for byte mode
  digitalWrite(SS1, HIGH);                       // release chip select to finish command
}

void WriteByte(uint16_t address, byte data_byte) 
{
  digitalWrite(SS1, LOW);                        // set SPI slave select LOW;
  SPI.transfer(WRITE);                           // send WRITE command to the memory chip
  SPI.transfer((byte)(address >> 8));            // send first byte of address
  SPI.transfer((byte)address);                   // send last byte of address
  SPI.transfer(data_byte);                       // write the data to the memory location
  digitalWrite(SS1, HIGH);                       // set SPI slave select HIGH
}
...