summaryrefslogtreecommitdiff
path: root/software/hhd70dongle/c1101lib.c
diff options
context:
space:
mode:
Diffstat (limited to 'software/hhd70dongle/c1101lib.c')
-rw-r--r--software/hhd70dongle/c1101lib.c204
1 files changed, 102 insertions, 102 deletions
diff --git a/software/hhd70dongle/c1101lib.c b/software/hhd70dongle/c1101lib.c
index 61780d5..02ec5fc 100644
--- a/software/hhd70dongle/c1101lib.c
+++ b/software/hhd70dongle/c1101lib.c
@@ -33,7 +33,7 @@
#include <util/delay.h>
#include "c1101lib.h"
-#include "spi.h"
+#include "hhd70.h"
#include "usb_rawhid.h"
#include "util.h"
@@ -41,14 +41,14 @@
#define SPIC1101_MAX_WAIT 21
-int16_t spi_c1101_write_byte_ok_get_status(char data)
+int16_t c1101_spi_write_byte_ok_get_status(char data)
{
//~ uint8_t debug_sb[6];
char sb;
unsigned int attempts = 0;
do
{
- sb = spi_exchange_byte(data);
+ sb = hhd70_spi_exchange_byte(data);
//Note: content of returned StatusByte is actually context depenedant on sent command
// i.e. we won't get Fifo Byte count or overflow status on normal command and so on
// e.g. we only get TX Fifo Free Byte count while writing to TX Fifo
@@ -62,118 +62,118 @@ int16_t spi_c1101_write_byte_ok_get_status(char data)
return sb;
}
-int16_t spi_c1101_strobe_command(char address)
+int16_t c1101_spi_strobe_command(char address)
{
char rbyte;
if (address < 0x30)
return -1;
- spi_cs_enable();
- spi_c1101_wait_chip_rdy();
+ hhd70_spi_cs_enable();
+ hhd70_c1101_wait_chip_rdy();
//POST DEBUG: don't return anything
- rbyte = spi_c1101_write_byte_ok_get_status(address);
+ rbyte = c1101_spi_write_byte_ok_get_status(address);
if (rbyte < 0)
return -1;
- spi_cs_disable();
+ hhd70_spi_cs_disable();
return rbyte;
}
// note addresses range from 0x00 to 0x2F for normal registers and 0xF0 to 0xFD for special status registers
-int16_t spi_c1101_read_register(char address)
+int16_t c1101_spi_read_register(char address)
{
char rbyte;
if (address < 0x30)
address |= 0x80;
else
address |= 0xC0;
- spi_cs_enable();
- spi_c1101_wait_chip_rdy();
- if (spi_c1101_write_byte_ok_get_status(address) < 0)
+ hhd70_spi_cs_enable();
+ hhd70_c1101_wait_chip_rdy();
+ if (c1101_spi_write_byte_ok_get_status(address) < 0)
return -1;
- rbyte = spi_read_byte();
- spi_cs_disable();
+ rbyte = hhd70_spi_read_byte();
+ hhd70_spi_cs_disable();
return rbyte;
}
// note addresses range from 0x00 to 0x2F for normal registers
-int16_t spi_c1101_write_register(char address, char byte)
+int16_t c1101_spi_write_register(char address, char byte)
{
- spi_cs_enable();
- spi_c1101_wait_chip_rdy();
- if (spi_c1101_write_byte_ok_get_status(address & 0x2F) < 0)
+ hhd70_spi_cs_enable();
+ hhd70_c1101_wait_chip_rdy();
+ if (c1101_spi_write_byte_ok_get_status(address & 0x2F) < 0)
return -1;
_delay_ms(2);
- if (spi_c1101_write_byte_ok_get_status(byte) < 0)
+ if (c1101_spi_write_byte_ok_get_status(byte) < 0)
return -1;
- spi_cs_disable();
+ hhd70_spi_cs_disable();
return 1;
}
-void spi_c1101_dump_registers_to_usb(void)
+void c1101_spi_dump_registers_to_usb(void)
{
int c = 0;
uint8_t debug_sb[6];
- spi_cs_enable();
- spi_c1101_wait_chip_rdy();
- if (spi_c1101_write_byte_ok_get_status(0xC0) < 0)
+ hhd70_spi_cs_enable();
+ hhd70_c1101_wait_chip_rdy();
+ if (c1101_spi_write_byte_ok_get_status(0xC0) < 0)
return;
usb_rawhid_send((uint8_t*)"dump all 46 registers:",255);
for (c=0; c<47; c++)
{
- debug_sprint_int16hex(debug_sb, spi_read_byte());
+ debug_sprint_int16hex(debug_sb, hhd70_spi_read_byte());
usb_rawhid_send(debug_sb,255);
}
- spi_cs_disable();
+ hhd70_spi_cs_disable();
}
-int spi_c1101_read_rxfifo(int leave_num_bytes, char *buffer, int maxlen)
+int c1101_spi_read_rxfifo(int leave_num_bytes, char *buffer, int maxlen)
{
int num_read = 0;
uint8_t num_available = 0;
- spi_cs_enable();
- spi_c1101_wait_chip_rdy();
- if (spi_c1101_write_byte_ok_get_status(SPIC1101_ADDR_RXBYTES) < 0)
+ hhd70_spi_cs_enable();
+ hhd70_c1101_wait_chip_rdy();
+ if (c1101_spi_write_byte_ok_get_status(SPIC1101_ADDR_RXBYTES) < 0)
return -1;
- num_available = spi_read_byte();
+ num_available = hhd70_spi_read_byte();
if (num_available == 0)
return 0;
- if (spi_c1101_write_byte_ok_get_status(SPIC1101_ADDR_FIFO_READ_BURST) < 0)
+ if (c1101_spi_write_byte_ok_get_status(SPIC1101_ADDR_FIFO_READ_BURST) < 0)
return -1;
while (maxlen-- > 0 && num_available - num_read > leave_num_bytes)
{
- buffer[num_read++] = spi_read_byte();
+ buffer[num_read++] = hhd70_spi_read_byte();
}
- spi_cs_disable();
+ hhd70_spi_cs_disable();
return num_read;
}
//note: currently this function reads at most 15 bytes
-int spi_c1101_read_rxfifo_max15(int leave_num_bytes, char *buffer, int maxlen)
+int c1101_spi_read_rxfifo_max15(int leave_num_bytes, char *buffer, int maxlen)
{
int16_t sb;
int num_read = 0;
- spi_cs_enable();
- spi_c1101_wait_chip_rdy();
- sb = spi_c1101_write_byte_ok_get_status(SPIC1101_ADDR_FIFO_READ_BURST);
+ hhd70_spi_cs_enable();
+ hhd70_c1101_wait_chip_rdy();
+ sb = c1101_spi_write_byte_ok_get_status(SPIC1101_ADDR_FIFO_READ_BURST);
if (sb < 0)
return -1;
//note if SPIC1101_SB_FIFO_BYTES_AVAILABLE(sb) == 15 then 15 or more bytes are available
while (maxlen-- > 0 && SPIC1101_SB_FIFO_BYTES_AVAILABLE(sb) - num_read > leave_num_bytes)
{
//hope this works !!
- buffer[num_read++] = spi_read_byte();
+ buffer[num_read++] = hhd70_spi_read_byte();
}
- spi_cs_disable();
+ hhd70_spi_cs_disable();
return num_read;
}
//note: always check if num_written returned == len given
-int spi_c1101_write_txfifo(char *buffer, int len)
+int c1101_spi_write_txfifo(char *buffer, int len)
{
char sb;
int num_written = 0;
- spi_cs_enable();
- spi_c1101_wait_chip_rdy();
- sb = spi_c1101_write_byte_ok_get_status(SPIC1101_ADDR_FIFO_WRITE_BURST);
+ hhd70_spi_cs_enable();
+ hhd70_c1101_wait_chip_rdy();
+ sb = c1101_spi_write_byte_ok_get_status(SPIC1101_ADDR_FIFO_WRITE_BURST);
if (sb < 0)
return -1;
//~ uint8_t debug_sb[6];
@@ -182,9 +182,9 @@ int spi_c1101_write_txfifo(char *buffer, int len)
//~ usb_rawhid_send((uint8_t*)"TXFifo bytes available",255);
//~ debug_sprint_int16hex(debug_sb, SPIC1101_SB_FIFO_BYTES_AVAILABLE(sb));
//~ usb_rawhid_send(debug_sb,255);
- sb = spi_c1101_write_byte_ok_get_status(buffer[num_written++]);
+ sb = c1101_spi_write_byte_ok_get_status(buffer[num_written++]);
}
- spi_cs_disable();
+ hhd70_spi_cs_disable();
return num_written;
}
@@ -195,49 +195,49 @@ int spi_c1101_write_txfifo(char *buffer, int len)
void c1101_init(void)
{
//reset C1101
- spi_c1101_strobe_command(SPIC1101_ADDR_SRES);
+ c1101_spi_strobe_command(SPIC1101_ADDR_SRES);
_delay_ms(100);
//flush FIFOs
- spi_c1101_strobe_command(SPIC1101_ADDR_SFRX);
- spi_c1101_strobe_command(SPIC1101_ADDR_SFTX);
+ c1101_spi_strobe_command(SPIC1101_ADDR_SFRX);
+ c1101_spi_strobe_command(SPIC1101_ADDR_SFTX);
//dump pre-init default values to usb
- spi_c1101_dump_registers_to_usb();
+ c1101_spi_dump_registers_to_usb();
//enable analog temperature sensor on GDO0
- spi_c1101_write_register(SPIC1101_ADDR_IOCFG0, 0x80);
+ c1101_spi_write_register(SPIC1101_ADDR_IOCFG0, 0x80);
//enable RX FIFO interrupt (i.e. GPO2 pulls high if >= FIFOTHR bytes are in RX FIFO)
- spi_c1101_write_register(SPIC1101_ADDR_IOCFG2, 0);
+ c1101_spi_write_register(SPIC1101_ADDR_IOCFG2, 0);
// FIFOTHR RX FIFO and TX FIFO Thresholds
// pull GPO high (interrupt) if more than 12 bytes in rx buffer (or less than 53 in tx)
- spi_c1101_write_register(SPIC1101_ADDR_FIFOTHR, 2);
+ c1101_spi_write_register(SPIC1101_ADDR_FIFOTHR, 2);
// PKTCTRL0 Packet Automation Control
- //spi_c1101_write_register(SPIC1101_ADDR_PKTCTRL0, 0b0000000010); //crc disabled; use FIFOs; infinite packet length mode
- spi_c1101_write_register(SPIC1101_ADDR_PKTCTRL0, 0b0000000001); //crc disabled; use FIFOs; variable packet length mode (first TX FIFO byte must be length)
- spi_c1101_write_register(SPIC1101_ADDR_PKTCTRL1, 0x00); //no address check, no append rssi and crc_ok to packet
+ //c1101_spi_write_register(SPIC1101_ADDR_PKTCTRL0, 0b0000000010); //crc disabled; use FIFOs; infinite packet length mode
+ c1101_spi_write_register(SPIC1101_ADDR_PKTCTRL0, 0b0000000001); //crc disabled; use FIFOs; variable packet length mode (first TX FIFO byte must be length)
+ c1101_spi_write_register(SPIC1101_ADDR_PKTCTRL1, 0x00); //no address check, no append rssi and crc_ok to packet
// FSCTRL1 Frequency Synthesizer Control
- spi_c1101_write_register(SPIC1101_ADDR_FSCTRL1, 0x06);
+ c1101_spi_write_register(SPIC1101_ADDR_FSCTRL1, 0x06);
// FREQn Frequency Control Words
- spi_c1101_write_register(SPIC1101_ADDR_FREQ2, 0x10); //should be 435.125 mhz
- spi_c1101_write_register(SPIC1101_ADDR_FREQ1, 0xBF);
- spi_c1101_write_register(SPIC1101_ADDR_FREQ0, 0xEF);
- spi_c1101_write_register(SPIC1101_ADDR_FSCTRL0, 0); //frequency offset
+ c1101_spi_write_register(SPIC1101_ADDR_FREQ2, 0x10); //should be 435.125 mhz
+ c1101_spi_write_register(SPIC1101_ADDR_FREQ1, 0xBF);
+ c1101_spi_write_register(SPIC1101_ADDR_FREQ0, 0xEF);
+ c1101_spi_write_register(SPIC1101_ADDR_FSCTRL0, 0); //frequency offset
// MDMCFGn Modem Configuration
- spi_c1101_write_register(SPIC1101_ADDR_MDMCFG4, 0xF8);
- spi_c1101_write_register(SPIC1101_ADDR_MDMCFG3, 0x83);
- spi_c1101_write_register(SPIC1101_ADDR_MDMCFG2, 0x13);
- spi_c1101_write_register(SPIC1101_ADDR_MDMCFG1, 0x00);
+ c1101_spi_write_register(SPIC1101_ADDR_MDMCFG4, 0xF8);
+ c1101_spi_write_register(SPIC1101_ADDR_MDMCFG3, 0x83);
+ c1101_spi_write_register(SPIC1101_ADDR_MDMCFG2, 0x13);
+ c1101_spi_write_register(SPIC1101_ADDR_MDMCFG1, 0x00);
// DEVIATN Modem Deviation Setting
- spi_c1101_write_register(SPIC1101_ADDR_DEVIATN, 0x07);
+ c1101_spi_write_register(SPIC1101_ADDR_DEVIATN, 0x07);
// MCSM0 Main Radio Control State Machine Configuration
- spi_c1101_write_register(SPIC1101_ADDR_MCSM0, 0x18);
+ c1101_spi_write_register(SPIC1101_ADDR_MCSM0, 0x18);
// FOCCFG Frequency Offset Compensation Configuration
- spi_c1101_write_register(SPIC1101_ADDR_FOCCFG, 0x16);
+ c1101_spi_write_register(SPIC1101_ADDR_FOCCFG, 0x16);
// WORCTRL Wake On Radio Control
- spi_c1101_write_register(SPIC1101_ADDR_WORCTRL, 0xFB);
+ c1101_spi_write_register(SPIC1101_ADDR_WORCTRL, 0xFB);
// FSCALn Frequency Synthesizer Calibration
- spi_c1101_write_register(SPIC1101_ADDR_FSCAL3, 0xE9);
- spi_c1101_write_register(SPIC1101_ADDR_FSCAL2, 0x2A);
- spi_c1101_write_register(SPIC1101_ADDR_FSCAL1, 0x00);
- spi_c1101_write_register(SPIC1101_ADDR_FSCAL0, 0x1F);
+ c1101_spi_write_register(SPIC1101_ADDR_FSCAL3, 0xE9);
+ c1101_spi_write_register(SPIC1101_ADDR_FSCAL2, 0x2A);
+ c1101_spi_write_register(SPIC1101_ADDR_FSCAL1, 0x00);
+ c1101_spi_write_register(SPIC1101_ADDR_FSCAL0, 0x1F);
// note: for now: assume f_xosc to be 26 Mhz
// for ~433.125 Mhz -> freq = 1091741, freq_offset = 0
@@ -258,21 +258,21 @@ void c1101_setFrequency(uint32_t freq, uint8_t freq_offset, uint8_t if_freq)
} while (! (SPIC1101_SB_IDLE(sb)));
//programm frequency
usb_rawhid_send((uint8_t*)"setting frequency",255);
- spi_c1101_write_register(SPIC1101_ADDR_FREQ0, freq & 0xFF);
- spi_c1101_write_register(SPIC1101_ADDR_FREQ1, (freq >> 8) & 0xFF);
- spi_c1101_write_register(SPIC1101_ADDR_FREQ2, (freq >> 16) & 0x3F);
+ c1101_spi_write_register(SPIC1101_ADDR_FREQ0, freq & 0xFF);
+ c1101_spi_write_register(SPIC1101_ADDR_FREQ1, (freq >> 8) & 0xFF);
+ c1101_spi_write_register(SPIC1101_ADDR_FREQ2, (freq >> 16) & 0x3F);
//set frequency offset
- spi_c1101_write_register(SPIC1101_ADDR_FSCTRL0, freq_offset);
- //spi_c1101_write_register(SPIC1101_ADDR_FSCTRL1, if_freq & 0x1F);
+ c1101_spi_write_register(SPIC1101_ADDR_FSCTRL0, freq_offset);
+ //c1101_spi_write_register(SPIC1101_ADDR_FSCTRL1, if_freq & 0x1F);
//set channel 0
- spi_c1101_write_register(SPIC1101_ADDR_CHANNR, 0);
+ c1101_spi_write_register(SPIC1101_ADDR_CHANNR, 0);
}
char c1101_putToSleep(void)
{
- return spi_c1101_strobe_command(SPIC1101_ADDR_SPWD);
+ return c1101_spi_strobe_command(SPIC1101_ADDR_SPWD);
}
@@ -280,11 +280,11 @@ uint16_t c1101_measureTemp(void)
{
uint16_t temp;
char ptest_value=0x7F;
- ptest_value = spi_c1101_read_register(SPIC1101_ADDR_PTEST);
- spi_c1101_write_register(SPIC1101_ADDR_PTEST, 0xBF);
+ ptest_value = c1101_spi_read_register(SPIC1101_ADDR_PTEST);
+ c1101_spi_write_register(SPIC1101_ADDR_PTEST, 0xBF);
_delay_ms(5);
temp = adc_read(ADCMUX_INTERNALTEMP);
- spi_c1101_write_register(SPIC1101_ADDR_PTEST, ptest_value);
+ c1101_spi_write_register(SPIC1101_ADDR_PTEST, ptest_value);
return temp;
}
@@ -293,13 +293,13 @@ void c1101_handleStatusByte(char sb)
//on RXFifo Overflow, Flush RX Fifo
if (SPIC1101_SB_RXFIFO_OVERFLOW(sb))
{
- spi_c1101_strobe_command(SPIC1101_ADDR_SFRX);
+ c1101_spi_strobe_command(SPIC1101_ADDR_SFRX);
usb_rawhid_send((uint8_t*)"RX fifo flushed",255);
}
//on TXFifo Overflow, Flush TX Fifo
if (SPIC1101_SB_TXFIFO_OVERFLOW(sb))
{
- spi_c1101_strobe_command(SPIC1101_ADDR_SFTX);
+ c1101_spi_strobe_command(SPIC1101_ADDR_SFTX);
usb_rawhid_send((uint8_t*)"TX fifo flushed",255);
}
}
@@ -307,10 +307,10 @@ void c1101_handleStatusByte(char sb)
char c1101_getStatus(void)
{
char sb=0;
- spi_cs_enable();
- spi_c1101_wait_chip_rdy();
- sb = spi_c1101_write_byte_ok_get_status(SPIC1101_ADDR_SNOP);
- spi_cs_disable();
+ hhd70_spi_cs_enable();
+ hhd70_c1101_wait_chip_rdy();
+ sb = c1101_spi_write_byte_ok_get_status(SPIC1101_ADDR_SNOP);
+ hhd70_spi_cs_disable();
//debug start
uint8_t debug_sb[6];
usb_rawhid_send((uint8_t*)"c1101 status:",255);
@@ -324,7 +324,7 @@ char c1101_getStatus(void)
char c1101_getMARCState(void)
{
char sb=0;
- sb = spi_c1101_read_register(SPIC1101_ADDR_MARCSTATE);
+ sb = c1101_spi_read_register(SPIC1101_ADDR_MARCSTATE);
sb &= 0x1F;
//debug start
uint8_t debug_sb[6];
@@ -337,30 +337,30 @@ char c1101_getMARCState(void)
uint8_t c1101_getNumBytesInTXFifo(void)
{
- return spi_c1101_read_register(SPIC1101_ADDR_TXBYTES);
+ return c1101_spi_read_register(SPIC1101_ADDR_TXBYTES);
}
void c1101_transmitData(char *buffer, unsigned int len)
{
uint8_t debug_sb[6];
uint8_t num_written = 0;
- uint8_t mcsm1 = spi_c1101_read_register(SPIC1101_ADDR_MCSM1);
+ uint8_t mcsm1 = c1101_spi_read_register(SPIC1101_ADDR_MCSM1);
//configure state machine to automatically go to IDLE, once packet was transmitted
mcsm1 = (mcsm1 & 0b11111100) | 0b00;
- spi_c1101_write_register(SPIC1101_ADDR_MCSM1, 0x18);
- spi_c1101_write_register(SPIC1101_ADDR_PKTCTRL0, 0b0000000001); //crc disabled; use FIFOs; variable packet length mode (first TX FIFO byte must be length)
+ c1101_spi_write_register(SPIC1101_ADDR_MCSM1, 0x18);
+ c1101_spi_write_register(SPIC1101_ADDR_PKTCTRL0, 0b0000000001); //crc disabled; use FIFOs; variable packet length mode (first TX FIFO byte must be length)
// flush TX FIFO
- num_written = spi_c1101_strobe_command(SPIC1101_ADDR_SFTX);
+ num_written = c1101_spi_strobe_command(SPIC1101_ADDR_SFTX);
usb_rawhid_send((uint8_t*)"Flush TX Fifo",255);
debug_sprint_int16hex(debug_sb, num_written);
usb_rawhid_send(debug_sb,255);
num_written = (uint8_t) len;
//variable packet length: write length of packet to TX FIFO:
- spi_c1101_write_txfifo((char*) &num_written, 1);
+ c1101_spi_write_txfifo((char*) &num_written, 1);
//~ //fill buffer
- //~ num_written = spi_c1101_write_txfifo(buffer, len);
+ //~ num_written = c1101_spi_write_txfifo(buffer, len);
//~ buffer += num_written;
//~ len -= num_written;
@@ -377,8 +377,8 @@ void c1101_transmitData(char *buffer, unsigned int len)
//~ usb_rawhid_send(debug_sb,255);
//start transmitting
- //num_written = spi_c1101_strobe_command(SPIC1101_ADDR_STX);
- //~ num_written = spi_exchange_byte(SPIC1101_ADDR_STX);
+ //num_written = c1101_spi_strobe_command(SPIC1101_ADDR_STX);
+ //~ num_written = hhd70_spi_exchange_byte(SPIC1101_ADDR_STX);
//~ usb_rawhid_send((uint8_t*)"Strobe STX",255);
//~ debug_sprint_int16hex(debug_sb, num_written);
//~ usb_rawhid_send(debug_sb,255);
@@ -392,14 +392,14 @@ void c1101_transmitData(char *buffer, unsigned int len)
do
{
c1101_getStatus();
- num_written = spi_c1101_write_txfifo(buffer, len );
+ num_written = c1101_spi_write_txfifo(buffer, len );
buffer += num_written;
len -= num_written;
c1101_state = c1101_getMARCState();
if (c1101_state == 1)
{
//from idle state, go to RX state
- num_written = spi_c1101_strobe_command(SPIC1101_ADDR_STX);
+ num_written = c1101_spi_strobe_command(SPIC1101_ADDR_STX);
//~ usb_rawhid_send((uint8_t*)"Strobe STX",255);
//~ debug_sprint_int16hex(debug_sb, num_written);
//~ usb_rawhid_send(debug_sb,255);
@@ -429,7 +429,7 @@ void c1101_recieveData(void)
uint8_t num_leave_in_fifo = 1;
do
{
- num_recv = spi_c1101_read_rxfifo( num_leave_in_fifo, recv_data+num_recv_total, max_len - num_recv_total);
+ num_recv = c1101_spi_read_rxfifo( num_leave_in_fifo, recv_data+num_recv_total, max_len - num_recv_total);
num_recv_total += num_recv;
//variable packet length: