void qr_code_spi_link_periodic(void)
{
  if (qr_code_spi_data_available) {
    qr_code_spi_data_available = FALSE;
    uint16_t x, y;
    memcpy(&x, qr_code_spi_link_transaction.input_buf, 2);
    memcpy(&y, qr_code_spi_link_transaction.input_buf + 2, 2);
    DOWNLINK_SEND_VISUALTARGET(DefaultChannel, DefaultDevice, &x, &y);
    spi_slave_register(&spi1, &qr_code_spi_link_transaction);
  }
}
示例#2
0
void link_mcu_init(void) {

  link_mcu_trans.cpol = SPICpolIdleLow;
  link_mcu_trans.cpha = SPICphaEdge2;
  link_mcu_trans.dss = SPIDss8bit;
  link_mcu_trans.input_buf = (uint8_t*)&link_mcu_from_ap_msg;
  link_mcu_trans.output_buf = (uint8_t*)&link_mcu_from_fbw_msg;
  link_mcu_trans.input_length = LINK_MCU_FRAME_LENGTH;
  link_mcu_trans.output_length = LINK_MCU_FRAME_LENGTH;
  spi_slave_register(&(LINK_MCU_SPI_DEV), &link_mcu_trans);
}
示例#3
0
void bluegiga_init(struct bluegiga_periph *p)
{
#ifdef MODEM_LED
  LED_INIT(MODEM_LED);
#endif

  // configure the SPI bus
  bluegiga_spi.input_buf      = p->work_rx;
  bluegiga_spi.output_buf     = p->work_tx;
  bluegiga_spi.input_length   = 20;
  bluegiga_spi.output_length  = 20;
  bluegiga_spi.slave_idx      = 0; // Not used for SPI-Slave: always NSS pin
  bluegiga_spi.select         = SPISelectUnselect;
  bluegiga_spi.cpol           = SPICpolIdleHigh;
  bluegiga_spi.cpha           = SPICphaEdge2;
  bluegiga_spi.dss            = SPIDss8bit;
  bluegiga_spi.bitorder       = SPIMSBFirst;
  bluegiga_spi.cdiv           = SPIDiv64;
  bluegiga_spi.after_cb       = (SPICallback) trans_cb;

  // Configure generic link device
  p->device.periph            = (void *)(p);
  p->device.check_free_space  = (check_free_space_t) dev_check_free_space;
  p->device.put_byte          = (put_byte_t) dev_put_byte;
  p->device.send_message      = (send_message_t) dev_send_message;
  p->device.char_available    = (char_available_t) dev_char_available;
  p->device.get_byte          = (get_byte_t) dev_get_byte;

  // initialize peripheral variables
  p->rx_insert_idx    = 0;
  p->rx_extract_idx   = 0;
  p->tx_insert_idx    = 0;
  p->tx_extract_idx   = 0;

  for (int i = 0; i < bluegiga_spi.input_length; i++) {
    p->work_rx[i] = 0;
  }
  for (int i = 0; i < bluegiga_spi.output_length; i++) {
    p->work_tx[i] = 0;
  }
  for (int i = 0; i < 255; i++) {
    bluegiga_rssi[i] = 127;
  }

  // set DRDY interrupt pin for spi master triggered on falling edge
  gpio_setup_output(BLUEGIGA_DRDY_GPIO, BLUEGIGA_DRDY_GPIO_PIN);
  gpio_set(BLUEGIGA_DRDY_GPIO, BLUEGIGA_DRDY_GPIO_PIN);

  // register spi slave read for transaction
  spi_slave_register(&(BLUEGIGA_SPI_DEV), &bluegiga_spi);

  coms_status = BLUEGIGA_UNINIT;
}
void qr_code_spi_link_init(void)
{
  qr_code_spi_link_transaction.cpol          = SPICpolIdleHigh;
  qr_code_spi_link_transaction.cpha          = SPICphaEdge2;
  qr_code_spi_link_transaction.dss           = SPIDss8bit;
  qr_code_spi_link_transaction.bitorder      = SPIMSBFirst;
  qr_code_spi_link_transaction.output_length = 3;
  qr_code_spi_link_transaction.output_buf    = testDataOut;
  qr_code_spi_link_transaction.input_length  = 3;
  qr_code_spi_link_transaction.input_buf     = testDataIn;
  qr_code_spi_link_transaction.after_cb      = qr_code_spi_link_trans_cb;
  //spi_slave_set_config(&spi1, &qr_code_spi_link_transaction);
  spi_slave_register(&spi1, &qr_code_spi_link_transaction);
}
示例#5
0
/* read data from dma if available, set as call back of successful spi exchange */
void bluegiga_receive(struct spi_transaction *trans)
{
  if (trans->status == SPITransSuccess) {
    if (coms_status == BLUEGIGA_SENDING) {
      // Handle successful sent message
      for (uint8_t i = 0; i < trans->output_length; i++) { // Clear tx buffer
        trans->output_buf[i] = 0;
      }
    }

    uint8_t packet_len = trans->input_buf[3];                 // length of transmitted message

    if (packet_len > trans->input_length) {
      // Direct message from Bluegiga
      // int k_rssi, i;
      switch (packet_len) {
        case 0xff:        // Connection lost with ground station!
#ifdef MODEM_LED
          LED_OFF(MODEM_LED);
#endif
          coms_status = BLUEGIGA_UNINIT;
          gpio_set(BLUEGIGA_DRDY_GPIO, BLUEGIGA_DRDY_GPIO_PIN);     // Reset interrupt pin
          break;
          /*case 0xfe:        // rssi data
            k_rssi = trans->input_buf[2];
            for (i = 0; i < k_rssi; i++) {
              bluegiga_rssi[i] = trans->input_buf[3 + i];
            }
            break;*/
        case 0xfd:        // interrupt handled on bluegiga
          gpio_set(BLUEGIGA_DRDY_GPIO, BLUEGIGA_DRDY_GPIO_PIN);     // Reset interrupt pin

          // fetch scan status
          if (trans->input_buf[2] == 1) {
            coms_status = BLUEGIGA_SCANNING;
          } else {
            coms_status = BLUEGIGA_UNINIT;
          }
          break;
        default:
          break;
      }
    }

    // handle incoming datalink message
    else if (packet_len > 0) {
      bluegiga_rssi[trans->input_buf[1]] = trans->input_buf[2];
      // Handle received message
      for (uint8_t i = 0; i < packet_len; i++) {
        bluegiga_p.rx_buf[(bluegiga_p.rx_insert_idx + i) % BLUEGIGA_BUFFER_SIZE] = trans->input_buf[i + 4];
      }
      bluegiga_increment_buf(&bluegiga_p.rx_insert_idx, packet_len);
      coms_status = BLUEGIGA_IDLE;
    } else {
      coms_status = BLUEGIGA_IDLE;
    }

    // clear rx buffer
    for (uint8_t i = 0; i < trans->input_length; i++) {
      trans->input_buf[i] = 0;
    }
    // register spi slave read for next transaction
    spi_slave_register(&(BLUEGIGA_SPI_DEV), &bluegiga_spi);
  }
}