Marco Mayer / Mbed OS Queue
Committer:
demayer
Date:
Sat Mar 28 15:28:19 2020 +0000
Revision:
0:6bf0743ece18
IMU Thread with an event-queue running parallel to handle tasks like a 5 times blinking LED. Button with interrupt detected.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
demayer 0:6bf0743ece18 1 /* mbed Microcontroller Library
demayer 0:6bf0743ece18 2 * Copyright (c) 2015 ARM Limited
demayer 0:6bf0743ece18 3 *
demayer 0:6bf0743ece18 4 * Licensed under the Apache License, Version 2.0 (the "License");
demayer 0:6bf0743ece18 5 * you may not use this file except in compliance with the License.
demayer 0:6bf0743ece18 6 * You may obtain a copy of the License at
demayer 0:6bf0743ece18 7 *
demayer 0:6bf0743ece18 8 * http://www.apache.org/licenses/LICENSE-2.0
demayer 0:6bf0743ece18 9 *
demayer 0:6bf0743ece18 10 * Unless required by applicable law or agreed to in writing, software
demayer 0:6bf0743ece18 11 * distributed under the License is distributed on an "AS IS" BASIS,
demayer 0:6bf0743ece18 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
demayer 0:6bf0743ece18 13 * See the License for the specific language governing permissions and
demayer 0:6bf0743ece18 14 * limitations under the License.
demayer 0:6bf0743ece18 15 */
demayer 0:6bf0743ece18 16 #include <stdio.h>
demayer 0:6bf0743ece18 17 #include "TestHarness.h"
demayer 0:6bf0743ece18 18 #include "mbed.h"
demayer 0:6bf0743ece18 19
demayer 0:6bf0743ece18 20 /* EEPROM 24LC256 Test Unit, to test I2C asynchronous communication.
demayer 0:6bf0743ece18 21 */
demayer 0:6bf0743ece18 22
demayer 0:6bf0743ece18 23 #if !DEVICE_I2C || !DEVICE_I2C_ASYNCH
demayer 0:6bf0743ece18 24 #error i2c_master_eeprom_asynch requires asynch I2C
demayer 0:6bf0743ece18 25 #endif
demayer 0:6bf0743ece18 26
demayer 0:6bf0743ece18 27 #if defined(TARGET_K64F)
demayer 0:6bf0743ece18 28 #define TEST_SDA_PIN PTE25
demayer 0:6bf0743ece18 29 #define TEST_SCL_PIN PTE24
demayer 0:6bf0743ece18 30
demayer 0:6bf0743ece18 31 #elif defined(TARGET_K66F)
demayer 0:6bf0743ece18 32 #define TEST_SDA_PIN PTD9
demayer 0:6bf0743ece18 33 #define TEST_SCL_PIN PTD8
demayer 0:6bf0743ece18 34
demayer 0:6bf0743ece18 35 #elif defined(TARGET_EFM32LG_STK3600) || defined(TARGET_EFM32GG_STK3700) || defined(TARGET_EFM32WG_STK3800)
demayer 0:6bf0743ece18 36 #define TEST_SDA_PIN PD6
demayer 0:6bf0743ece18 37 #define TEST_SCL_PIN PD7
demayer 0:6bf0743ece18 38
demayer 0:6bf0743ece18 39 #elif defined(TARGET_EFM32ZG_STK3200)
demayer 0:6bf0743ece18 40 #define TEST_SDA_PIN PE12
demayer 0:6bf0743ece18 41 #define TEST_SCL_PIN PE13
demayer 0:6bf0743ece18 42
demayer 0:6bf0743ece18 43 #elif defined(TARGET_EFM32HG_STK3400)
demayer 0:6bf0743ece18 44 #define TEST_SDA_PIN PD6
demayer 0:6bf0743ece18 45 #define TEST_SCL_PIN PD7
demayer 0:6bf0743ece18 46
demayer 0:6bf0743ece18 47 #elif defined(TARGET_RZ_A1H)
demayer 0:6bf0743ece18 48 #define TEST_SDA_PIN P1_3
demayer 0:6bf0743ece18 49 #define TEST_SCL_PIN P1_2
demayer 0:6bf0743ece18 50 void sleep()
demayer 0:6bf0743ece18 51 {
demayer 0:6bf0743ece18 52 }
demayer 0:6bf0743ece18 53
demayer 0:6bf0743ece18 54 #else
demayer 0:6bf0743ece18 55 #error Target not supported
demayer 0:6bf0743ece18 56 #endif
demayer 0:6bf0743ece18 57
demayer 0:6bf0743ece18 58 #define PATTERN_MASK 0x66, ~0x66, 0x00, 0xFF, 0xA5, 0x5A, 0xF0, 0x0F
demayer 0:6bf0743ece18 59
demayer 0:6bf0743ece18 60 volatile int why;
demayer 0:6bf0743ece18 61 volatile bool complete;
demayer 0:6bf0743ece18 62 void cbdone(int event) {
demayer 0:6bf0743ece18 63 complete = true;
demayer 0:6bf0743ece18 64 why = event;
demayer 0:6bf0743ece18 65 }
demayer 0:6bf0743ece18 66
demayer 0:6bf0743ece18 67 const unsigned char pattern[] = { PATTERN_MASK };
demayer 0:6bf0743ece18 68
demayer 0:6bf0743ece18 69 TEST_GROUP(I2C_Master_EEPROM_Asynchronous)
demayer 0:6bf0743ece18 70 {
demayer 0:6bf0743ece18 71 I2C *obj;
demayer 0:6bf0743ece18 72 const int eeprom_address = 0xA0;
demayer 0:6bf0743ece18 73 event_callback_t callback;
demayer 0:6bf0743ece18 74
demayer 0:6bf0743ece18 75 void setup() {
demayer 0:6bf0743ece18 76 obj = new I2C(TEST_SDA_PIN, TEST_SCL_PIN);
demayer 0:6bf0743ece18 77 obj->frequency(400000);
demayer 0:6bf0743ece18 78 complete = false;
demayer 0:6bf0743ece18 79 why = 0;
demayer 0:6bf0743ece18 80 callback.attach(cbdone);
demayer 0:6bf0743ece18 81 }
demayer 0:6bf0743ece18 82
demayer 0:6bf0743ece18 83 void teardown() {
demayer 0:6bf0743ece18 84 delete obj;
demayer 0:6bf0743ece18 85 obj = NULL;
demayer 0:6bf0743ece18 86 }
demayer 0:6bf0743ece18 87
demayer 0:6bf0743ece18 88 };
demayer 0:6bf0743ece18 89
demayer 0:6bf0743ece18 90 TEST(I2C_Master_EEPROM_Asynchronous, tx_rx_one_byte_separate_transactions)
demayer 0:6bf0743ece18 91 {
demayer 0:6bf0743ece18 92 int rc;
demayer 0:6bf0743ece18 93 char data[] = { 0, 0, 0x66};
demayer 0:6bf0743ece18 94
demayer 0:6bf0743ece18 95 rc = obj->transfer(eeprom_address, data, sizeof(data), NULL, 0, callback, I2C_EVENT_ALL, false);
demayer 0:6bf0743ece18 96 CHECK_EQUAL(0, rc);
demayer 0:6bf0743ece18 97 while (!complete) {
demayer 0:6bf0743ece18 98 sleep();
demayer 0:6bf0743ece18 99 }
demayer 0:6bf0743ece18 100
demayer 0:6bf0743ece18 101 CHECK_EQUAL(why, I2C_EVENT_TRANSFER_COMPLETE);
demayer 0:6bf0743ece18 102
demayer 0:6bf0743ece18 103 // wait until slave is ready
demayer 0:6bf0743ece18 104 do {
demayer 0:6bf0743ece18 105 complete = 0;
demayer 0:6bf0743ece18 106 why = 0;
demayer 0:6bf0743ece18 107 obj->transfer(eeprom_address, NULL, 0, NULL, 0, callback, I2C_EVENT_ALL, false);
demayer 0:6bf0743ece18 108 while (!complete) {
demayer 0:6bf0743ece18 109 sleep();
demayer 0:6bf0743ece18 110 }
demayer 0:6bf0743ece18 111 } while (why != I2C_EVENT_TRANSFER_COMPLETE);
demayer 0:6bf0743ece18 112
demayer 0:6bf0743ece18 113
demayer 0:6bf0743ece18 114 // write the address for reading (0,0) then start reading data
demayer 0:6bf0743ece18 115 data[0] = 0;
demayer 0:6bf0743ece18 116 data[1] = 0;
demayer 0:6bf0743ece18 117 data[2] = 0;
demayer 0:6bf0743ece18 118 why = 0;
demayer 0:6bf0743ece18 119 complete = 0;
demayer 0:6bf0743ece18 120 obj->transfer(eeprom_address, data, 2, NULL, 0, callback, I2C_EVENT_ALL, true);
demayer 0:6bf0743ece18 121 while (!complete) {
demayer 0:6bf0743ece18 122 sleep();
demayer 0:6bf0743ece18 123 }
demayer 0:6bf0743ece18 124 CHECK_EQUAL(why, I2C_EVENT_TRANSFER_COMPLETE);
demayer 0:6bf0743ece18 125
demayer 0:6bf0743ece18 126 data[0] = 0;
demayer 0:6bf0743ece18 127 data[1] = 0;
demayer 0:6bf0743ece18 128 data[2] = 0;
demayer 0:6bf0743ece18 129 why = 0;
demayer 0:6bf0743ece18 130 complete = 0;
demayer 0:6bf0743ece18 131 rc = obj->transfer(eeprom_address, NULL, 0, data, 1, callback, I2C_EVENT_ALL, false);
demayer 0:6bf0743ece18 132 CHECK_EQUAL(0, rc);
demayer 0:6bf0743ece18 133 while (!complete) {
demayer 0:6bf0743ece18 134 sleep();
demayer 0:6bf0743ece18 135 }
demayer 0:6bf0743ece18 136 CHECK_EQUAL(why, I2C_EVENT_TRANSFER_COMPLETE);
demayer 0:6bf0743ece18 137 CHECK_EQUAL(data[0], 0x66);
demayer 0:6bf0743ece18 138 }
demayer 0:6bf0743ece18 139
demayer 0:6bf0743ece18 140 TEST(I2C_Master_EEPROM_Asynchronous, tx_rx_one_byte_one_transactions)
demayer 0:6bf0743ece18 141 {
demayer 0:6bf0743ece18 142 int rc;
demayer 0:6bf0743ece18 143 char send_data[] = { 0, 0, 0x66};
demayer 0:6bf0743ece18 144 rc = obj->transfer(eeprom_address, send_data, sizeof(send_data), NULL, 0, callback, I2C_EVENT_ALL, false);
demayer 0:6bf0743ece18 145 CHECK_EQUAL(0, rc)
demayer 0:6bf0743ece18 146
demayer 0:6bf0743ece18 147 while (!complete) {
demayer 0:6bf0743ece18 148 sleep();
demayer 0:6bf0743ece18 149 }
demayer 0:6bf0743ece18 150
demayer 0:6bf0743ece18 151 CHECK_EQUAL(why, I2C_EVENT_TRANSFER_COMPLETE);
demayer 0:6bf0743ece18 152
demayer 0:6bf0743ece18 153 // wait until slave is ready
demayer 0:6bf0743ece18 154 do {
demayer 0:6bf0743ece18 155 complete = 0;
demayer 0:6bf0743ece18 156 why = 0;
demayer 0:6bf0743ece18 157 obj->transfer(eeprom_address, NULL, 0, NULL, 0, callback, I2C_EVENT_ALL, false);
demayer 0:6bf0743ece18 158 while (!complete) {
demayer 0:6bf0743ece18 159 sleep();
demayer 0:6bf0743ece18 160 }
demayer 0:6bf0743ece18 161 } while (why != I2C_EVENT_TRANSFER_COMPLETE);
demayer 0:6bf0743ece18 162
demayer 0:6bf0743ece18 163
demayer 0:6bf0743ece18 164 send_data[0] = 0;
demayer 0:6bf0743ece18 165 send_data[1] = 0;
demayer 0:6bf0743ece18 166 send_data[2] = 0;
demayer 0:6bf0743ece18 167 char receive_data[1] = {0};
demayer 0:6bf0743ece18 168 why = 0;
demayer 0:6bf0743ece18 169 complete = 0;
demayer 0:6bf0743ece18 170 rc = obj->transfer(eeprom_address, send_data, 2, receive_data, 1, callback, I2C_EVENT_ALL, false);
demayer 0:6bf0743ece18 171 CHECK_EQUAL(0, rc);
demayer 0:6bf0743ece18 172 while (!complete) {
demayer 0:6bf0743ece18 173 sleep();
demayer 0:6bf0743ece18 174 }
demayer 0:6bf0743ece18 175
demayer 0:6bf0743ece18 176 CHECK_EQUAL(why, I2C_EVENT_TRANSFER_COMPLETE);
demayer 0:6bf0743ece18 177 CHECK_EQUAL(receive_data[0], 0x66);
demayer 0:6bf0743ece18 178 }
demayer 0:6bf0743ece18 179
demayer 0:6bf0743ece18 180 TEST(I2C_Master_EEPROM_Asynchronous, tx_rx_pattern)
demayer 0:6bf0743ece18 181 {
demayer 0:6bf0743ece18 182 int rc;
demayer 0:6bf0743ece18 183 char data[] = { 0, 0, PATTERN_MASK};
demayer 0:6bf0743ece18 184 // write 8 bytes to 0x0, then read them
demayer 0:6bf0743ece18 185 rc = obj->transfer(eeprom_address, data, sizeof(data), NULL, 0, callback, I2C_EVENT_ALL, false);
demayer 0:6bf0743ece18 186 CHECK_EQUAL(0, rc);
demayer 0:6bf0743ece18 187
demayer 0:6bf0743ece18 188 while (!complete) {
demayer 0:6bf0743ece18 189 sleep();
demayer 0:6bf0743ece18 190 }
demayer 0:6bf0743ece18 191 CHECK_EQUAL(why, I2C_EVENT_TRANSFER_COMPLETE);
demayer 0:6bf0743ece18 192
demayer 0:6bf0743ece18 193 // wait until slave is ready
demayer 0:6bf0743ece18 194 do {
demayer 0:6bf0743ece18 195 complete = 0;
demayer 0:6bf0743ece18 196 why = 0;
demayer 0:6bf0743ece18 197 obj->transfer(eeprom_address, NULL, 0, NULL, 0, callback, I2C_EVENT_ALL, false);
demayer 0:6bf0743ece18 198 while (!complete) {
demayer 0:6bf0743ece18 199 sleep();
demayer 0:6bf0743ece18 200 }
demayer 0:6bf0743ece18 201 } while (why != I2C_EVENT_TRANSFER_COMPLETE);
demayer 0:6bf0743ece18 202
demayer 0:6bf0743ece18 203 complete = 0;
demayer 0:6bf0743ece18 204 why = 0;
demayer 0:6bf0743ece18 205 char rec_data[8] = {0};
demayer 0:6bf0743ece18 206 rc = obj->transfer(eeprom_address, rec_data, 2, NULL, 0, callback, I2C_EVENT_ALL, true);
demayer 0:6bf0743ece18 207 CHECK_EQUAL(0, rc);
demayer 0:6bf0743ece18 208 while (!complete) {
demayer 0:6bf0743ece18 209 sleep();
demayer 0:6bf0743ece18 210 }
demayer 0:6bf0743ece18 211 CHECK_EQUAL(why, I2C_EVENT_TRANSFER_COMPLETE);
demayer 0:6bf0743ece18 212
demayer 0:6bf0743ece18 213 complete = 0;
demayer 0:6bf0743ece18 214 why = 0;
demayer 0:6bf0743ece18 215 rc = obj->transfer(eeprom_address, NULL, 0, rec_data, 8, callback, I2C_EVENT_ALL, false);
demayer 0:6bf0743ece18 216 CHECK_EQUAL(0, rc);
demayer 0:6bf0743ece18 217 while (!complete) {
demayer 0:6bf0743ece18 218 sleep();
demayer 0:6bf0743ece18 219 }
demayer 0:6bf0743ece18 220 CHECK_EQUAL(why, I2C_EVENT_TRANSFER_COMPLETE);
demayer 0:6bf0743ece18 221
demayer 0:6bf0743ece18 222 // received buffer match with pattern
demayer 0:6bf0743ece18 223 rc = memcmp(pattern, rec_data, sizeof(rec_data));
demayer 0:6bf0743ece18 224 CHECK_EQUAL(0, rc);
demayer 0:6bf0743ece18 225 }