aboutsummaryrefslogtreecommitdiff
path: root/software/main/iic.cpp
diff options
context:
space:
mode:
authorMDC Service <michael.schmid@mdc-service.de>2022-05-23 11:17:34 +0200
committerGitHub <noreply@github.com>2022-05-23 11:17:34 +0200
commit74a0003fea4087de8e9f03b6f828c45d255bcd4a (patch)
tree1b4615232dcac918fcc47cbd3c6ed54014fb38b7 /software/main/iic.cpp
parentd2f3c7c9e17895ae43caed761f941a30e4e5eed6 (diff)
initial check in firmware files
Diffstat (limited to 'software/main/iic.cpp')
-rw-r--r--software/main/iic.cpp174
1 files changed, 174 insertions, 0 deletions
diff --git a/software/main/iic.cpp b/software/main/iic.cpp
new file mode 100644
index 0000000..ac74818
--- /dev/null
+++ b/software/main/iic.cpp
@@ -0,0 +1,174 @@
+/*
+ * iic.cpp
+ *
+ * Created on: 26.02.2022
+ * Author: steffen
+ */
+
+#include "iic.h"
+
+esp_err_t I2C_read(uint8_t slave_addr, uint8_t reg_addr, uint8_t *data, uint8_t len) {
+ return i2c_master_write_read_device(I2C_MASTER_NUM, slave_addr, &reg_addr, 1, data, 2, I2C_MASTER_TIMEOUT_MS / portTICK_PERIOD_MS);
+}
+esp_err_t I2C_register_write_byte(uint8_t slave_addr, uint8_t reg_addr, uint8_t data) {
+ uint8_t write_buf[2] = { reg_addr, data };
+ return i2c_master_write_to_device(I2C_MASTER_NUM, slave_addr, write_buf, sizeof(write_buf), I2C_MASTER_TIMEOUT_MS / portTICK_PERIOD_MS);
+}
+esp_err_t I2C_init(void) {
+ int res1,res2;
+ int I2C_master_port = I2C_MASTER_NUM;
+ i2c_config_t I2C_conf = { .mode = I2C_MODE_MASTER, .sda_io_num = I2C_MASTER_SDA_IO, .scl_io_num = I2C_MASTER_SCL_IO, .sda_pullup_en = GPIO_PULLUP_ENABLE, .scl_pullup_en = GPIO_PULLUP_ENABLE, .master { .clk_speed = I2C_MASTER_FREQ_HZ, } };
+ i2c_param_config(I2C_master_port, &I2C_conf);
+ res1=i2c_driver_install(I2C_master_port, I2C_conf.mode,
+ I2C_MASTER_RX_BUF_DISABLE, I2C_MASTER_TX_BUF_DISABLE, 0);
+
+ I2C_buf[0] = 0x7F; // write data to output port 1
+ I2C_buf[1] = 0x00; // write data to output port 1
+ res1 = i2c_master_write_to_device(I2C_MASTER_NUM, I2C_PORTEXP1, I2C_buf, 2, I2C_MASTER_TIMEOUT_MS / portTICK_PERIOD_MS);
+ res2 = i2c_master_write_to_device(I2C_MASTER_NUM, I2C_PORTEXP2, I2C_buf, 2, I2C_MASTER_TIMEOUT_MS / portTICK_PERIOD_MS);
+ printf("\nMaster wrote %d %d %02X\n", res1,res2,I2C_buf[0]);
+
+ I2C_buf[0] = 0x02; // write data to output port 1
+ I2C_buf[1] = 0xFF; // write data to output port 1
+ I2C_buf[2] = 0xFF; // write data to output port 1
+ I2C_buf[3] = 0x00; // write data to output port 1
+ I2C_buf[4] = 0x00; // write data to output port 1
+ res1 = i2c_master_write_to_device(I2C_MASTER_NUM, I2C_PORTEXP1, I2C_buf, 5, I2C_MASTER_TIMEOUT_MS / portTICK_PERIOD_MS);
+ res2 = i2c_master_write_to_device(I2C_MASTER_NUM, I2C_PORTEXP2, I2C_buf, 5, I2C_MASTER_TIMEOUT_MS / portTICK_PERIOD_MS);
+ printf("\nMaster wrote %d %d %02X\n", res1,res2,I2C_buf[0]);
+
+ I2C_buf[0] = 0x11; // write data to output port 1
+ I2C_buf[1] = 0x10; // write data to output port 1
+ res1 = i2c_master_write_to_device(I2C_MASTER_NUM, I2C_PORTEXP1, I2C_buf, 2, I2C_MASTER_TIMEOUT_MS / portTICK_PERIOD_MS);
+ res2 = i2c_master_write_to_device(I2C_MASTER_NUM, I2C_PORTEXP2, I2C_buf, 2, I2C_MASTER_TIMEOUT_MS / portTICK_PERIOD_MS);
+ printf("\nMaster wrote %d %d %02X\n", res1,res2,I2C_buf[0]);
+
+
+
+ // printf("\nI2C wrote 0x%02X%02X: %d\n", I2C_buf[0], I2C_buf[1], res1);
+// I2C_buf[0] = 0x00; // lese 3 bytes
+// res2 = i2c_master_read_from_device(I2C_MASTER_NUM, I2C_PORTEXP1, I2C_buf, 1, I2C_MASTER_TIMEOUT_MS / portTICK_PERIOD_MS);
+
+
+ /*
+ I2C_buf[0] = 0x8C; // write config port 0 with auto inc
+ I2C_buf[1] = 0xFF; // Port 0 Input
+ I2C_buf[2] = 0x00; // Port 1 Output
+ I2C_buf[3] = 0xFF; // Port 2 Input
+ res = i2c_master_write_to_device(I2C_MASTER_NUM, I2C_PORTEXP1, I2C_buf, 4, I2C_MASTER_TIMEOUT_MS / portTICK_PERIOD_MS);
+ printf("\nMaster wrote %02X %02X: %d\n", I2C_buf[0], I2C_buf[1], res);
+
+ I2C_buf[0] = 0x05; // write data to output port 1
+ I2C_buf[1] = 0x00;
+ res = i2c_master_write_to_device(I2C_MASTER_NUM, I2C_PORTEXP1, I2C_buf, 2, I2C_MASTER_TIMEOUT_MS / portTICK_PERIOD_MS);
+ printf("\nMaster wrote %02X %02X: %d\n", I2C_buf[0], I2C_buf[1], res);
+*/
+ return res1;
+}
+esp_err_t ADC_init(void) {
+ int res;
+
+ I2C_buf[0] = 0x01; // -> config register
+ I2C_buf[1] = 0x40; // 0 100 000 0 A0-GND +-6.144 CONT
+ I2C_buf[2] = 0x0; // O00 0 0 0 11 8 SPS no comp
+ res = i2c_master_write_to_device(I2C_MASTER_NUM, ADC_DEFAULT_IIC_ADDR, I2C_buf, 3, I2C_MASTER_TIMEOUT_MS / portTICK_PERIOD_MS);
+ printf("\nMaster wrote %02X %02X: %d\n", I2C_buf[0], I2C_buf[1], res);
+ return res;
+}
+int ADCReadAll(void) {
+// for i in range(ADC_CHAN_NUM):
+// data=self.bus.read_i2c_block_data(self.addr,REG_RAW_DATA_START+i,2)
+// val=data[1]<<8|data[0]
+// array.append(val)
+ int res1=0,res2,i;
+ I2C_buf[0] = 0x00; // conversion register
+ I2C_buf[1] = 0x00;
+ I2C_buf[2] = 0x00;
+ res1 = i2c_master_write_to_device(I2C_MASTER_NUM, ADC_DEFAULT_IIC_ADDR, I2C_buf, 1, I2C_MASTER_TIMEOUT_MS / portTICK_PERIOD_MS);
+// printf("\nI2C wrote 0x%02X: %d\n", I2C_buf[0], res1);
+
+ for (i=0;i<256;i++) {
+ res2 = i2c_master_read_from_device(I2C_MASTER_NUM, ADC_DEFAULT_IIC_ADDR, I2C_buf, 2, I2C_MASTER_TIMEOUT_MS / portTICK_PERIOD_MS);
+ printf("I2C read %02x -> ",i);
+// for (i=0;i<4;i++) {
+ printf(" %02X %02X ",I2C_buf[0],I2C_buf[1]);
+// }
+ printf(" %d\n", res2);
+ }
+// printf(" #:S%d R:%d ", res1, res2);
+ fflush(stdout);
+
+ return res1;
+}
+int DoorIsClosed(int doormask) {
+ int res1,res2;
+ I2C_buf[0] = 0x80; // Setze CMD read port 0
+ I2C_buf[1] = 0x00;
+ I2C_buf[2] = 0x00;
+ res1 = i2c_master_write_to_device(I2C_MASTER_NUM, I2C_PORTEXP1, I2C_buf, 1, I2C_MASTER_TIMEOUT_MS / portTICK_PERIOD_MS);
+// printf("\nI2C wrote 0x%02X%02X: %d\n", I2C_buf[0], I2C_buf[1], res1);
+ I2C_buf[0] = 0x00; // lese 3 bytes
+ res2 = i2c_master_read_from_device(I2C_MASTER_NUM, I2C_PORTEXP1, I2C_buf, 3, I2C_MASTER_TIMEOUT_MS / portTICK_PERIOD_MS);
+// printf("\nI2C read 0x %02X %02X %02X: %d\n", I2C_buf[0], I2C_buf[1], I2C_buf[2], res2);
+ printf(" #:S%d R:%d ", res1, res2);
+ fflush(stdout);
+ // Open 0x0F = 0000 1111
+ // 1 closed 0x0B = 0000 1011
+ // 2 closed 0x0E = 0000 1110
+ // 3 closed 0x0D = 0000 1101
+ // 4 closed 0x07 = 0000 0111
+ if ((I2C_buf[LOCKR_PORT] & doormask)==0) {
+ return 1;
+ } else {
+ return 0;
+ }
+
+}
+int DoorOpen(int door) {
+ int mask=0;
+ int maskr=0;
+ int res;
+ int to=10;
+ switch (door) { // we allow only one door to open
+ case 1: {
+ mask = LOCK1;
+ maskr= LOCK1R;
+ } break;
+ case 2: {
+ mask = LOCK2;
+ maskr= LOCK2R;
+ } break;
+ case 3: {
+ mask = LOCK3;
+ maskr= LOCK3R;
+ } break;
+ default: {
+ mask = LOCK4;
+ maskr= LOCK4R;
+ }
+ }
+
+ I2C_buf[0] = 0x05;
+ I2C_buf[1] = mask;
+ printf("\nMASTER wrote %02X %02X\n", I2C_buf[0], I2C_buf[1]);fflush(stdout);
+ res = i2c_master_write_to_device(I2C_MASTER_NUM, I2C_PORTEXP1, I2C_buf, 2, I2C_MASTER_TIMEOUT_MS / portTICK_PERIOD_MS);
+ printf("\nI2C wrote 0x%02X%02X: %d\n", I2C_buf[0], I2C_buf[1], res);fflush(stdout);
+ while (to>0) {
+ if (DoorIsClosed(maskr)==0) {
+ to=0;
+ } else {
+ to--;
+ vTaskDelay(1);
+ }
+ }
+ I2C_buf[0] = 0x05;
+ I2C_buf[1] = 0x00;
+ printf("\nMASTER wrote 0x%02X%02X\n", I2C_buf[0], I2C_buf[1]);fflush(stdout);
+ res = i2c_master_write_to_device(I2C_MASTER_NUM, I2C_PORTEXP1, I2C_buf, 2, I2C_MASTER_TIMEOUT_MS / portTICK_PERIOD_MS);
+ printf("\nI2C wrote 0x%02X%02X: %d\n", I2C_buf[0], I2C_buf[1], res);
+
+ return 0;
+}
+
+
+