Kevin Braun / Mbed 2 deprecated KL25Z-rtc_i2c-100a

Dependencies:   MMA8451Q TSI mbed

Fork of KL25Z-rtc_i2c-100 by Kevin Braun

Committer:
loopsva
Date:
Mon Mar 03 17:19:46 2014 +0000
Revision:
0:20719c1a48f7
Child:
1:c9bed9dbeed5
Sample test code for KL25Z RTC and I2C issues

Who changed what in which revision?

UserRevisionLine numberNew contents of line
loopsva 0:20719c1a48f7 1 #include "mbed.h"
loopsva 0:20719c1a48f7 2 #include "TSISensor.h" //touch sensor
loopsva 0:20719c1a48f7 3 #include "MMA8451Q.h" //accelerometer
loopsva 0:20719c1a48f7 4
loopsva 0:20719c1a48f7 5 int revision = 100;
loopsva 0:20719c1a48f7 6
loopsva 0:20719c1a48f7 7 Serial pc(USBTX, USBRX); //tx, rx
loopsva 0:20719c1a48f7 8
loopsva 0:20719c1a48f7 9 MMA8451Q acc(PTE25, PTE24, 0x3a); //accelerometer
loopsva 0:20719c1a48f7 10 I2C i2c0(PTE0, PTE1); //i2c bus 0
loopsva 0:20719c1a48f7 11 I2C i2c1(PTE25, PTE24); //i2c bus 1
loopsva 0:20719c1a48f7 12
loopsva 0:20719c1a48f7 13 #define LED_ON 0
loopsva 0:20719c1a48f7 14 #define LED_OFF 1
loopsva 0:20719c1a48f7 15 DigitalOut rled(LED_RED); //KL25Z red led
loopsva 0:20719c1a48f7 16 DigitalOut gled(LED_GREEN); //KL25Z green led
loopsva 0:20719c1a48f7 17 // DO NOT Use LED_BLUE - pin PTD1 already in use by WiFi chip
loopsva 0:20719c1a48f7 18
loopsva 0:20719c1a48f7 19 int gDebug = 1; //global debug print flag
loopsva 0:20719c1a48f7 20
loopsva 0:20719c1a48f7 21 //--------------------------------------------------------------------------------------------------------------------------------------//
loopsva 0:20719c1a48f7 22 //RTC specific variables and constants
loopsva 0:20719c1a48f7 23
loopsva 0:20719c1a48f7 24 #define TBUFLEN 10 //size of smaller ascii time buffers
loopsva 0:20719c1a48f7 25 time_t ctTime; //time structure
loopsva 0:20719c1a48f7 26 int DST = 0; //Daylight Saving Time (or as defined in .ini file)
loopsva 0:20719c1a48f7 27 int TZone = -8; //Time Zone from UTC (or as defined in .ini file)
loopsva 0:20719c1a48f7 28 int NTPUpdateValue = 7200 ;//86400; //every 2 hours, this KL25Z has a FAST RTC //update RTC every 24 hours (or as defined in .ini file)
loopsva 0:20719c1a48f7 29 char timebuf_hm[TBUFLEN]; //local time format buffer - 21:16
loopsva 0:20719c1a48f7 30 char timebuf_hms[TBUFLEN]; //local time format buffer - 21:16:43
loopsva 0:20719c1a48f7 31 char timebuf_mdy[TBUFLEN]; //local time format buffer - 04/01/14
loopsva 0:20719c1a48f7 32 char timebuf_dMyy[TBUFLEN + 4]; //local time format buffer - 01-Apr-2014
loopsva 0:20719c1a48f7 33
loopsva 0:20719c1a48f7 34 int BootTime = 0; //RTC at boot up
loopsva 0:20719c1a48f7 35 int StartTime = 0; //time we powered up
loopsva 0:20719c1a48f7 36 int SysUpTime = 0; //time we've been alive
loopsva 0:20719c1a48f7 37 int EventTime = 0; //for 143 debug, next time to save data in EVENTS.CSV
loopsva 0:20719c1a48f7 38 int RTCupdate = 0; //time until next NTP update timer
loopsva 0:20719c1a48f7 39
loopsva 0:20719c1a48f7 40 //--------------------------------------------------------------------------------------------------------------------------------------//
loopsva 0:20719c1a48f7 41 // Print build date / time Note: display is UTC, not local time
loopsva 0:20719c1a48f7 42 // Adafruit CC3000 WiFi Shield with uFL Connector for Ext Antenna
loopsva 0:20719c1a48f7 43 // http://www.adafruit.com/products/1534
loopsva 0:20719c1a48f7 44
loopsva 0:20719c1a48f7 45 void printBuildDate() {
loopsva 0:20719c1a48f7 46 pc.printf("KL25Z / WWVB Tests v%d build: " __DATE__ " " __TIME__ "(UTC) K Braun\n", revision);
loopsva 0:20719c1a48f7 47 }
loopsva 0:20719c1a48f7 48
loopsva 0:20719c1a48f7 49 //--------------------------------------------------------------------------------------------------------------------------------------//
loopsva 0:20719c1a48f7 50 // initial splash display
loopsva 0:20719c1a48f7 51
loopsva 0:20719c1a48f7 52 void initSplash() {
loopsva 0:20719c1a48f7 53 pc.printf("\n\n");
loopsva 0:20719c1a48f7 54 pc.printf("-------------------------------------------------------------------\n");
loopsva 0:20719c1a48f7 55 printBuildDate();
loopsva 0:20719c1a48f7 56 }
loopsva 0:20719c1a48f7 57
loopsva 0:20719c1a48f7 58 //--------------------------------------------------------------------------------------------------------------------------------------//
loopsva 0:20719c1a48f7 59 //Detect I2C device chain
loopsva 0:20719c1a48f7 60
loopsva 0:20719c1a48f7 61 extern I2C i2c0;
loopsva 0:20719c1a48f7 62 extern I2C i2c1;
loopsva 0:20719c1a48f7 63
loopsva 0:20719c1a48f7 64 int dispI2C(int i2cchain) {
loopsva 0:20719c1a48f7 65 int count = 0;
loopsva 0:20719c1a48f7 66 for (int address = 2; address < 256; address +=2) {
loopsva 0:20719c1a48f7 67 if(((i2cchain == 0) && (!i2c0.write(address, NULL, 0))) || ((i2cchain == 1) && (!i2c1.write(address, NULL, 0)))) {
loopsva 0:20719c1a48f7 68 wait_us(50);
loopsva 0:20719c1a48f7 69 pc.printf(" - i2c chain %d: device found at address 0x%02X \n", i2cchain, address);
loopsva 0:20719c1a48f7 70 count++;
loopsva 0:20719c1a48f7 71 }
loopsva 0:20719c1a48f7 72 }
loopsva 0:20719c1a48f7 73 return(count);
loopsva 0:20719c1a48f7 74 }
loopsva 0:20719c1a48f7 75 //--------------------------------------------------------------------------------------------------------------------------------------//
loopsva 0:20719c1a48f7 76 //Detect I2C device chain
loopsva 0:20719c1a48f7 77
loopsva 0:20719c1a48f7 78 void find_i2c(int i2cbus) {
loopsva 0:20719c1a48f7 79 pc.printf("Searching for devices on i2c bus %d ...\n", i2cbus);
loopsva 0:20719c1a48f7 80 int count = dispI2C(i2cbus);
loopsva 0:20719c1a48f7 81 pc.printf(" - %2d devices found on i2c bus %d\n", count, i2cbus);
loopsva 0:20719c1a48f7 82 }
loopsva 0:20719c1a48f7 83
loopsva 0:20719c1a48f7 84 //--------------------------------------------------------------------------------------------------------------------------------------//
loopsva 0:20719c1a48f7 85 // Update time
loopsva 0:20719c1a48f7 86
loopsva 0:20719c1a48f7 87 void UpdateTime() {
loopsva 0:20719c1a48f7 88 ctTime = time(NULL) + ((TZone + DST) * 3600); //timezone and dst offsets
loopsva 0:20719c1a48f7 89 SysUpTime = ctTime - StartTime;
loopsva 0:20719c1a48f7 90 strftime(timebuf_mdy, TBUFLEN, "%m/%d/%y", localtime(&ctTime));
loopsva 0:20719c1a48f7 91 strftime(timebuf_dMyy, TBUFLEN * 2, "%d-%b-%Y", localtime(&ctTime));
loopsva 0:20719c1a48f7 92 strftime(timebuf_hm, TBUFLEN, "%H:%M", localtime(&ctTime));
loopsva 0:20719c1a48f7 93 strftime(timebuf_hms, TBUFLEN, "%H:%M:%S", localtime(&ctTime));
loopsva 0:20719c1a48f7 94 }
loopsva 0:20719c1a48f7 95
loopsva 0:20719c1a48f7 96
loopsva 0:20719c1a48f7 97 //--------------------------------------------------------------------------------------------------------------------------------------//
loopsva 0:20719c1a48f7 98 //general housekeeping items whilw waiting in loops
loopsva 0:20719c1a48f7 99
loopsva 0:20719c1a48f7 100 void HouseKeeping() {
loopsva 0:20719c1a48f7 101 UpdateTime();
loopsva 0:20719c1a48f7 102 }
loopsva 0:20719c1a48f7 103
loopsva 0:20719c1a48f7 104 //--------------------------------------------------------------------------------------------------------------------------------------//
loopsva 0:20719c1a48f7 105 //--------------------------------------------------------------------------------------------------------------------------------------//
loopsva 0:20719c1a48f7 106 // * \brief HTTP client demo
loopsva 0:20719c1a48f7 107 // * \param none
loopsva 0:20719c1a48f7 108 // * \return int
loopsva 0:20719c1a48f7 109
loopsva 0:20719c1a48f7 110 int main() {
loopsva 0:20719c1a48f7 111 rled = LED_OFF;
loopsva 0:20719c1a48f7 112 gled = LED_OFF;
loopsva 0:20719c1a48f7 113 ctTime = time(NULL);
loopsva 0:20719c1a48f7 114 StartTime = ctTime; //get time we started up
loopsva 0:20719c1a48f7 115 BootTime = ctTime; //save boot time for later (RTC debug)
loopsva 0:20719c1a48f7 116
loopsva 0:20719c1a48f7 117 pc.baud(230400);
loopsva 0:20719c1a48f7 118 initSplash();
loopsva 0:20719c1a48f7 119
loopsva 0:20719c1a48f7 120 //who caused the reset condition??
loopsva 0:20719c1a48f7 121 uint16_t resetReg = (RCM->SRS1 << 8) | RCM->SRS0;
loopsva 0:20719c1a48f7 122 pc.printf("CPU Reset Source> 1: 0x%02x 0: 0x%02x\r\n", resetReg >> 8, resetReg & 255);
loopsva 0:20719c1a48f7 123
loopsva 0:20719c1a48f7 124 //initialize the USB serial port interrupt and thread pointer
loopsva 0:20719c1a48f7 125 pc.printf("Initializing Serial Port Rx Interrupt... \r\n");
loopsva 0:20719c1a48f7 126
loopsva 0:20719c1a48f7 127 //look for devices on i2c buses
loopsva 0:20719c1a48f7 128 find_i2c(0);
loopsva 0:20719c1a48f7 129 find_i2c(1);
loopsva 0:20719c1a48f7 130 //enMMA8491 = 0;
loopsva 0:20719c1a48f7 131 //get kl25z chip serial number and configuration ID registers
loopsva 0:20719c1a48f7 132 uint32_t idRegH = SIM->UIDMH;
loopsva 0:20719c1a48f7 133 uint32_t idRegM = SIM->UIDML;
loopsva 0:20719c1a48f7 134 uint32_t idRegL = SIM->UIDL;
loopsva 0:20719c1a48f7 135 pc.printf("KL25Z id: 0x%04x %08x %08x\r\n", idRegH, idRegM, idRegL);
loopsva 0:20719c1a48f7 136 uint32_t isSDIR = SIM->SDID;
loopsva 0:20719c1a48f7 137 if(gDebug > 1) pc.printf("CPU type: 0x%08x\r\n Family: %x\r\n SubFamily: %x\r\n Series: %x\r\n SRAM Size: %x\r\n Revision: %x\r\n Die: %02x\r\n Package: %x\r\n",
loopsva 0:20719c1a48f7 138 isSDIR, isSDIR >> 28, (isSDIR >> 24) & 15, (isSDIR >> 20) & 15, (isSDIR >> 16) & 15, (isSDIR >> 12) & 15, (isSDIR >> 7) & 0x3f, (isSDIR >> 0) & 15);
loopsva 0:20719c1a48f7 139 uint32_t isFCFG = SIM->FCFG1;
loopsva 0:20719c1a48f7 140 if(gDebug > 1) pc.printf("Flash size: 0x%08x\r\n Size: %x\r\n", isFCFG, (isFCFG >> 24) & 15);
loopsva 0:20719c1a48f7 141
loopsva 0:20719c1a48f7 142
loopsva 0:20719c1a48f7 143 //check to see if the RTC is operational.
loopsva 0:20719c1a48f7 144 //NOTE: bootloader must be MBED, not FRDMKL25Z. Otherwise pin PTC1 (J10-12) will not have a clock signal for the RTC
loopsva 0:20719c1a48f7 145 if(gDebug) pc.printf("Checking the RTC... ");
loopsva 0:20719c1a48f7 146 wait_ms(1500);
loopsva 0:20719c1a48f7 147 ctTime = time(NULL);
loopsva 0:20719c1a48f7 148 if(gDebug) pc.printf("ctTime: %d StartTime: %d\r\n", ctTime, StartTime);
loopsva 0:20719c1a48f7 149 if((StartTime == ctTime) || (ctTime <= 1000000)) {
loopsva 0:20719c1a48f7 150 pc.printf("*** Local RTC stopped, initializing the RTC. !!CHECK BATTERY!!\r\n");
loopsva 0:20719c1a48f7 151 pc.printf("*** Note: Time is incorrect, needs to be updated!!!\r\n");
loopsva 0:20719c1a48f7 152 set_time(1357000000); //set time to something close, Jan01 2013 00:26:40, but still way off
loopsva 0:20719c1a48f7 153 } else {
loopsva 0:20719c1a48f7 154 if(gDebug) pc.printf("Local RTC is running\r\n");
loopsva 0:20719c1a48f7 155 }
loopsva 0:20719c1a48f7 156 UpdateTime();
loopsva 0:20719c1a48f7 157 StartTime = ctTime;
loopsva 0:20719c1a48f7 158 if(gDebug) pc.printf("Date: %s ", timebuf_dMyy);
loopsva 0:20719c1a48f7 159 if(gDebug) pc.printf("Time: %s \n", timebuf_hms);
loopsva 0:20719c1a48f7 160
loopsva 0:20719c1a48f7 161 //set up the cc3000 paramaters
loopsva 0:20719c1a48f7 162 TSISensor touchSensor;
loopsva 0:20719c1a48f7 163
loopsva 0:20719c1a48f7 164 float accels[3];
loopsva 0:20719c1a48f7 165 float resting,reading;
loopsva 0:20719c1a48f7 166 float THRESHOLD = 0.15;
loopsva 0:20719c1a48f7 167 float position;
loopsva 0:20719c1a48f7 168
loopsva 0:20719c1a48f7 169 wait_ms(500);
loopsva 0:20719c1a48f7 170 acc.getAccAllAxis( accels );
loopsva 0:20719c1a48f7 171 resting = abs(accels[0]) + abs(accels[1]) + abs(accels[2]);
loopsva 0:20719c1a48f7 172 pc.printf("Set up resting accelerometer - %.2f\r\n", resting);
loopsva 0:20719c1a48f7 173 wait_ms(100);
loopsva 0:20719c1a48f7 174 rled = LED_OFF;
loopsva 0:20719c1a48f7 175 gled = LED_OFF;
loopsva 0:20719c1a48f7 176 pc.printf("Ready\r\n");
loopsva 0:20719c1a48f7 177 int bumps = 0;
loopsva 0:20719c1a48f7 178 while(1) {
loopsva 0:20719c1a48f7 179 HouseKeeping();
loopsva 0:20719c1a48f7 180 acc.getAccAllAxis( accels );
loopsva 0:20719c1a48f7 181 reading = abs(accels[0]) + abs(accels[1]) + abs(accels[2]);
loopsva 0:20719c1a48f7 182 if (abs(resting - reading) > THRESHOLD ){
loopsva 0:20719c1a48f7 183 rled = LED_ON;
loopsva 0:20719c1a48f7 184 gled = LED_ON;
loopsva 0:20719c1a48f7 185 wait_ms(100);
loopsva 0:20719c1a48f7 186 bumps++;
loopsva 0:20719c1a48f7 187 position = touchSensor.readPercentage();
loopsva 0:20719c1a48f7 188 //pc.printf( "BUMPED %d times, resting %.2f read %.2f position %.2f \r\n", bumps, resting, reading, position );
loopsva 0:20719c1a48f7 189 //pc.printf("Date: %s ", timebuf_dMyy);
loopsva 0:20719c1a48f7 190 //pc.printf("Time: %s \n", timebuf_hms);
loopsva 0:20719c1a48f7 191 rled = LED_OFF;
loopsva 0:20719c1a48f7 192 wait_ms(200);
loopsva 0:20719c1a48f7 193 gled = LED_OFF;
loopsva 0:20719c1a48f7 194 wait_ms(200);
loopsva 0:20719c1a48f7 195 }
loopsva 0:20719c1a48f7 196
loopsva 0:20719c1a48f7 197 }
loopsva 0:20719c1a48f7 198
loopsva 0:20719c1a48f7 199 }
loopsva 0:20719c1a48f7 200