diff options
Diffstat (limited to 'software/i2c_demo')
-rw-r--r-- | software/i2c_demo/.gitignore | 1 | ||||
-rw-r--r-- | software/i2c_demo/Makefile | 6 | ||||
-rw-r--r-- | software/i2c_demo/i2c_demo.c | 318 |
3 files changed, 0 insertions, 325 deletions
diff --git a/software/i2c_demo/.gitignore b/software/i2c_demo/.gitignore deleted file mode 100644 index 7a8011b..0000000 --- a/software/i2c_demo/.gitignore +++ /dev/null @@ -1 +0,0 @@ -i2c_demo diff --git a/software/i2c_demo/Makefile b/software/i2c_demo/Makefile deleted file mode 100644 index ef29ef2..0000000 --- a/software/i2c_demo/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -TARGET = i2c_demo -C_SRCS += i2c_demo.c -CFLAGS += -O2 -fno-builtin-printf - -BSP_BASE = ../../bsp -include $(BSP_BASE)/env/common.mk diff --git a/software/i2c_demo/i2c_demo.c b/software/i2c_demo/i2c_demo.c deleted file mode 100644 index 4011c09..0000000 --- a/software/i2c_demo/i2c_demo.c +++ /dev/null @@ -1,318 +0,0 @@ -#include <stdio.h> -#include <stdlib.h> -#include "platform.h" -#include <string.h> -#include <unistd.h> -#include <math.h> -#include "stdatomic.h" - -#define MPU6050_ADDR 0x68 - -#define MPU6050_RA_ACCEL_XOUT_H 0x3B -#define MPU6050_RA_ACCEL_XOUT_L 0x3C -#define MPU6050_RA_ACCEL_YOUT_H 0x3D -#define MPU6050_RA_ACCEL_YOUT_L 0x3E -#define MPU6050_RA_ACCEL_ZOUT_H 0x3F -#define MPU6050_RA_ACCEL_ZOUT_L 0x40 -#define MPU6050_RA_TEMP_OUT_H 0x41 -#define MPU6050_RA_TEMP_OUT_L 0x42 -#define MPU6050_RA_GYRO_XOUT_H 0x43 -#define MPU6050_RA_GYRO_XOUT_L 0x44 -#define MPU6050_RA_GYRO_YOUT_H 0x45 -#define MPU6050_RA_GYRO_YOUT_L 0x46 -#define MPU6050_RA_GYRO_ZOUT_H 0x47 -#define MPU6050_RA_GYRO_ZOUT_L 0x48 -#define MPU6050_RA_PWR_MGMT_1 0x6B -#define MPU6050_RA_WHO_AM_I 0x75 - -#define SDA PIN_8_OFFSET -#define SCL PIN_9_OFFSET - -#define LONG 25 // Equals ~400KHz -#define SHORT 5 - -//busy wait for the specified time -void wait_ms(uint64_t ms) { - static const uint64_t ms_tick = RTC_FREQ/1000; - volatile uint64_t * mtime = (uint64_t*) (CLINT_CTRL_ADDR + CLINT_MTIME); - uint64_t then = (ms_tick * ms) + *mtime; - while(*mtime<then); -} - -inline void delay_number_of_nop(uint32_t count) -{ - for(volatile uint32_t j = 0; j < count; j++) - { - asm("nop"); - } -} - -_Bool i2c_busy(void) -{ - GPIO_REG(GPIO_INPUT_EN) |= ((0x1 << SCL) | (0x1 << SDA)); - GPIO_REG(GPIO_OUTPUT_EN) &= ~((0x1 << SCL) | (0x1 << SDA)); - return (GPIO_REG(GPIO_INPUT_VAL) & ((0x1 << SCL) | (0x1 << SDA))) != ((0x1 << SCL) | (0x1 << SDA)); -} - -void i2c_start(void) -{ - GPIO_REG(GPIO_INPUT_EN) &= ~((0x1 << SDA) | (0x1 << SCL)); - - GPIO_REG(GPIO_OUTPUT_VAL) &= ~(0x1 << SDA); - GPIO_REG(GPIO_OUTPUT_EN) |= (0x1 << SDA); - delay_number_of_nop(SHORT); - GPIO_REG(GPIO_OUTPUT_VAL) &= ~(0x1 << SCL); - GPIO_REG(GPIO_OUTPUT_EN) |= (0x1 << SCL); -} - -void i2c_repeated_start(void) -{ - delay_number_of_nop(SHORT); - GPIO_REG(GPIO_OUTPUT_VAL) |= (0x1 << SCL); - GPIO_REG(GPIO_OUTPUT_EN) |= (0x1 << SCL); - delay_number_of_nop(SHORT); - i2c_start(); -} - - -void i2c_stop(void) -{ - GPIO_REG(GPIO_INPUT_EN) |= (0x1 << SCL); - GPIO_REG(GPIO_OUTPUT_EN) &= ~(0x1 << SCL); - delay_number_of_nop(SHORT); - GPIO_REG(GPIO_INPUT_EN) |= (0x1 << SDA); - GPIO_REG(GPIO_OUTPUT_EN) &= ~(0x1 << SDA); -} - -void i2c_init(void) -{ - //GPIO_REG(GPIO_IOF_EN) &= ((0x1 << SCL) | (0x1 << SDA)); - GPIO_REG(GPIO_OUTPUT_EN) &= ~((0x1 << SCL) | (0x1 << SDA)); - GPIO_REG(GPIO_PULLUP_EN) |= ((0x1 << SDA) | (0x1 << SCL)); - GPIO_REG(GPIO_INPUT_EN) |= (0x1 << SDA) | (0x1 << SCL); -} - -void i2c_send_bytes_rs(uint8_t* data, uint8_t size, _Bool rs, uint8_t* data_r, uint8_t size_r) -{ - uint8_t address_r = data[0] | 0x01; - - for(uint8_t ii=0; ii<size; ii++) - { - GPIO_REG(GPIO_INPUT_EN) &= ~(0x1 << SDA); - GPIO_REG(GPIO_OUTPUT_EN) |= (0x1 << SDA); - for(uint8_t i=0; i<9; i++) - { - delay_number_of_nop(SHORT); - - if(i != 8) - { - if(data[ii] & 0x80) - GPIO_REG(GPIO_OUTPUT_VAL) |= (0x1 << SDA); - else - GPIO_REG(GPIO_OUTPUT_VAL) &= ~(0x1 << SDA); - } - else - { - GPIO_REG(GPIO_INPUT_EN) |= (0x1 << SDA); - GPIO_REG(GPIO_OUTPUT_EN) &= ~(0x1 << SDA); - if((GPIO_REG(GPIO_INPUT_VAL) & (0x1 << SDA)) != 0x0) - { - printf("NO ACK\n"); - } - - GPIO_REG(GPIO_INPUT_EN) &= ~(0x1 << SDA); - GPIO_REG(GPIO_OUTPUT_EN) |= (0x1 << SDA); - if(rs == 0) - { - GPIO_REG(GPIO_OUTPUT_VAL) &= ~(0x1 << SDA); - } - else - { - GPIO_REG(GPIO_OUTPUT_VAL) |= (0x1 << SDA); - } - - } - delay_number_of_nop(LONG-SHORT); - - GPIO_REG(GPIO_OUTPUT_VAL) |= (0x1 << SCL); - - delay_number_of_nop(LONG); - - GPIO_REG(GPIO_OUTPUT_VAL) &= ~(0x1 << SCL); - - data[ii] <<= 1; - } - } - - if(rs == 0) - return; - - GPIO_REG(GPIO_OUTPUT_VAL) |= (0x1 << SCL); - - delay_number_of_nop(SHORT); - - GPIO_REG(GPIO_OUTPUT_VAL) &= ~(0x1 << SDA); - - delay_number_of_nop(SHORT); - - GPIO_REG(GPIO_OUTPUT_VAL) &= ~(0x1 << SCL); - - for(uint8_t i=0; i<9; i++) - { - delay_number_of_nop(SHORT); - if(i != 8) - { - if(address_r & 0x80) - GPIO_REG(GPIO_OUTPUT_VAL) |= (0x1 << SDA); - else - GPIO_REG(GPIO_OUTPUT_VAL) &= ~(0x1 << SDA); - } - else - { - GPIO_REG(GPIO_INPUT_EN) |= (0x1 << SDA); - GPIO_REG(GPIO_OUTPUT_EN) &= ~(0x1 << SDA); - if((GPIO_REG(GPIO_INPUT_VAL) & (0x1 << SDA)) != 0x0) - { - printf("NO ACK\n"); - } - } - delay_number_of_nop(LONG-SHORT); - - GPIO_REG(GPIO_OUTPUT_VAL) |= (0x1 << SCL); - - delay_number_of_nop(LONG); - - GPIO_REG(GPIO_OUTPUT_VAL) &= ~(0x1 << SCL); - - address_r <<= 1; - } - - // Receive Data - for(uint8_t ii=0; ii<size_r; ii++) - { - for(uint8_t i=0; i<9; i++) - { - GPIO_REG(GPIO_OUTPUT_VAL) |= (0x1 << SCL); - - if(i!=8) - data_r[ii] <<= 1; - - delay_number_of_nop(SHORT); - - if(i!=8) - { - if((GPIO_REG(GPIO_INPUT_VAL) & (0x1 << SDA)) != 0x0) - { - data_r[ii] |= 0x1; - } - } - else if(ii == (size_r-1)) - { - GPIO_REG(GPIO_INPUT_EN) &= ~(0x1 << SDA); - GPIO_REG(GPIO_OUTPUT_EN) |= (0x1 << SDA); - GPIO_REG(GPIO_OUTPUT_VAL) &= ~(0x1 << SDA); - } else { - - } - - delay_number_of_nop(LONG-SHORT); - - GPIO_REG(GPIO_OUTPUT_VAL) &= ~(0x1 << SCL); - - if((i==7) && (ii != (size_r-1))){ - GPIO_REG(GPIO_INPUT_EN) &= ~(0x1 << SDA); - GPIO_REG(GPIO_OUTPUT_EN) |= (0x1 << SDA); - GPIO_REG(GPIO_OUTPUT_VAL) &= ~(0x1 << SDA); - } - delay_number_of_nop(LONG); - - } - - if(ii != (size_r-1)){ - GPIO_REG(GPIO_INPUT_EN) |= (0x1 << SDA); - GPIO_REG(GPIO_OUTPUT_EN) &= ~(0x1 << SDA); - delay_number_of_nop(SHORT); - } - } -} - -void write_byte(uint8_t address, uint8_t reg_addr, uint8_t val) -{ - uint8_t temp[3]; - uint8_t data; - temp[0]=address<<1; - temp[1]=reg_addr; - temp[2]=val; - while(i2c_busy()); - i2c_start(); - i2c_send_bytes_rs(temp, sizeof(temp), 0, &data, 1); - i2c_stop(); -} - -uint8_t read_byte(uint8_t address, uint8_t reg_addr) -{ - uint8_t temp[2]; - uint8_t data; - temp[0]=address<<1; - temp[1]=reg_addr; - while(i2c_busy()); - i2c_start(); - i2c_send_bytes_rs(temp, sizeof(temp), 1, &data, 1); - i2c_stop(); - return data; -} - -void read_bytes(uint8_t address, uint8_t reg_addr, uint8_t* data, uint8_t size) -{ - uint8_t temp[2]; - temp[0]=address<<1; - temp[1]=reg_addr; - while(i2c_busy()); - i2c_start(); - i2c_send_bytes_rs(temp, sizeof(temp), 1, data, size); - i2c_stop(); -} - -int main(int argc, char **argv) -{ - uint8_t data; - uint8_t accel[6]; - - printf("BIT-BANG I2C DEMO with MPU-6050 IMU\n"); - - i2c_init(); - - printf("Power Management 1: 0x%02X\n", read_byte(MPU6050_ADDR, MPU6050_RA_PWR_MGMT_1)); - write_byte(MPU6050_ADDR, MPU6050_RA_PWR_MGMT_1, 0x80); - - wait_ms(10); - - printf("Power Management 1: 0x%02X\n", read_byte(MPU6050_ADDR, MPU6050_RA_PWR_MGMT_1)); - write_byte(MPU6050_ADDR, MPU6050_RA_PWR_MGMT_1, 0x00); - - printf("CHIP_ID: 0x%02X\n", read_byte(MPU6050_ADDR, MPU6050_RA_WHO_AM_I)); - printf("DONE\n"); - - while(1) - { - //for(uint8_t i=0; i<6; i++){ - // accel[i]=read_byte(MPU6050_ADDR, 0x3B+i); - //} - read_bytes(MPU6050_ADDR, 0x3B, accel, 6); - int16_t x_accel = (accel[0]<<8)+accel[1]; - int16_t y_accel = (accel[2]<<8)+accel[3]; - int16_t z_accel = (accel[4]<<8)+accel[5]; - - float z_g = z_accel; - z_g = z_g/16384.0; - int32_t z_g_int = z_g*100; - z_g_int = abs(z_g_int); - printf("Gravity in Z %d.%d\n", z_g_int/100, z_g_int%100); - - //printf("X: %06d, Y: %06d, Z: %06d\n", x_accel, y_accel, z_accel); - - wait_ms(100); - } - - return 0; -} |