From f3c07a5c8b6e8f621bc1489a1bce4f8535bd9273 Mon Sep 17 00:00:00 2001 From: William Clark Date: Thu, 21 Dec 2023 20:52:17 +0000 Subject: [PATCH] i2c --- Makefile | 5 +++- i2c.c | 71 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ i2c.h | 14 +++++++++++ lis3dh.c | 17 +++++++++++--- main.c | 10 ++++++++ 5 files changed, 113 insertions(+), 4 deletions(-) create mode 100644 i2c.c create mode 100644 i2c.h diff --git a/Makefile b/Makefile index 7742941..bc6143d 100644 --- a/Makefile +++ b/Makefile @@ -1,4 +1,7 @@ CC=gcc CFLAGS=-O2 -std=gnu99 -W -Werror -Wall -Wextra -I. all: - $(CC) $(CFLAGS) main.c lis3dh.c -o main \ No newline at end of file + $(CC) $(CFLAGS) main.c i2c.c lis3dh.c -o main + +clean: + rm -rf main \ No newline at end of file diff --git a/i2c.c b/i2c.c new file mode 100644 index 0000000..7b97f58 --- /dev/null +++ b/i2c.c @@ -0,0 +1,71 @@ +/* + +Example I2C use on linux/raspberry pi + +*/ + +#include +#include +#include +#include +#include +#include +#include +#include + +#include "i2c.h" + +#define I2C_DEVICE "/dev/i2c-1" +#define I2C_LIS3DH_ADDRESS 0x18 + +static int fd; + +int i2c_init(void) { + fd = open(I2C_DEVICE, O_RDWR); + if (fd < 0) { + fprintf(stderr, "could not open device: %s\n", I2C_DEVICE); + return I2C_ERR; + } + + if (ioctl(fd, I2C_SLAVE, I2C_LIS3DH_ADDRESS) < 0) { + fprintf(stderr, "failed to acquire bus/talk to slave\n"); + close(fd); + return I2C_ERR; + } + + return I2C_OK; +} + + +int i2c_read(uint8_t reg, uint8_t *dst, uint32_t size) { + uint8_t cmd[2] = {reg, 0x00}; + write(fd, cmd, 2); + + if (read(fd, dst, size) != (ssize_t)size) { + fprintf(stderr, "error read()\n"); + return I2C_ERR; + + } + + return I2C_OK; +} + + +int i2c_write(uint8_t reg, uint8_t value) { + uint8_t cmd[2] = {reg, value}; + + if (write(fd, cmd, 2) != 2) { + fprintf(stderr, "error write()\n"); + return I2C_ERR; + } + + return I2C_OK; +} + +int i2c_deinit(void) { + if (fd) { + close(fd); + } + + return I2C_OK; +} diff --git a/i2c.h b/i2c.h new file mode 100644 index 0000000..14f0680 --- /dev/null +++ b/i2c.h @@ -0,0 +1,14 @@ +#ifndef I2C_H +#define I2C_H + +#include + +#define I2C_OK 0 +#define I2C_ERR 1 + +int i2c_init (void); +int i2c_read (uint8_t reg, uint8_t *dst, uint32_t size); +int i2c_write (uint8_t reg, uint8_t value); +int i2c_deinit (void); + +#endif \ No newline at end of file diff --git a/lis3dh.c b/lis3dh.c index 232e90c..ecbaaa7 100644 --- a/lis3dh.c +++ b/lis3dh.c @@ -1,11 +1,22 @@ +#include #include "lis3dh.h" +#include "registers.h" int lis3dh_init(lis3dh_t *lis3dh) { - lis3dh->cfg.rate = 0; - return 0; + uint8_t result; + int err = 0; + + lis3dh->dev.init(); + + err |= lis3dh->dev.read(REG_WHO_AM_I, &result, 1); + if (result != 0x33) { + err |= 1; + } + + return err; } int lis3dh_deinit(lis3dh_t *lis3dh) { - lis3dh->cfg.rate = 0; + lis3dh->dev.deinit(); return 0; } \ No newline at end of file diff --git a/main.c b/main.c index 1d774fb..86aa63c 100644 --- a/main.c +++ b/main.c @@ -1,10 +1,20 @@ +#define _GNU_SOURCE #include +#include #include "lis3dh.h" +#include "i2c.h" int main() { lis3dh_t lis; + lis.dev.init = i2c_init; + lis.dev.read = i2c_read; + lis.dev.write = i2c_write; + lis.dev.sleep = usleep; + lis.dev.deinit = i2c_deinit; + + if (!lis3dh_init(&lis)) { puts("OK"); }