00001 #include "pic_rf_2401a.h"
00002 #include "pic_serial.h"
00003 #include <stdlib.h>
00004
00005 void pic_rf_send_byte(uns8 b)
00006 {
00007 uns8 bit_counter;
00008 for(bit_counter = 0 ; bit_counter < 8 ; bit_counter++) {
00009 change_pin(rf_data_port, rf_data_pin, b.7);
00010 set_pin(rf_clk1_port, rf_clk1_pin);
00011 clear_pin(rf_clk1_port, rf_clk1_pin);
00012
00013 b <<= 1;
00014 }
00015
00016 }
00017
00018 void pic_rf_send_bytes(char *bytes, uns8 num_bytes) {
00019
00020 uns8 byte_counter;
00021 for(byte_counter = 0 ; byte_counter < num_bytes ; byte_counter++) {
00022 pic_rf_send_byte(bytes[byte_counter]);
00023 }
00024 }
00025
00026 void pic_rf_quick_init(char *my_config, uns8 my_channel, bit my_receive_on) {
00027
00028 uns8 byte_counter;
00029 make_output(rf_data_port, rf_data_pin);
00030 clear_pin(rf_clk1_port, rf_clk1_pin);
00031
00032 pic_rf_chip_enable(0);
00033 pic_rf_chip_select(1);
00034
00035 for(byte_counter = 0 ; byte_counter < 15 ; byte_counter++) {
00036 pic_rf_send_byte(my_config[byte_counter]);
00037 }
00038 rf_current_channel = my_channel;
00039 rf_current_mode_receive = my_receive_on;
00040
00041 pic_rf_chip_select(0);
00042 pic_rf_chip_enable(1);
00043
00044 }
00045
00046
00047 void pic_rf_init(rf_config *my_config)
00048 {
00049 uns8 temp;
00050 uns8 options;
00051
00052 make_output(rf_data_port, rf_data_pin);
00053 clear_pin(rf_clk1_port, rf_clk1_pin);
00054
00055 pic_rf_chip_enable(0);
00056 pic_rf_chip_select(1);
00057
00058 pic_rf_send_byte(my_config->payload_width_ch2);
00059 pic_rf_send_byte(my_config->payload_width_ch1);
00060 pic_rf_send_bytes(my_config->address_ch2, 5);
00061 pic_rf_send_bytes(my_config->address_ch1, 5);
00062
00063 options = my_config->options;
00064
00065 temp = my_config->address_width << 2;
00066 temp.1 = options.LONG_CRC;
00067 temp.0 = options.ENABLE_CRC;
00068
00069 pic_rf_send_byte(temp);
00070
00071 temp = options & 0b11100000;
00072
00073
00074
00075 temp |= (my_config->crystal & 0b00000111) << 2;
00076 temp |= (my_config->output_power & 0b00000011);
00077
00078 pic_rf_send_byte(temp);
00079
00080 temp = my_config->channel << 1;
00081 rf_current_channel = my_config->channel;
00082
00083 temp |= options.ENABLE_RECEIVE;
00084 rf_current_mode_receive = options.ENABLE_RECEIVE;
00085
00086 pic_rf_send_byte(temp);
00087
00088 pic_rf_chip_select(0);
00089 pic_rf_chip_enable(1);
00090
00091 }
00092
00093
00094 void pic_rf_receive(uns8* data, uns8 bytes_to_receive) {
00095 uns8 byte_count, bit_count, temp;
00096
00098 bit my_store_gie = intcon.GIE;
00099 kill_interrupts();
00100
00101 make_input(rf_data_port, rf_data_pin);
00102
00103 for (byte_count = 0; byte_count < bytes_to_receive; byte_count++) {
00104
00105 for (bit_count = 0; bit_count < 8; bit_count++) {
00106 temp <<= 1;
00107 temp.0 = test_pin(rf_data_port, rf_data_pin);
00108 set_pin(rf_clk1_port, rf_clk1_pin);
00109 clear_pin(rf_clk1_port, rf_clk1_pin);
00110 }
00111 data[byte_count] = temp;
00112 }
00113
00115 intcon.GIE = my_store_gie;
00116 }
00117
00118 void pic_rf_transmit(char* data, uns8 bytes_to_transmit) {
00119
00120 uns8 byte_count, bit_count, temp;
00121
00122 bit my_store_gie = intcon.GIE;
00123 kill_interrupts();
00124
00125 if (rf_current_mode_receive) {
00126 pic_rf_set_mode(TRANSMIT_MODE);
00127 }
00128
00129 make_output(rf_data_port, rf_data_pin);
00130
00131 pic_rf_send_bytes_inline(data, bytes_to_transmit);
00132
00133 pic_rf_chip_enable(0);
00134
00135 delay_ms(1);
00136
00137 pic_rf_set_mode(RECEIVE_MODE);
00138
00139 intcon.GIE = my_store_gie;
00140 }
00141
00142 void pic_rf_set_mode(uns8 mode)
00143 {
00144 bit my_store_gie = intcon.GIE;
00145 kill_interrupts();
00146
00147 make_output(rf_data_port, rf_data_pin);
00148 pic_rf_chip_enable(0);
00149 pic_rf_chip_select(1);
00150
00151 change_pin(rf_data_port, rf_data_pin, mode);
00152 set_pin(rf_clk1_port, rf_clk1_pin);
00153 clear_pin(rf_clk1_port, rf_clk1_pin);
00154
00155 pic_rf_chip_select(0);
00156 pic_rf_chip_enable(1);
00157
00158 rf_current_mode_receive = mode;
00159
00160 intcon.GIE = my_store_gie;
00161 }
00162
00163 void pic_rf_set_channel(uns8 channel)
00164 {
00165 bit my_store_gie = intcon.GIE;
00166 kill_interrupts();
00167
00168 clear_bit(tris_array[rf_data_port - PORTA], rf_data_pin);
00169
00170 pic_rf_chip_enable(0);
00171 pic_rf_chip_select(1);
00172
00173 rf_current_channel = channel;
00174 channel <<= 1;
00175 channel |= rf_current_mode_receive;
00176
00177 pic_rf_send_byte(channel);
00178
00179 pic_rf_chip_select(0);
00180 pic_rf_chip_enable(1);
00181
00182 intcon.GIE = my_store_gie;
00183 }
00184
00185 void pic_rf_setup() {
00186
00187 make_output(rf_data_port, rf_data_pin);
00188 make_output(rf_cs_port, rf_cs_pin);
00189 make_output(rf_ce_port, rf_ce_pin);
00190 make_input (rf_dr1_port, rf_dr1_pin);
00191 make_output(rf_clk1_port, rf_clk1_pin);
00192
00193 }
00194
00195
00196