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); } }
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); }
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); }
/* 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); } }