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 "ms5540.h"
00038 #include "pic_serial.h"
00039 #include "debug.h"
00040
00041
00042 #define MS5540_DELAY_AMOUNT 2
00043
00044 int16 c1, c2, c3, c4, c5, c6;
00045
00046 void ms5540_setup_io(void) {
00047
00048 clear_pin(ms5540_sclk_port, ms5540_sclk_pin);
00049 make_output(ms5540_sclk_port, ms5540_sclk_pin);
00050 make_output(ms5540_din_port, ms5540_din_pin);
00051 make_input(ms5540_dout_port, ms5540_dout_pin);
00052 }
00053
00054 void ms5540_pulse_sclk() {
00055
00056 set_pin(ms5540_sclk_port, ms5540_sclk_pin);
00057 delay_us(MS5540_DELAY_AMOUNT);
00058 clear_pin(ms5540_sclk_port, ms5540_sclk_pin);
00059 delay_us(MS5540_DELAY_AMOUNT);
00060
00061 }
00062
00063 void ms5540_send_start() {
00064
00065 set_pin(ms5540_din_port, ms5540_din_pin);
00066 ms5540_pulse_sclk();
00067 ms5540_pulse_sclk();
00068 ms5540_pulse_sclk();
00069 }
00070
00071 void ms5540_send_stop() {
00072
00073 clear_pin(ms5540_din_port, ms5540_din_pin);
00074 ms5540_pulse_sclk();
00075 ms5540_pulse_sclk();
00076 ms5540_pulse_sclk();
00077 }
00078
00079
00080 void ms5540_reset() {
00081
00082 uns16 reset_word = 0b1010101010101010;
00083 uns8 count;
00084
00085 for( count = 1 ; count < 17 ; count++ )
00086 {
00087 change_pin(ms5540_din_port, ms5540_din_pin, count.0);
00088 ms5540_pulse_sclk();
00089 }
00090
00091 ms5540_pulse_sclk();
00092 ms5540_pulse_sclk();
00093 ms5540_pulse_sclk();
00094 ms5540_pulse_sclk();
00095 ms5540_pulse_sclk();
00096
00097
00098 }
00099
00100
00101
00102 uns16 ms5540_get_config(uns8 config_word) {
00103
00104 uns8 request;
00105 uns8 count;
00106 uns16 result;
00107
00108 switch (config_word) {
00109 case 1:
00110 request = 0b01010100;
00111 break;
00112 case 2:
00113 request = 0b01011000;
00114 break;
00115 case 3:
00116 request = 0b01100100;
00117 break;
00118 case 4:
00119 request = 0b01101000;
00120 break;
00121 }
00122 ms5540_send_start();
00123
00124 for( count = 0 ; count < 6 ; count++ )
00125 {
00126 change_pin(ms5540_din_port, ms5540_din_pin, request.7);
00127
00128 request = request << 1;
00129
00130 ms5540_pulse_sclk();
00131 }
00132
00133 ms5540_send_stop();
00134
00135
00136 ms5540_pulse_sclk();
00137
00138
00139 for(count = 0 ; count < 16 ; count++)
00140 {
00141 ms5540_pulse_sclk();
00142
00143 result = result << 1;
00144 result.0 = test_pin(ms5540_dout_port, ms5540_dout_pin);
00145 }
00146
00147
00148 ms5540_pulse_sclk();
00149
00150 return result;
00151
00152 }
00153
00154 uns16 ms5540_get_raw_pressure() {
00155
00156 uns8 setup_word = 0b1010;
00157 uns8 count;
00158 uns16 result;
00159
00160 ms5540_send_start();
00161
00162 set_pin(ms5540_din_port, ms5540_din_pin);
00163 ms5540_pulse_sclk();
00164
00165 clear_pin(ms5540_din_port, ms5540_din_pin);
00166 ms5540_pulse_sclk();
00167
00168 set_pin(ms5540_din_port, ms5540_din_pin);
00169 ms5540_pulse_sclk();
00170
00171 clear_pin(ms5540_din_port, ms5540_din_pin);
00172 ms5540_pulse_sclk();
00173
00174 ms5540_send_stop();
00175
00176
00177 ms5540_pulse_sclk();
00178 ms5540_pulse_sclk();
00179
00180
00181
00182 while (test_pin(ms5540_dout_port, ms5540_dout_pin) != 0) {
00183 }
00184
00185
00186 for(count = 0 ; count < 16 ; count++)
00187 {
00188 ms5540_pulse_sclk();
00189
00190 result = result << 1;
00191 result.0 = test_pin(ms5540_dout_port, ms5540_dout_pin);
00192 }
00193
00194
00195 ms5540_pulse_sclk();
00196 return result;
00197
00198 }
00199
00200 uns16 ms5540_get_raw_temp() {
00201
00202 uns8 setup_word = 0b1010;
00203 uns8 count;
00204 uns16 result;
00205
00206
00207 ms5540_send_start();
00208
00209 set_pin(ms5540_din_port, ms5540_din_pin);
00210 ms5540_pulse_sclk();
00211
00212 clear_pin(ms5540_din_port, ms5540_din_pin);
00213 ms5540_pulse_sclk();
00214
00215 ms5540_pulse_sclk();
00216
00217 set_pin(ms5540_din_port, ms5540_din_pin);
00218 ms5540_pulse_sclk();
00219
00220 ms5540_send_stop();
00221
00222
00223 ms5540_pulse_sclk();
00224 ms5540_pulse_sclk();
00225
00226
00227
00228 while (test_pin(ms5540_dout_port, ms5540_dout_pin) != 0) {
00229 }
00230
00231
00232 for(count = 0 ; count < 16 ; count++)
00233 {
00234 ms5540_pulse_sclk();
00235
00236 result = result << 1;
00237 result.0 = test_pin(ms5540_dout_port, ms5540_dout_pin);
00238 }
00239
00240
00241 ms5540_pulse_sclk();
00242
00243 return result;
00244
00245 }
00246
00247 void ms5540_init() {
00248
00249 uns16 word1, word2, word3, word4, x, y;
00250
00251
00252
00253
00254
00255
00256
00257
00258
00259 ms5540_reset();
00260
00261
00262 word1 = ms5540_get_config(1);
00263 serial_print_int(word1);
00264 serial_print_spc();
00265 word2 = ms5540_get_config(2);
00266 serial_print_int(word2);
00267 serial_print_spc();
00268 word3 = ms5540_get_config(3);
00269 serial_print_int(word3);
00270 serial_print_spc();
00271 word4 = ms5540_get_config(4);
00272 serial_print_int(word4);
00273 serial_print_nl();
00274
00275
00276
00277 c1 = (word1 >> 1) & 0x7fff;
00278
00279
00280
00281
00282
00283
00284 x = (word1 << 10) & 0x0400;
00285 y = (word2 >> 6) & 0x03ff;
00286 c5 = x | y;
00287
00288 c6 = word2 & 0b0000000000111111;
00289
00290 c4 = (word3 >> 6) & 0x03ff;
00291
00292 x = (word3 << 6) & 0x0fc0;
00293 y = (word4 & 0b0000000000111111);
00294 c2 = x | y;
00295
00296 c3 = (word4 >> 6) & 0x03ff;
00297
00298 serial_print_str("c1=");
00299 serial_print_int(c1);
00300 serial_print_nl();
00301 serial_print_str("c2=");
00302 serial_print_int(c2);
00303 serial_print_nl();
00304 serial_print_str("c3=");
00305 serial_print_int(c3);
00306 serial_print_nl();
00307 serial_print_str("c4=");
00308 serial_print_int(c4);
00309 serial_print_nl();
00310 serial_print_str("c5=");
00311 serial_print_int(c5);
00312 serial_print_nl();
00313 serial_print_str("c6=");
00314 serial_print_int(c6);
00315 serial_print_nl();
00316
00317
00318 }
00319
00320
00321
00322 void ms5540_calc_temp_and_pressure() {
00323
00324 int16 d1, d2, ut1, off;
00325 int16 temp, p, dt;
00326 int32 sens, x;
00327
00328
00329
00330
00331
00332
00333
00334
00335
00336 d1 = ms5540_get_raw_pressure();
00337
00338
00339 serial_print_str("get pr d1: ");
00340 serial_print_int(d1);
00341 serial_print_nl();
00342
00343 d2 = ms5540_get_raw_temp();
00344
00345 serial_print_str("get temp: ");
00346 serial_print_int(d2);
00347 serial_print_nl();
00348
00349 ut1 = 8*c5+20224;
00350
00351 serial_print_str("ut1= ");
00352 serial_print_int(ut1);
00353 serial_print_nl();
00354
00355 dt = d2 - ut1;
00356
00357 serial_print_str("dt= ");
00358 serial_print_int(dt);
00359 serial_print_nl();
00360
00361 temp = 200 + (int32)dt * ((int32)c6 + 50) / 1024;
00362
00363 serial_print_str("temp= ");
00364 serial_print_int(temp);
00365 serial_print_nl();
00366
00367 off = c2 * 4 + (((int32)c4-512)*dt) / 4096;
00368
00369 serial_print_str("off= ");
00370 serial_print_int(off);
00371 serial_print_nl();
00372
00373 sens = c1 + ((int32)c3*dt)/1024 + 24576;
00374
00375 serial_print_str("sens= ");
00376 serial_print_int(sens);
00377 serial_print_nl();
00378
00379 x = ((int32)sens * ((int32)d1-7168))/16384 - (int32)off;
00380
00381 serial_print_str("x= ");
00382 serial_print_int(x);
00383 serial_print_nl();
00384
00385 p = x * 10/32 + 250*10;
00386
00387 serial_print_str("p= ");
00388 serial_print_int(p);
00389 serial_print_nl();
00390 }
00391
00392