代码之家  ›  专栏  ›  技术社区  ›  Alok Mishra

如何在db410c上打招呼,db410c的芯片选择引脚很高。与Arduino Mega[关闭]一起担任S Master

  •  -1
  • Alok Mishra  · 技术社区  · 7 年前

    我在用树莓方面的spidev这里是我的示例代码,发送10和11到arduino,但现在我想在树莓bi上接收“hello”

    import time
    import spidev
    
    spi = spidev.SpiDev()
    spi.open(0,0)
    spi.max_speed_hz=100000
    
    while True:
       resp = spi.xfer([0x31,0X31,0x0A])
       print resp
       time.sleep(1)
       resp1 = spi.xfer([0x31,0x30,0x0A])
       print resp1
       time.sleep(1)
    

    代码在上面….发送10和11到Arduino,代码如下 7,8 注:我想从Arduino接到Raspberry Pi的“你好”

    #include <SPI.h>
    #include <stdlib.h>
    
    char buf [100];
    volatile byte pos;
    volatile boolean process_it;
    
    void setup (void)
    {
    //Start the Serial for the debugging
     Serial.begin (115200);   
    
     // have to send on master in, *slave out*
     pinMode(MISO, OUTPUT);
     pinMode(53,INPUT);
    
     //Setting up the LED pin as OUTPUT
     pinMode(7,OUTPUT);
     pinMode(6,OUTPUT);
    
     // turn on SPI in slave mode
     SPCR |= _BV(SPE);
    
     // get ready for an interrupt 
     pos = 0;   // buffer empty
     process_it = false;
    
     // now turn on interrupts
    SPI.attachInterrupt();
    
    }  // end of setup
    
    
    // SPI interrupt routine
    ISR (SPI_STC_vect)
    {
    byte c = SPDR;
    // grab byte from SPI Data Register
    if(digitalRead(53)==0){
    // add to buffer if room
    if (pos < sizeof buf)
    {
     buf [pos++] = c;
    
      // example: newline means time to process buffer
     if (c == '\n')
      process_it = true;
    
      }  // end of room available
    
      }
      }  // end of interrupt routine SPI_STC_vect
    
      // main loop - wait for flag set in interrupt routine
      void loop (void)
      {
     if (process_it)
    
     {
    
     buf [pos] = 0;
     int buff = atoi(buf);  
     Serial.println (buff);
     switch(buff){
      case 10:
    
        digitalWrite(6,HIGH);
        digitalWrite(7,LOW);
        break;
       case 11:
        digitalWrite(6,LOW);
        digitalWrite(7,HIGH);
        break;
       }
      pos = 0;
      process_it = false;
    
    }  // end of flag set
    
      }  
    

    提前谢谢你

    1 回复  |  直到 6 年前
        1
  •  1
  •   ASHIJANKEN    7 年前

    在spi连接中,主机必须发送一些数据以从机接收数据。就像是循环缓冲区( See an image of "Data transmission" section )。

    要完成您想要的任务,主服务器必须再发送5个字节才能从从服务器获取“h”、“e”、“l”、“l”、“o”。

    这是素描的例子。

    #include <SPI.h>
    #include <stdlib.h>
    
    char in_buf[100];
    char out_buf[20] = "hello";
    volatile int in_pos;
    volatile int out_pos;
    volatile boolean is_sending;
    volatile boolean process_it;
    
    void setup (void)
    {
      //Start the Serial for the debugging
      Serial.begin (115200);
    
      // have to send on master in, *slave out*
      pinMode(MISO, OUTPUT);
      pinMode(SS,INPUT);
    
      //Setting up the LED pin as OUTPUT
      pinMode(7,OUTPUT);
      pinMode(6,OUTPUT);
    
      // turn on SPI in slave mode
      SPCR |= _BV(SPE);
    
      // get ready for an interrupt
      in_pos = 0;   // in_buf empty
      out_pos = 0;   // out_buf empty
      is_sending = false;
    
      // now turn on interrupts
      SPI.attachInterrupt();
    
    }  // end of setup
    
    
    // SPI interrupt routine
    ISR (SPI_STC_vect)
    {
      byte c = SPDR; // grab byte from SPI Data Register
    
      if(is_sending == false){
        // add to in_buf if room
        if (in_pos < sizeof(in_buf))
        {
          in_buf[in_pos++] = c;
    
          // example: newline means time to process buffer and to send out_buf
          if (c == '\n')
          {
            is_sending = true;
            process_it = true;
            SPDR = out_buf[out_pos++]; // send first byte
          }
        }  // end of room available
      }
      else
      {
        SPDR = out_buf[out_pos];
        if(out_buf[out_pos] == 0 || ++out_pos >= sizeof(out_buf))
        {
          is_sending = false;
          out_pos = 0;
        }
      }
    }  // end of interrupt routine SPI_STC_vect
    
    // main loop - wait for flag set in interrupt routine
    void loop (void)
    {
      if(process_it)
      {
        in_buf[in_pos] = 0;
        int buff = atoi(in_buf);
        Serial.println(buff);
        switch(buff){
          case 10:
            digitalWrite(6,HIGH);
            digitalWrite(7,LOW);
            break;
          case 11:
            digitalWrite(6,LOW);
            digitalWrite(7,HIGH);
            break;
        }
        in_pos = 0;
        process_it = false;
      }  // end of flag set
    }
    

    下面是python代码的示例。

    import time
    import spidev
    
    spi = spidev.SpiDev()
    spi.open(0, 0)
    spi.max_speed_hz = 100000
    
    while True:
      resp = spi.xfer([0x31, 0X31, 0x0A, 0x01, 0x01, 0x01, 0x01, 0x01])
      print(''.join([chr(_) for _ in resp[-5:]]))
      time.sleep(1)
      resp1 = spi.xfer([0x31, 0x30, 0x0A, 0x01, 0x01, 0x01, 0x01, 0x01])
      print(''.join([chr(_) for _ in resp1[-5:]]))
      time.sleep(1)
    

    我认为下面这个网站对你也很有用。 How do I send a string from an Arduino Slave using SPI?