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