void VCOM_echo(void) { uint8_t temp; circular_buffer_pools_t * cb_out = circular_buffer_pointer(0x2); circular_buffer_pools_t * cb_in = circular_buffer_pointer(0x82); if((!circular_buffer_is_empty(cb_out)) && (!circular_buffer_is_full(cb_in))) { circular_buffer_pop(cb_out,&temp); circular_buffer_push(cb_in,&temp); // Set Next Timer Reload to finish transfer after there is room in FIFO start_timer(1); } }
void handle_spi_to_bbb(){ //Loop while we have data in the RX buffer to process while(circular_buffer_size(&rx_buff)){ rx_byte = circular_buffer_pop(&rx_buff); if(rx_byte == SPI_TX_START){ cmd_idx = CMD_DATA_SIZE; //Reset all the send variables/tmp storage cmd_finished = 0; send_idx = 0; send_crc_length = 0; send_crc = 0; send_crc_idx = 0; spi_transfer = 1; memset(&tx_buff, 0, sizeof(circular_buffer_t)); } //If we are receiving command, store it appropriately if(cmd_idx > 0){ cmd_data[CMD_DATA_SIZE-cmd_idx] = rx_byte; cmd_idx--; //Finished last storage of incoming data if(cmd_idx == 0){ //Check recieved_crc against calculated CRC received_crc = (cmd_data[CMD_DATA_SIZE-1]<<8) | cmd_data[CMD_DATA_SIZE-2]; calculated_crc = crc_io_checksum(cmd_data, CMD_DATA_SIZE-2, CRC_16BIT); //Send appropriate signal if passed/failed if(calculated_crc == received_crc){ SPIC.DATA = SPI_CRC_PASS; circular_buffer_push(&tx_buff,SPI_CRC_PASS); cmd_finished = 1; } else{ //SPIC.DATA = SPI_CRC_FAIL; circular_buffer_push(&tx_buff,SPI_CRC_FAIL); } } } else if(cmd_finished){ recv_cmd = cmd_data[1]; memcpy(send_data,sensor_data,SENSOR_DATA_SIZE); send_data[SENSOR_DATA_SIZE] = sensor_status; send_data[SENSOR_DATA_SIZE+1] = state; send_idx = SENSOR_DATA_SIZE+2; send_crc_length = send_idx; cmd_finished = 0; while(send_idx){ //SPIC.DATA = send_data[send_crc_length-send_idx]; circular_buffer_push(&tx_buff, send_data[send_crc_length-send_idx]); send_idx--; //Calculate CRC if(send_idx == 0){ send_crc = crc_io_checksum(send_data, send_crc_length, CRC_16BIT); circular_buffer_push(&tx_buff, send_crc); circular_buffer_push(&tx_buff, send_crc>> 8); } } spi_transfer = 0; } spi_isr = 0; }