mirror of https://github.com/ARMmbed/mbed-os.git
222 lines
5.5 KiB
C++
222 lines
5.5 KiB
C++
/* mbed Microcontroller Library
|
|
* Copyright (c) 2015 ARM Limited
|
|
*
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*/
|
|
#include <stdio.h>
|
|
#include "TestHarness.h"
|
|
#include "mbed.h"
|
|
|
|
/* EEPROM 24LC256 Test Unit, to test I2C asynchronous communication.
|
|
*/
|
|
|
|
#if !DEVICE_I2C || !DEVICE_I2C_ASYNCH
|
|
#error i2c_master_eeprom_asynch requires asynch I2C
|
|
#endif
|
|
|
|
#if defined(TARGET_K64F)
|
|
#define TEST_SDA_PIN PTE25
|
|
#define TEST_SCL_PIN PTE24
|
|
|
|
#elif defined(TARGET_EFM32LG_STK3600) || defined(TARGET_EFM32GG_STK3700) || defined(TARGET_EFM32WG_STK3800)
|
|
#define TEST_SDA_PIN PD6
|
|
#define TEST_SCL_PIN PD7
|
|
|
|
#elif defined(TARGET_EFM32ZG_STK3200)
|
|
#define TEST_SDA_PIN PE12
|
|
#define TEST_SCL_PIN PE13
|
|
|
|
#elif defined(TARGET_EFM32HG_STK3400)
|
|
#define TEST_SDA_PIN PD6
|
|
#define TEST_SCL_PIN PD7
|
|
|
|
#elif defined(TARGET_RZ_A1H)
|
|
#define TEST_SDA_PIN P1_3
|
|
#define TEST_SCL_PIN P1_2
|
|
void sleep()
|
|
{
|
|
}
|
|
|
|
#else
|
|
#error Target not supported
|
|
#endif
|
|
|
|
#define PATTERN_MASK 0x66, ~0x66, 0x00, 0xFF, 0xA5, 0x5A, 0xF0, 0x0F
|
|
|
|
volatile int why;
|
|
volatile bool complete;
|
|
void cbdone(int event) {
|
|
complete = true;
|
|
why = event;
|
|
}
|
|
|
|
const unsigned char pattern[] = { PATTERN_MASK };
|
|
|
|
TEST_GROUP(I2C_Master_EEPROM_Asynchronous)
|
|
{
|
|
I2C *obj;
|
|
const int eeprom_address = 0xA0;
|
|
event_callback_t callback;
|
|
|
|
void setup() {
|
|
obj = new I2C(TEST_SDA_PIN, TEST_SCL_PIN);
|
|
obj->frequency(400000);
|
|
complete = false;
|
|
why = 0;
|
|
callback.attach(cbdone);
|
|
}
|
|
|
|
void teardown() {
|
|
delete obj;
|
|
obj = NULL;
|
|
}
|
|
|
|
};
|
|
|
|
TEST(I2C_Master_EEPROM_Asynchronous, tx_rx_one_byte_separate_transactions)
|
|
{
|
|
int rc;
|
|
char data[] = { 0, 0, 0x66};
|
|
|
|
rc = obj->transfer(eeprom_address, data, sizeof(data), NULL, 0, callback, I2C_EVENT_ALL, false);
|
|
CHECK_EQUAL(0, rc);
|
|
while (!complete) {
|
|
sleep();
|
|
}
|
|
|
|
CHECK_EQUAL(why, I2C_EVENT_TRANSFER_COMPLETE);
|
|
|
|
// wait until slave is ready
|
|
do {
|
|
complete = 0;
|
|
why = 0;
|
|
obj->transfer(eeprom_address, NULL, 0, NULL, 0, callback, I2C_EVENT_ALL, false);
|
|
while (!complete) {
|
|
sleep();
|
|
}
|
|
} while (why != I2C_EVENT_TRANSFER_COMPLETE);
|
|
|
|
|
|
// write the address for reading (0,0) then start reading data
|
|
data[0] = 0;
|
|
data[1] = 0;
|
|
data[2] = 0;
|
|
why = 0;
|
|
complete = 0;
|
|
obj->transfer(eeprom_address, data, 2, NULL, 0, callback, I2C_EVENT_ALL, true);
|
|
while (!complete) {
|
|
sleep();
|
|
}
|
|
CHECK_EQUAL(why, I2C_EVENT_TRANSFER_COMPLETE);
|
|
|
|
data[0] = 0;
|
|
data[1] = 0;
|
|
data[2] = 0;
|
|
why = 0;
|
|
complete = 0;
|
|
rc = obj->transfer(eeprom_address, NULL, 0, data, 1, callback, I2C_EVENT_ALL, false);
|
|
CHECK_EQUAL(0, rc);
|
|
while (!complete) {
|
|
sleep();
|
|
}
|
|
CHECK_EQUAL(why, I2C_EVENT_TRANSFER_COMPLETE);
|
|
CHECK_EQUAL(data[0], 0x66);
|
|
}
|
|
|
|
TEST(I2C_Master_EEPROM_Asynchronous, tx_rx_one_byte_one_transactions)
|
|
{
|
|
int rc;
|
|
char send_data[] = { 0, 0, 0x66};
|
|
rc = obj->transfer(eeprom_address, send_data, sizeof(send_data), NULL, 0, callback, I2C_EVENT_ALL, false);
|
|
CHECK_EQUAL(0, rc)
|
|
|
|
while (!complete) {
|
|
sleep();
|
|
}
|
|
|
|
CHECK_EQUAL(why, I2C_EVENT_TRANSFER_COMPLETE);
|
|
|
|
// wait until slave is ready
|
|
do {
|
|
complete = 0;
|
|
why = 0;
|
|
obj->transfer(eeprom_address, NULL, 0, NULL, 0, callback, I2C_EVENT_ALL, false);
|
|
while (!complete) {
|
|
sleep();
|
|
}
|
|
} while (why != I2C_EVENT_TRANSFER_COMPLETE);
|
|
|
|
|
|
send_data[0] = 0;
|
|
send_data[1] = 0;
|
|
send_data[2] = 0;
|
|
char receive_data[1] = {0};
|
|
why = 0;
|
|
complete = 0;
|
|
rc = obj->transfer(eeprom_address, send_data, 2, receive_data, 1, callback, I2C_EVENT_ALL, false);
|
|
CHECK_EQUAL(0, rc);
|
|
while (!complete) {
|
|
sleep();
|
|
}
|
|
|
|
CHECK_EQUAL(why, I2C_EVENT_TRANSFER_COMPLETE);
|
|
CHECK_EQUAL(receive_data[0], 0x66);
|
|
}
|
|
|
|
TEST(I2C_Master_EEPROM_Asynchronous, tx_rx_pattern)
|
|
{
|
|
int rc;
|
|
char data[] = { 0, 0, PATTERN_MASK};
|
|
// write 8 bytes to 0x0, then read them
|
|
rc = obj->transfer(eeprom_address, data, sizeof(data), NULL, 0, callback, I2C_EVENT_ALL, false);
|
|
CHECK_EQUAL(0, rc);
|
|
|
|
while (!complete) {
|
|
sleep();
|
|
}
|
|
CHECK_EQUAL(why, I2C_EVENT_TRANSFER_COMPLETE);
|
|
|
|
// wait until slave is ready
|
|
do {
|
|
complete = 0;
|
|
why = 0;
|
|
obj->transfer(eeprom_address, NULL, 0, NULL, 0, callback, I2C_EVENT_ALL, false);
|
|
while (!complete) {
|
|
sleep();
|
|
}
|
|
} while (why != I2C_EVENT_TRANSFER_COMPLETE);
|
|
|
|
complete = 0;
|
|
why = 0;
|
|
char rec_data[8] = {0};
|
|
rc = obj->transfer(eeprom_address, rec_data, 2, NULL, 0, callback, I2C_EVENT_ALL, true);
|
|
CHECK_EQUAL(0, rc);
|
|
while (!complete) {
|
|
sleep();
|
|
}
|
|
CHECK_EQUAL(why, I2C_EVENT_TRANSFER_COMPLETE);
|
|
|
|
complete = 0;
|
|
why = 0;
|
|
rc = obj->transfer(eeprom_address, NULL, 0, rec_data, 8, callback, I2C_EVENT_ALL, false);
|
|
CHECK_EQUAL(0, rc);
|
|
while (!complete) {
|
|
sleep();
|
|
}
|
|
CHECK_EQUAL(why, I2C_EVENT_TRANSFER_COMPLETE);
|
|
|
|
// received buffer match with pattern
|
|
rc = memcmp(pattern, rec_data, sizeof(rec_data));
|
|
CHECK_EQUAL(0, rc);
|
|
}
|