140 lines
3.8 KiB
C
140 lines
3.8 KiB
C
#include <avr/io.h>
|
|
#include <util/delay.h>
|
|
#include <base.h>
|
|
#include <spi.h>
|
|
#include <rfm.h>
|
|
|
|
// typedef struct RFM {
|
|
// spi_t spi;
|
|
// gpio_t irq;
|
|
// gpio_t reset;
|
|
// } rfm_t;
|
|
//
|
|
// void rfm_initialize(rfm_t *rfm) {
|
|
// spi_initialize(&rfm->spi);
|
|
//
|
|
// spi_acquire(&rfm->spi);
|
|
// spi_transfer_byte(&rfm->spi, 0x37 | _BV(7));
|
|
// spi_transfer_byte(&rfm->spi, 0);
|
|
// spi_release(&rfm->spi);
|
|
//
|
|
// spi_acquire(&rfm->spi);
|
|
// spi_transfer_byte(&rfm->spi, 0x38 | _BV(7));
|
|
// spi_transfer_byte(&rfm->spi, 1);
|
|
// spi_release(&rfm->spi);
|
|
// }
|
|
//
|
|
// void rfm_power_off(rfm_t *rfm) {
|
|
// spi_acquire(&rfm->spi);
|
|
// spi_transfer_byte(&rfm->spi, 0x11);
|
|
// spi_transfer_byte(&rfm->spi, 0x00);
|
|
// spi_release(&rfm->spi);
|
|
// }
|
|
//
|
|
// void rfm_send_data(rfm_t *rfm, uint8_t *data, size_t length) {
|
|
// /* Go into standby mode */
|
|
// spi_acquire(&rfm->spi);
|
|
// spi_transfer_byte(&rfm->spi, 0x11);
|
|
// spi_transfer_byte(&rfm->spi, 0x01);
|
|
// spi_release(&rfm->spi);
|
|
//
|
|
// /* Write data to FIFO */
|
|
// spi_acquire(&rfm->spi);
|
|
// spi_transfer_byte(&rfm->spi, 0x10);
|
|
// for (size_t i = 0; i < length; i++) {
|
|
// spi_transfer_byte(&rfm->spi, data[i]);
|
|
// }
|
|
// spi_release(&rfm->spi);
|
|
//
|
|
// /* Go into transmit mode */
|
|
// spi_acquire(&rfm->spi);
|
|
// spi_transfer_byte(&rfm->spi, 0x11);
|
|
// spi_transfer_byte(&rfm->spi, 0x03);
|
|
// spi_release(&rfm->spi);
|
|
//
|
|
// /* Return to standby mode */
|
|
// spi_acquire(&rfm->spi);
|
|
// spi_transfer_byte(&rfm->spi, 0x11);
|
|
// spi_transfer_byte(&rfm->spi, 0x01);
|
|
// spi_release(&rfm->spi);
|
|
// }
|
|
|
|
void flash(gpio_t *light, size_t count) {
|
|
for (size_t i = 0; i < count; i++) {
|
|
set_line(light);
|
|
_delay_ms(50);
|
|
clear_line(light);
|
|
_delay_ms(50);
|
|
}
|
|
}
|
|
|
|
int main(void) {
|
|
spi_t spi = (spi_t){
|
|
.clock = { .ddr = &DDRB, .port = &PORTB, .pin = &PINB, .addr = 1 },
|
|
.data_out = { .ddr = &DDRB, .port = &PORTB, .pin = &PINB, .addr = 2 },
|
|
.data_in = { .ddr = &DDRB, .port = &PORTB, .pin = &PINB, .addr = 3 },
|
|
.chip_select = { .ddr = &DDRB, .port = &PORTB, .pin = &PINB, .addr = 4 },
|
|
};
|
|
|
|
rfm_t rfm = (rfm_t){
|
|
.spi = spi,
|
|
.irq = { .ddr = &DDRE, .port = &PORTE, .pin = &PINE, .addr = 6 },
|
|
.reset = { .ddr = &DDRD, .port = &PORTD, .pin = &PIND, .addr = 4 },
|
|
};
|
|
|
|
gpio_t light = { .ddr = &DDRC, .port = &PORTC, .addr = 7 };
|
|
gpio_t fifo_full = { .ddr = &DDRB, .port = &PORTB, .addr = 7 };
|
|
gpio_t fifo_empty = { .ddr = &DDRB, .port = &PORTB, .addr = 6 };
|
|
|
|
set_line_direction(&light, LINE_OUT);
|
|
set_line_direction(&fifo_full, LINE_OUT);
|
|
set_line_direction(&fifo_empty, LINE_OUT);
|
|
|
|
|
|
flash(&light, 3);
|
|
|
|
rfm_initialize(&rfm);
|
|
set_line(&light);
|
|
uint8_t status = rfm_status(&rfm);
|
|
status & _BV(7) ? set_line(&fifo_full) : clear_line(&fifo_full);
|
|
status & _BV(6) ? set_line(&fifo_empty) : clear_line(&fifo_empty);
|
|
|
|
/*
|
|
spi_acquire(&rfm.spi);
|
|
spi_transfer_byte(&rfm.spi, 0x11);
|
|
spi_transfer_byte(&rfm.spi, 0x01);
|
|
spi_release(&rfm.spi);
|
|
|
|
spi_acquire(&rfm.spi);
|
|
spi_transfer_byte(&rfm.spi, 0x10);
|
|
spi_transfer_byte(&rfm.spi, 1);
|
|
spi_transfer_byte(&rfm.spi, 2);
|
|
spi_transfer_byte(&rfm.spi, 3);
|
|
spi_transfer_byte(&rfm.spi, 5);
|
|
spi_transfer_byte(&rfm.spi, 7);
|
|
spi_transfer_byte(&rfm.spi, 11);
|
|
spi_transfer_byte(&rfm.spi, 13);
|
|
spi_release(&rfm.spi);
|
|
|
|
status = rfm_status(&rfm);
|
|
if (status & _BV(7)) {
|
|
clear_line(&light);
|
|
} else {
|
|
set_line(&light);
|
|
}
|
|
*/
|
|
|
|
/*
|
|
uint8_t count[1] = { 0 };
|
|
while(1) {
|
|
rfm_send_data(&rfm, count, 1);
|
|
count[0]++;
|
|
set_line(&light);
|
|
_delay_ms(50);
|
|
clear_line(&light);
|
|
_delay_ms(50);
|
|
}
|
|
*/
|
|
return 0;
|
|
}
|