Skip to content
Snippets Groups Projects
Commit e7d83d76 authored by Václav Jelínek's avatar Václav Jelínek
Browse files

Update multicube i2c master and slave menu programs

parent a90c9ea5
No related branches found
No related tags found
No related merge requests found
Pipeline #124376 canceled
......@@ -16,30 +16,26 @@ class I2C_master:
self.i2c = I2C(id=0,scl=Pin(UTZ_I2C_SCK_PIN),
sda=Pin(UTZ_I2C_SDA_PIN), freq=I2C_MULTICUBE_FREQ)
def read(self, add, len=10):
def read(self, slave_add, len=1, mem_add=None):
self.data_received = None
try:
self.data_received = self.i2c.readfrom(add, len)
if mem_add:
self.data_received = self.i2c.readfrom_mem(slave_add, mem_add, len)
else:
self.data_received = self.i2c.readfrom(slave_add, len)
finally:
return self.data_received
def write(self, add, message):
def write(self, add, message, mem_add=None):
self.data_sending = message
try:
self.i2c.writeto(add, message)
if mem_add:
self.i2c.writeto_mem(add, mem_add, message)
else:
self.i2c.writeto(add, message)
except Exception as e:
return False
return True
def write_general(self, message):
try:
self.i2c.writeto(self.general_add, message)
except:
return False
return True
def get_general_add(self):
return self.general_add
def deinit(self):
self.i2c = None
......
from machine import Pin, I2C, Timer
from time import sleep, ticks_ms
from lib.cube import Buzzer, I2CGuard, SH1106_I2C, Esp, I2C_master, I2C_slave
from lib.cube import Buzzer, I2CGuard, SH1106_I2C, Esp, I2C_master
from lib import nxt, ev3, OC
from lib.hw_defs.ports import SENSOR_PORT_PINS, MOTOR_PORT_PINS
......@@ -122,7 +122,7 @@ class Robot:
gyro_irq_pin.irq(handler=None)
def init_i2c_master(self):
if isinstance(self.i2c_master, EmptyObject):
if isinstance(self.i2c_master, EmptyObject) and isinstance(self.i2c_slave, EmptyObject):
self.i2c_master = I2C_master(self.buttons)
def deinit_i2c_master(self):
......@@ -131,8 +131,8 @@ class Robot:
self.i2c_master = EmptyObject()
def init_i2c_slave(self, address):
if isinstance(self.i2c_slave, EmptyObject):
self.i2c_slave = I2C_slave(slaveAddress=address)
if isinstance(self.i2c_slave, EmptyObject) and isinstance(self.i2c_master, EmptyObject):
self.i2c_slave = brick_ll.I2C_slave(address=address)
def deinit_i2c_slave(self):
if not isinstance(self.i2c_slave, EmptyObject):
......
......@@ -40,8 +40,8 @@ def i2c_master_run(robot):
robot.display.draw_arrow(84, 61, robot.display.DOWN, 1)
robot.display.show()
robot.i2c_master.write(ADDRESS, (data_sending + ASCII_a).to_bytes(1, 'big'))
data_received = robot.i2c_master.read(ADDRESS, 1)
robot.i2c_master.write(ADDRESS, (data_sending + ASCII_a).to_bytes(1, 'big'), mem_add=1)
data_received = robot.i2c_master.read(ADDRESS, 1, mem_add=2)
if data_received and data_received != b'\x00':
data_received_parsed = int.from_bytes(data_received, 'big')
......
......@@ -28,14 +28,12 @@ def i2c_slave_run(robot):
robot.display.draw_arrow(74, 56, robot.display.UP, 1)
robot.display.draw_arrow(84, 61, robot.display.DOWN, 1)
robot.display.show()
data_received = robot.i2c_slave.read()
data_received = robot.i2c_slave.read(1)
if data_received:
print(data_received)
data_show = data_received
robot.i2c_slave.write(data_sending + ASCII_a)
buttons = robot.buttons.pressed_since()
if buttons[Button.LEFT]:
break
......@@ -43,10 +41,12 @@ def i2c_slave_run(robot):
if buttons[Button.UP]:
data_sending -= 1
data_sending = data_sending % 26
robot.i2c_slave.write(2, data_sending + ASCII_a)
debounce = True
if buttons[Button.DOWN]:
data_sending += 1
data_sending = data_sending % 26
robot.i2c_slave.write(2, data_sending + ASCII_a)
debounce = True
if not buttons[Button.UP] and not buttons[Button.DOWN]:
......
......@@ -70,7 +70,7 @@ static void oc_i2c_slave_handler(i2c_inst_t *i2c, i2c_slave_event_t event) {
// save into memory
oc_i2c_slave_obj.context.mem[oc_i2c_slave_obj.context.mem_address] = i2c_read_byte_raw(i2c);
oc_i2c_slave_obj.context.mem_address++;
oc_i2c_slave_obj.mp_irq_flags |= OC_I2C_SLAVE_RECEIVE;
oc_i2c_slave_obj.mp_irq_flags = OC_I2C_SLAVE_RECEIVE;
}
break;
......@@ -78,7 +78,7 @@ static void oc_i2c_slave_handler(i2c_inst_t *i2c, i2c_slave_event_t event) {
// load from memory
i2c_write_byte_raw(i2c, oc_i2c_slave_obj.context.mem[oc_i2c_slave_obj.context.mem_address]);
oc_i2c_slave_obj.context.mem_address++;
oc_i2c_slave_obj.mp_irq_flags |= OC_I2C_SLAVE_READ;
oc_i2c_slave_obj.mp_irq_flags = OC_I2C_SLAVE_READ;
break;
case I2C_SLAVE_FINISH: // master has signalled Stop / Restart
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment