#include <stdio.h>
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
#include <avr/cpufunc.h>

#define DDR_SPI DDRB
#define DD_MOSI DDB5
#define DD_MISO DDB6
#define DD_SCK  DDB7

#include "uart.h"

void spi_init(void) {
    DDR_SPI = (1<<DD_MOSI)|(1<<DD_SCK);
    SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR0);
}

FILE usart0_str = FDEV_SETUP_STREAM(USART0SendByte, USART0ReceiveByte, _FDEV_SETUP_RW);

void print_block(uint8_t *block_address, uint16_t length)
{
    uint16_t i, j;
    uint8_t byte;
    
    for(i = 0; i < length / 16; i++)
    {
        printf("%04x: ", i * 16);
        
        for(j = 0; j < 16; j++)
        {
            printf("%02x", block_address[i * 16 + j]);
        }
        
        printf(" ");
        for(j = 0; j < 16; j++)
        {
            byte = block_address[i * 16 + j];
            
            if ((byte >= 32) && byte <= 126)
            printf("%c", byte);
            else
            printf(".");
        }

        printf("\n");
    }
}

int main(void) {
    //uint8_t i;
    uint8_t byte;
    
    USART0Init();
    stdin=stdout=&usart0_str;
    
    _delay_ms(1);
    spi_init();
    printf("Start\r\n");
    byte = 0x00;
    
    //for(i = 0; i < 10; i++){
    SPDR = 0xFF;
    while(!(SPSR & (1<<SPIF))){
        byte++;
    }
    
    printf("%d\r\n", byte);
    byte = 0x00;
    
    SPDR = 0xFF;
    while(!(SPSR & (1<<SPIF))){
        byte++;
    }
    
    printf("%d\r\n", byte);
    byte = 0x00;
    
    // }
    
    printf("Stop\n");


    while (1) {
        _NOP();
    }
    
    return 1;
}