00001 #include "encoder_counter.h"
00002
00003
00004 static const char ir_wr_mdr0 = 0x88;
00005 static const char ir_rd_mdr0 = 0x48;
00006 static const char ir_wr_mdr1 = 0x90;
00007 static const char ir_rd_mdr1 = 0x50;
00008 static const char ir_rd_str = 0x70;
00009 static const char ir_wr_dtr = 0x98;
00010 static const char ir_rd_cntr = 0x60;
00011 static const char ir_ld_cntr = 0xE0;
00012 static const char ir_rd_otr = 0x68;
00013 static const char ir_clr_cntr = 0x20;
00014 static const char mdr0_mode = 0x01;
00015 static const char mdr1_mode = 0x00;
00016 static const short LOW = 0, HIGH = 1;
00017
00018
00019 static short chip_select_pin, serial_clock_pin, master_out_slave_in_pin, master_in_slave_out_pin;
00020 static int spi_in_list[5] = {0x00, 0x00, 0x00, 0x00, 0x00};
00021 static int spi_out_list[5] = {0x00, 0x00, 0x00, 0x00, 0x00};
00022
00023
00024 void setChipSelect(int cs_state);
00025 void spiWrite(int bytes_to_write);
00026 void spiRead(int bytes_to_read);
00027
00028
00029 int initializeEncoderCounter(int cs_pin, int clock_pin, int mosi_pin, int miso_pin) {
00030
00031 chip_select_pin = cs_pin;
00032 serial_clock_pin = clock_pin;
00033 master_out_slave_in_pin = mosi_pin;
00034 master_in_slave_out_pin = miso_pin;
00035
00036 OUTPUT(chip_select_pin);
00037 OUTPUT(serial_clock_pin);
00038 OUTPUT(master_out_slave_in_pin);
00039 INPUT(master_in_slave_out_pin);
00040
00041 HIGH(chip_select_pin);
00042 LOW(serial_clock_pin);
00043 WAIT(1);
00044
00045 if(!IN(chip_select_pin) || IN(serial_clock_pin)) {
00046 INPUT(chip_select_pin);
00047 INPUT(serial_clock_pin);
00048 printf("chip select and or serial clock is being driven!");
00049 return -1;
00050 }
00051
00052
00053
00054
00055
00056
00057
00058
00059 if(mdr0_mode != setModeRegister0(mdr0_mode)
00060 || mdr1_mode != setModeRegister1(mdr1_mode)) {
00061 printf("%s\r\n", "mode registers don't match settings");
00062 return -1;
00063 } else {
00064 return getStatusRegister();
00065 }
00066 }
00067
00068
00069 int getEncoderCounts() {
00070 spi_out_list[0] = ir_rd_cntr;
00071
00072 setChipSelect(LOW);
00073 spiWrite(1);
00074 spiRead(4);
00075
00076 setChipSelect(HIGH);
00077
00078
00079 int otr_state = spi_in_list[0] << 24;
00080 otr_state += spi_in_list[1] << 16;
00081 otr_state += spi_in_list[2] << 8;
00082 otr_state += spi_in_list[3];
00083 return otr_state;
00084 }
00085
00086
00087 char getModeRegister0() {
00088 spi_out_list[0] = ir_rd_mdr0;
00089
00090 setChipSelect(LOW);
00091 spiWrite(1);
00092 spiRead(1);
00093
00094 setChipSelect(HIGH);
00095 return spi_in_list[0];
00096 }
00097
00098
00099 char getModeRegister1() {
00100 spi_out_list[0] = ir_rd_mdr1;
00101
00102 setChipSelect(LOW);
00103 spiWrite(1);
00104 spiRead(1);
00105
00106 setChipSelect(HIGH);
00107 return spi_in_list[0];
00108 }
00109
00110
00111 char getStatusRegister() {
00112 spi_out_list[0] = ir_rd_str;
00113
00114 setChipSelect(LOW);
00115 spiWrite(1);
00116 spiRead(1);
00117
00118 setChipSelect(HIGH);
00119 return spi_in_list[0];
00120 }
00121
00122
00123 char setModeRegister0(char mode) {
00124 spi_out_list[0] = ir_wr_mdr0;
00125 spi_out_list[1] = mode;
00126
00127 setChipSelect(LOW);
00128 spiWrite(2);
00129
00130 setChipSelect(HIGH);
00131 return getModeRegister0();
00132 }
00133
00134
00135 char setModeRegister1(char mode) {
00136 spi_out_list[0] = ir_wr_mdr1;
00137 spi_out_list[1] = mode;
00138
00139 setChipSelect(LOW);
00140 spiWrite(2);
00141
00142 setChipSelect(HIGH);
00143 return getModeRegister1();
00144 }
00145
00146
00147 int setCountRegister(int count) {
00148 int mask = 255;
00149 spi_out_list[0] = ir_wr_dtr;
00150 spi_out_list[1] = count >> 24;
00151 spi_out_list[2] = mask & (count >> 16);
00152 spi_out_list[3] = mask & (count >> 8);
00153 spi_out_list[4] = mask & count;
00154
00155 setChipSelect(LOW);
00156 spiWrite(5);
00157
00158 setChipSelect(HIGH);
00159
00160 spi_out_list[0] = ir_ld_cntr;
00161
00162 setChipSelect(LOW);
00163 spiWrite(1);
00164
00165 setChipSelect(HIGH);
00166 return getEncoderCounts();
00167 }
00168
00169
00170 int clearEncoderCounterCounts() {
00171
00172 spi_out_list[0] = ir_clr_cntr;
00173
00174 setChipSelect(LOW);
00175 spiWrite(1);
00176
00177 setChipSelect(HIGH);
00178 return getEncoderCounts();
00179 }
00180
00181 void spiRead(int bytes_to_read) {
00182
00183
00184 SHIFTIN(master_in_slave_out_pin, serial_clock_pin
00185 , 0, bytes_to_read, spi_in_list, 8);
00186 }
00187
00188 void spiWrite(int bytes_to_write) {
00189
00190
00191 SHIFTOUT(master_out_slave_in_pin, serial_clock_pin
00192 , 1, bytes_to_write, spi_out_list, 8);
00193 }
00194
00195 void setChipSelect(int cs_state) {
00196
00197
00198 if(cs_state) { HIGH(chip_select_pin); }
00199 else { LOW(chip_select_pin); }
00200
00201
00202 }
00203