blob: d96951511608d58f6905f463438cb1ff70fe90e5 [file] [log] [blame]
/*
* Copyright (c) 2015 Intel Corporation
*
* SPDX-License-Identifier: Apache-2.0
*/
#include <errno.h>
#include <zephyr.h>
#include <misc/printk.h>
#include <device.h>
#include <i2c.h>
#if defined(CONFIG_SOC_QUARK_SE_C1000_SS)
#define I2C_DEV CONFIG_I2C_SS_0_NAME
#else
#define I2C_DEV CONFIG_I2C_0_NAME
#endif
/**
* @file Sample app using the Fujitsu MB85RC256V FRAM through ARC I2C.
*/
#define FRAM_I2C_ADDR 0x50
static int write_bytes(struct device *i2c_dev, u16_t addr,
u8_t *data, u32_t num_bytes)
{
u8_t wr_addr[2];
struct i2c_msg msgs[2];
/* FRAM address */
wr_addr[0] = (addr >> 8) & 0xFF;
wr_addr[1] = addr & 0xFF;
/* Setup I2C messages */
/* Send the address to write to */
msgs[0].buf = wr_addr;
msgs[0].len = 2;
msgs[0].flags = I2C_MSG_WRITE;
/* Data to be written, and STOP after this. */
msgs[1].buf = data;
msgs[1].len = num_bytes;
msgs[1].flags = I2C_MSG_WRITE | I2C_MSG_STOP;
return i2c_transfer(i2c_dev, &msgs[0], 2, FRAM_I2C_ADDR);
}
static int read_bytes(struct device *i2c_dev, u16_t addr,
u8_t *data, u32_t num_bytes)
{
u8_t wr_addr[2];
struct i2c_msg msgs[2];
/* Now try to read back from FRAM */
/* FRAM address */
wr_addr[0] = (addr >> 8) & 0xFF;
wr_addr[1] = addr & 0xFF;
/* Setup I2C messages */
/* Send the address to read from */
msgs[0].buf = wr_addr;
msgs[0].len = 2;
msgs[0].flags = I2C_MSG_WRITE;
/* Read from device. STOP after this. */
msgs[1].buf = data;
msgs[1].len = num_bytes;
msgs[1].flags = I2C_MSG_READ | I2C_MSG_STOP;
return i2c_transfer(i2c_dev, &msgs[0], 2, FRAM_I2C_ADDR);
}
void main(void)
{
struct device *i2c_dev;
u8_t cmp_data[16];
u8_t data[16];
int i, ret;
i2c_dev = device_get_binding(I2C_DEV);
if (!i2c_dev) {
printk("I2C: Device driver not found.\n");
return;
}
/* Do one-byte read/write */
data[0] = 0xAE;
ret = write_bytes(i2c_dev, 0x00, &data[0], 1);
if (ret) {
printk("Error writing to FRAM! error code (%d)\n", ret);
return;
} else {
printk("Wrote 0xAE to address 0x00.\n");
}
data[0] = 0x86;
ret = write_bytes(i2c_dev, 0x01, &data[0], 1);
if (ret) {
printk("Error writing to FRAM! error code (%d)\n", ret);
return;
} else {
printk("Wrote 0x86 to address 0x01.\n");
}
data[0] = 0x00;
ret = read_bytes(i2c_dev, 0x00, &data[0], 1);
if (ret) {
printk("Error reading from FRAM! error code (%d)\n", ret);
return;
} else {
printk("Read 0x%X from address 0x00.\n", data[0]);
}
data[1] = 0x00;
ret = read_bytes(i2c_dev, 0x01, &data[0], 1);
if (ret) {
printk("Error reading from FRAM! error code (%d)\n", ret);
return;
} else {
printk("Read 0x%X from address 0x01.\n", data[0]);
}
/* Do multi-byte read/write */
/* get some random data, and clear out data[] */
for (i = 0; i < sizeof(cmp_data); i++) {
cmp_data[i] = k_cycle_get_32() & 0xFF;
data[i] = 0x00;
}
/* write them to the FRAM */
ret = write_bytes(i2c_dev, 0x00, cmp_data, sizeof(cmp_data));
if (ret) {
printk("Error writing to FRAM! error code (%d)\n", ret);
return;
} else {
printk("Wrote %zu bytes to address 0x00.\n", sizeof(cmp_data));
}
ret = read_bytes(i2c_dev, 0x00, data, sizeof(data));
if (ret) {
printk("Error reading from FRAM! error code (%d)\n", ret);
return;
} else {
printk("Read %zu bytes from address 0x00.\n", sizeof(data));
}
ret = 0;
for (i = 0; i < sizeof(cmp_data); i++) {
/* uncomment below if you want to see all the bytes */
/* printk("0x%X ?= 0x%X\n", cmp_data[i], data[i]); */
if (cmp_data[i] != data[i]) {
printk("Data comparison failed @ %d.\n", i);
ret = -EIO;
}
}
if (ret == 0) {
printk("Data comparison successful.\n");
}
}