Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
SPIcommFunctions.h
00001 //========================================================================= 00002 //Communication pinouts for serial COM port, SPI, and interrupts 00003 //========================================================================= 00004 static Serial pc(USBTX, USBRX); //PC comm 00005 static SPI spi(p23, p24, p25); //mosi, miso, sclk 00006 static DigitalOut cs(p22); //chip select 00007 00008 00009 //========================================================================= 00010 //Variables and arrays used for communications and data storage 00011 //========================================================================= 00012 int8_t deltaX_low, deltaY_low; //Stores the low-bits of movement data. 00013 int16_t deltaX_high, deltaY_high; //Stores the high-bits of movement data. 00014 int16_t deltaX, deltaY; //Stores the combined value of low and high bits. 00015 int16_t totalX, totalY = 0; //Stores the total deltaX and deltaY moved during runtime. 00016 int startupFail; 00017 00018 00019 //========================================================================= 00020 //Functions used to communicate with the sensor and grab/print data 00021 //========================================================================= 00022 uint8_t readRegister(uint8_t addr); 00023 //This function takes an 8-bit address in the form 0x00 and returns an 8-bit value in the form 0x00. 00024 00025 void writeRegister(uint8_t addr, uint8_t data); 00026 //This function takes an 8-bit address and 8-bit data. Writes the given data to the given address. 00027 00028 void startupCheck(void); 00029 //Checks whether or not the sensor was started up properly. 00030 00031 void initializeSensor(void); 00032 //Sets all of the registers needed for initialization and performance optimization. 00033 00034 void grabData(void); 00035 //Grabs the deltaX and deltaY information from the proper registers and formats it into the proper format. 00036 00037 void printData(void); 00038 //Prints the data out to a serial terminal. 00039 00040 00041 00042 00043 00044 //========================================================================= 00045 //Functions definitions 00046 //========================================================================= 00047 uint8_t readRegister(uint8_t addr) 00048 { 00049 cs = 0; //Set chip select low/active 00050 addr = addr & 0x7F; //Set MSB to 0 to indicate read operation 00051 spi.write(addr); //Write the given address 00052 wait_us(35); //Add a tiny delay after sending address for some internal cycle timing. 00053 uint8_t data_read = spi.write(0x00); //Throw dummy byte after sending address to receieve data 00054 cs = 1; //Set chip select back to high/inactive 00055 return data_read; //Returns 8-bit data from register 00056 } 00057 00058 00059 //========================================================================= 00060 void writeRegister(uint8_t addr, uint8_t data) 00061 { 00062 cs = 0; //Set chip select low/active 00063 addr = addr | 0x80; //Set MSB to 1 to indicate write operation 00064 spi.write(addr); //Write the given address 00065 spi.write(data); //Write the given data 00066 cs = 1; //Set chip select back to high/inactive 00067 00068 //pc.printf("R:%2X, D:%2X\n\r", addr, readRegister(addr)); 00069 //Uncomment this line for debugging. Prints every register write operation. 00070 } 00071 00072 00073 //========================================================================= 00074 void startupCheck(void) 00075 { 00076 startupFail = 0; 00077 writeRegister(0x7F, 0x00); 00078 writeRegister(0x55, 0x01); 00079 writeRegister(0x50, 0x07); 00080 writeRegister(0x7F, 0x0E); 00081 writeRegister(0x43, 0x10); 00082 00083 if(readRegister(0x47) != 0x08) 00084 { 00085 for(int i=0; i<3; i++) //Checks register 0x47 three times. If the value is incorrect 3 times, throw a fail condition. 00086 { 00087 if(readRegister(0x47) != 0x08) 00088 { 00089 writeRegister(0x43, 0x10) 00090 startupFail++; 00091 } 00092 } 00093 } 00094 } 00095 00096 00097 //========================================================================= 00098 void initializeSensor(void) 00099 { 00100 writeRegister(0x7F, 0x00); 00101 writeRegister(0x51, 0x7B); 00102 writeRegister(0x50, 0x00); 00103 writeRegister(0x55, 0x00); 00104 writeRegister(0x7F, 0x0E); 00105 00106 if(readRegister(0x73) == 0x00) 00107 { 00108 writeRegister(0x7F, 0x00); 00109 writeRegister(0x61, 0xAD); 00110 writeRegister(0x51, 0x70); 00111 writeRegister(0x7F, 0x0E); 00112 00113 if(readRegister(0x70) <= 28) 00114 writeRegister(0x70, readRegister(0x70) + 14); 00115 00116 else 00117 writeRegister(0x70, readRegister(0x70) + 11); 00118 00119 writeRegister(0x71, readRegister(0x71) * 45/100); 00120 } 00121 00122 writeRegister(0x7F, 0x00); 00123 writeRegister(0x61, 0xAD); 00124 writeRegister(0x7F, 0x03); 00125 writeRegister(0x40, 0x00); 00126 writeRegister(0x7F, 0x05); 00127 00128 writeRegister(0x41, 0xB3); 00129 writeRegister(0x43, 0xF1); 00130 writeRegister(0x45, 0x14); 00131 writeRegister(0x5B, 0x32); 00132 writeRegister(0x5F, 0x34); 00133 writeRegister(0x7B, 0x08); 00134 writeRegister(0x5E, 0x34); 00135 writeRegister(0x70, 0xE5); 00136 writeRegister(0x71, 0xE5); 00137 writeRegister(0x7F, 0x06); 00138 writeRegister(0x44, 0x1B); 00139 writeRegister(0x40, 0xBF); 00140 writeRegister(0x4E, 0x3F); 00141 writeRegister(0x7F, 0x08); 00142 writeRegister(0x66, 0x44); 00143 writeRegister(0x65, 0x20); 00144 writeRegister(0x6A, 0x3A); 00145 writeRegister(0x61, 0x01); 00146 writeRegister(0x62, 0x01); 00147 writeRegister(0x7F, 0x09); 00148 writeRegister(0x4F, 0xAF); 00149 writeRegister(0x5F, 0x40); 00150 writeRegister(0x48, 0x80); 00151 writeRegister(0x49, 0x80); 00152 writeRegister(0x57, 0x77); 00153 writeRegister(0x60, 0x78); 00154 writeRegister(0x61, 0x78); 00155 writeRegister(0x62, 0x08); 00156 writeRegister(0x63, 0x50); 00157 writeRegister(0x7F, 0x0A); 00158 writeRegister(0x45, 0x60); 00159 writeRegister(0x7F, 0x00); 00160 writeRegister(0x4D, 0x11); 00161 writeRegister(0x55, 0x80); 00162 writeRegister(0x74, 0x1F); 00163 writeRegister(0x75, 0x1F); 00164 writeRegister(0x4A, 0x78); 00165 writeRegister(0x4B, 0x78); 00166 writeRegister(0x44, 0x08); 00167 writeRegister(0x45, 0x50); 00168 writeRegister(0x64, 0xFF); 00169 writeRegister(0x65, 0x1F); 00170 writeRegister(0x7F, 0x14); 00171 writeRegister(0x65, 0x67); 00172 writeRegister(0x66, 0x08); 00173 writeRegister(0x63, 0x70); 00174 writeRegister(0x6F, 0x1C); 00175 writeRegister(0x7F, 0x15); 00176 writeRegister(0x48, 0x48); 00177 writeRegister(0x7F, 0x07); 00178 writeRegister(0x41, 0x0D); 00179 writeRegister(0x43, 0x14); 00180 writeRegister(0x4B, 0x0E); 00181 writeRegister(0x45, 0x0F); 00182 writeRegister(0x44, 0x42); 00183 writeRegister(0x4C, 0x80); 00184 writeRegister(0x7F, 0x10); 00185 writeRegister(0x5B, 0x02); 00186 writeRegister(0x7F, 0x07); 00187 writeRegister(0x40, 0x41); 00188 00189 wait_ms(10); 00190 00191 writeRegister(0x7F, 0x00); 00192 writeRegister(0x32, 0x00); 00193 writeRegister(0x7F, 0x07); 00194 writeRegister(0x68, 0xF0); 00195 writeRegister(0x69, 0x00); 00196 writeRegister(0x7F, 0x0D); 00197 writeRegister(0x48, 0xC0); 00198 writeRegister(0x6F, 0xD5); 00199 writeRegister(0x7F, 0x00); 00200 writeRegister(0x5B, 0xA0); 00201 writeRegister(0x4E, 0xA8); 00202 writeRegister(0x5A, 0x90); 00203 writeRegister(0x40, 0x80); 00204 writeRegister(0x7F, 0x08); 00205 writeRegister(0x6F, 0x9F); 00206 00207 wait_ms(10): 00208 00209 writeRegister(0x6F, 0x00); 00210 writeRegister(0x7F, 0x14); 00211 writeRegister(0x6F, 0x1C); 00212 } 00213 00214 00215 //========================================================================= 00216 void grabData(void) 00217 { 00218 deltaX_low = readRegister(0x03); //Grabs data from the proper registers. 00219 deltaX_high = (readRegister(0x04)<<8) & 0xFF00; //Grabs data and shifts it to make space to be combined with lower bits. 00220 deltaY_low = readRegister(0x05); 00221 deltaY_high = (readRegister(0x06)<<8) & 0xFF00; 00222 00223 deltaX = deltaX_high | deltaX_low; //Combines the low and high bits. 00224 deltaY = deltaY_high | deltaY_low; 00225 } 00226 00227 00228 //========================================================================= 00229 void printData(void) 00230 { 00231 if((deltaX != 0) || (deltaY != 0)) //If there is deltaX or deltaY movement, print the data. 00232 { 00233 totalX += deltaX; 00234 totalY += deltaY; 00235 00236 pc.printf("deltaX: %d\t\t\tdeltaY: %d\n\r", deltaX, deltaY); //Prints each individual count of deltaX and deltaY. 00237 pc.printf("X-axis Counts: %d\t\tY-axis Counts: %d\n\r", totalX, totalY); //Prints the total movement made during runtime. 00238 } 00239 00240 deltaX = 0; //Resets deltaX and Y values to zero, otherwise previous data is stored until overwritten. 00241 deltaY = 0; 00242 }
Generated on Fri Jul 15 2022 11:20:26 by
1.7.2
PAA5100 | Robotics Sensor With Cliff And Soft/Hard Surface Detection