/*SPI initialization*/ void SPI_init() { DDRB=(1<<PCINT15)|(1<<PCINT13)|(1<<PORTB4); // set SCK, MOSI and SS as output SPCR=(1<<SPE)|(1<<MSTR)|(1<<SPR0); // Enable SPI | set as master | SCK freq = mclk/8 set_ss(1); // enable adc conversion set_ss(0); spi_tranceiver(0x94); spi_tranceiver(0x00); spi_tranceiver(0x00); set_ss(1); }
/* Single measure from the GYRO */ uint8_t single_measure(){ uint8_t res_adc1; uint8_t res_adc2; uint16_t angular_rate_temp = 0x0000; uint8_t angular_rate = 0x00; int EOC = 0; // start command set_ss(0); spi_tranceiver(0x94); spi_tranceiver(0x00); spi_tranceiver(0x00); set_ss(1); // wait until EOC is set ( end of conversion ) while(!EOC){ set_ss(0); spi_tranceiver(0x80); res_adc1 = spi_tranceiver(0x00); res_adc2 = spi_tranceiver(0x00); set_ss(1); if((res_adc1 & 0x20) == 0x20){ EOC = 1; } } angular_rate_temp = (res_adc1 << 8) | res_adc2; // angular_rate = res_adc1 & res_adc2 angular_rate_temp >>= 4; // shift four bits right angular_rate_temp &= 0x00ff; // stores the MSB 8 bits angular_rate = angular_rate_temp; return angular_rate; }
void updateLeds() { //Start frame spi_tranceiver(0x00); spi_tranceiver(0x00); spi_tranceiver(0x00); spi_tranceiver(0x00); //led frames for (int i=0; i<8; i++) { spi_tranceiver(0xFF); spi_tranceiver(leds[i][BLUE]); spi_tranceiver(leds[i][GREEN]); spi_tranceiver(leds[i][RED]); } //end frame for (int i=0; i<8; i += 16) { spi_tranceiver(0xFF); } }
int main(void) { lcd_init(LCD_DISP_ON_CURSOR_BLINK); //Initialize LCD spi_init_slave(); //Initialize slave SPI unsigned char data, buffer[10]; DDRA = 0x00; //Initialize PORTA as INPUT PORTA = 0xFF; //Enable Pull-Up Resistors while(1) { lcd_clrscr(); //LCD Clear screen lcd_home(); //LCD move cursor to home lcd_puts("Testing"); lcd_gotoxy(0,1); data = spi_tranceiver(ACK); //Receive data, send ACK itoa(data, buffer, 10); //Convert integer into string lcd_puts(buffer); //Display received data _delay_ms(20); //Wait } }