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