From 8cf7265f8fae6f94b17c5d78ed41e52b22e2b218 Mon Sep 17 00:00:00 2001
From: James Churchill <pelrun@gmail.com>
Date: Wed, 23 Jan 2019 02:57:13 +1000
Subject: Rename i2c_slave functions so it can coexist with i2c_master (#4875)

Also merges tx/rx buffers, as only one is necessary.
---
 drivers/avr/i2c_slave.c | 25 ++++++++++++++-----------
 drivers/avr/i2c_slave.h | 13 ++++---------
 2 files changed, 18 insertions(+), 20 deletions(-)

(limited to 'drivers')

diff --git a/drivers/avr/i2c_slave.c b/drivers/avr/i2c_slave.c
index 27696ca01..18a29a45a 100755
--- a/drivers/avr/i2c_slave.c
+++ b/drivers/avr/i2c_slave.c
@@ -9,23 +9,26 @@
 
 #include "i2c_slave.h"
 
-void i2c_init(uint8_t address){
+volatile uint8_t i2c_slave_reg[I2C_SLAVE_REG_COUNT];
+
+static volatile uint8_t buffer_address;
+static volatile bool slave_has_register_set = false;
+
+void i2c_slave_init(uint8_t address){
     // load address into TWI address register
     TWAR = (address << 1);
     // set the TWCR to enable address matching and enable TWI, clear TWINT, enable TWI interrupt
     TWCR = (1 << TWIE) | (1 << TWEA) | (1 << TWINT) | (1 << TWEN);
 }
 
-void i2c_stop(void){
+void i2c_slave_stop(void){
     // clear acknowledge and enable bits
     TWCR &= ~((1 << TWEA) | (1 << TWEN));
 }
 
 ISR(TWI_vect){
     uint8_t ack = 1;
-    // temporary stores the received data
-    //uint8_t data;
-    
+
     switch(TW_STATUS){
         case TW_SR_SLA_ACK:
             // The device is now a slave receiver
@@ -38,13 +41,13 @@ ISR(TWI_vect){
             if(!slave_has_register_set){
                 buffer_address = TWDR;
 
-                if (buffer_address >= RX_BUFFER_SIZE){ // address out of bounds dont ack
-                    ack = 0;
-                    buffer_address = 0;
+                if (buffer_address >= I2C_SLAVE_REG_COUNT) {  // address out of bounds dont ack
+                  ack            = 0;
+                  buffer_address = 0;
                 }
                 slave_has_register_set = true; // address has been receaved now fill in buffer
             } else {
-                rxbuffer[buffer_address] = TWDR;
+                i2c_slave_reg[buffer_address] = TWDR;
                 buffer_address++;
             }
             break;
@@ -52,7 +55,7 @@ ISR(TWI_vect){
         case TW_ST_SLA_ACK:
         case TW_ST_DATA_ACK:
             // This device is a slave transmitter and master has requested data
-            TWDR = txbuffer[buffer_address];
+            TWDR = i2c_slave_reg[buffer_address];
             buffer_address++;
             break;
 
@@ -63,6 +66,6 @@ ISR(TWI_vect){
             break;
     }
 
-    // Reset i2c state mahcine to be ready for next interrupt
+    // Reset i2c state machine to be ready for next interrupt
     TWCR |= (1 << TWIE) | (1 << TWINT) | (ack << TWEA) | (1 << TWEN);
 }
\ No newline at end of file
diff --git a/drivers/avr/i2c_slave.h b/drivers/avr/i2c_slave.h
index 1c3b9ecc0..7b5dcbdc3 100755
--- a/drivers/avr/i2c_slave.h
+++ b/drivers/avr/i2c_slave.h
@@ -8,16 +8,11 @@
 #ifndef I2C_SLAVE_H
 #define I2C_SLAVE_H
 
-#define TX_BUFFER_SIZE 30
-#define RX_BUFFER_SIZE 30
+#define I2C_SLAVE_REG_COUNT 30
 
-volatile uint8_t buffer_address;
-static volatile bool slave_has_register_set = false;
-volatile uint8_t txbuffer[TX_BUFFER_SIZE];
-volatile uint8_t rxbuffer[RX_BUFFER_SIZE];
+extern volatile uint8_t i2c_slave_reg[I2C_SLAVE_REG_COUNT];
 
-void i2c_init(uint8_t address);
-void i2c_stop(void);
-ISR(TWI_vect);
+void i2c_slave_init(uint8_t address);
+void i2c_slave_stop(void);
 
 #endif // I2C_SLAVE_H
\ No newline at end of file
-- 
cgit v1.2.3