예제 #1
0
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);
    }

}
예제 #2
0
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;
	}