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.c104
1 files changed, 100 insertions, 4 deletions
diff --git a/software/hhd70dongle/c1101lib.c b/software/hhd70dongle/c1101lib.c
index 875e6d6..26d5fb9 100644
--- a/software/hhd70dongle/c1101lib.c
+++ b/software/hhd70dongle/c1101lib.c
@@ -36,9 +36,105 @@
#include "spi.h"
//#include "usb_rawhid.h"
+/**** Helper Functions ****/
-#max len: 64 bytes
-void writeTXFifo(char *buffer, len)
+char spi_c1101_exchange(char *data, int len)
+{
+ char rbyte;
+ spi_cs_enable();
+ while (len--)
+ {
+ while ( ! (SPIC1101_SB_CHIPRDY(spi_read_byte())));
+ spi_write_byte(*(data++));
+ }
+ rbyte = spi_read_byte();
+ spi_cs_disable();
+ return rbyte;
+}
+
+// note addresses range from 0x00 to 0x2F for normal registers and 0xF0 to 0xFD for special status registers
+char spi_c1101_read_register(char address)
+{
+ char data[1];
+ data[0]=address | 0x80;
+ return spi_c1101_exchange(data, 1);
+}
+
+// note addresses range from 0x00 to 0x2F for normal registers
+char spi_c1101_write_register(char address, char byte)
+{
+ char data[2];
+ data[0]=address & 0x2F;
+ data[1]=byte;
+ return spi_c1101_exchange(data, 2);
+}
+
+// note addresses range from 0x30 to 0x3D for command strobes
+char spi_c1101_strobe_command(char address)
+{
+ char data[1];
+ data[0]=address;
+ return spi_c1101_exchange(data, 1);
+}
+
+int spi_c1101_read_rxfifo(int leave_num_bytes, char *buffer, int maxlen)
+{
+ char sb;
+ int num_read = 0;
+ int num_fifo_available = 0;
+ spi_cs_enable();
+ while ( ! (SPIC1101_SB_CHIPRDY(spi_read_byte())));
+ spi_write_byte(SPIC1101_ADDR_FIFO_READ_BURST);
+ do
+ {
+ sb = spi_read_byte();
+ } while ( ! (SPIC1101_SB_CHIPRDY(sb)));
+ num_fifo_available = SPIC1101_SB_FIFO_BYTES_AVAILABLE(sb);
+
+ while (maxlen-- && num_fifo_available - num_read <= leave_num_bytes)
+ {
+ //hope this works !!
+ buffer[num_read++] = spi_read_byte();
+ }
+ spi_cs_disable();
+ return num_read;
+}
+
+//note: always check if num_written returned == len given
+int spi_c1101_write_txfifo(char *buffer, int len)
+{
+ char sb;
+ int num_written = 0;
+ int num_fifo_available = 0;
+ spi_cs_enable();
+ while ( ! (SPIC1101_SB_CHIPRDY(spi_read_byte())));
+ spi_write_byte(SPIC1101_ADDR_FIFO_WRITE_BURST);
+ do
+ {
+ sb = spi_read_byte();
+ } while ( ! (SPIC1101_SB_CHIPRDY(sb)));
+ num_fifo_available = SPIC1101_SB_FIFO_BYTES_AVAILABLE(sb);
+
+ //if there is less space in tx-fifo than num-byte we want to send, only fill fifo until full and leave rest of buffer unsent (for now)
+ if (num_fifo_available < len)
+ len = num_fifo_available;
+
+ while (len--)
+ {
+ //hope this works !!
+ spi_write_byte(buffer[num_written++]);
+ }
+ spi_cs_disable();
+ return num_written;
+}
+
+
+
+/**** External Functions ****/
+
+
+//max len: 64 bytes
+void writeTXFifo(char *buffer, unsigned int len)
{
//check TXBYTES.NUM_TXBYTES
// never write more bytes than avaiblabe or doom ensues
@@ -46,7 +142,7 @@ void writeTXFifo(char *buffer, len)
}
-#max returned: 64 bytes
+//max returned: 64 bytes
int readRXFifo(char *buffer)
{
//check RXBYTES.NUM_RXBYTES
@@ -56,5 +152,5 @@ int readRXFifo(char *buffer)
// and last read byte will be duplicated.
// thus: don't last avialable FIFO Bytes unless we can be sure that it will be the last byte of a packet and we can be sure that a following duplicated byte is actually an Fifo duplication and not an actually recieved byte !
-
+ return 0;
} \ No newline at end of file