aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLoek Le Blansch <loek@pipeframe.xyz>2024-06-09 17:01:58 +0200
committerLoek Le Blansch <loek@pipeframe.xyz>2024-06-09 17:01:58 +0200
commit4bdabb2dbf8d523e71f22f994070e99f349c2113 (patch)
tree10b81b3c440e18d3862e78dc2df0d25c4156459d
parent07106fe9b11d09fcdd1525425634739a3e3c4375 (diff)
rp2040 driver send still working (kinda)
-rw-r--r--lib/pbdrv/drv/rp2040/mod.c23
-rw-r--r--main/i2c.c42
-rw-r--r--main/init.c3
3 files changed, 39 insertions, 29 deletions
diff --git a/lib/pbdrv/drv/rp2040/mod.c b/lib/pbdrv/drv/rp2040/mod.c
index 26882f7..b572c4e 100644
--- a/lib/pbdrv/drv/rp2040/mod.c
+++ b/lib/pbdrv/drv/rp2040/mod.c
@@ -11,12 +11,13 @@
#define PBDRV_I2C i2c0
#define BUF_SIZE 256
-// NOTE: this function is called from the I2C ISR, and should return as quickly
-// as possible.
+/**
+ * \note this function is called from the I2C ISR, and should return as quickly
+ * as possible.
+ */
static void recv_event(i2c_inst_t *i2c, i2c_slave_event_t event) {
- uint8_t data[BUF_SIZE];
- size_t size = 0;
- // pbdrv_i2c_recv(NULL, 0);
+ static uint8_t data[BUF_SIZE];
+ static size_t size = 0;
switch (event) {
case I2C_SLAVE_RECEIVE: {
@@ -39,6 +40,18 @@ void pbdrv_setup() {
i2c_slave_init(PBDRV_I2C, PBDRV_MOD_ADDR, &recv_event);
}
+/**
+ * While the RP2040's datasheet claims it supports multi-master configurations
+ * by implementing bus arbitration, it does not natively support a mode where
+ * it is configured as a (multi-)master with a slave address, such that it can
+ * be addressed by other multi-masters. This function includes a hacky
+ * workaround that teporarily sets the RP2040 to I2C master mode to send a
+ * message, and then restores it back to slave mode.
+ *
+ * This approach results in some received frames being (partially) dropped in
+ * the time period between the invocation of this function and the bus becoming
+ * idle (and the message is sent).
+ */
__weak void pbdrv_i2c_send(i2c_addr_t addr, const uint8_t * buf, size_t sz) {
i2c_set_slave_mode(PBDRV_I2C, false, PBDRV_MOD_ADDR);
diff --git a/main/i2c.c b/main/i2c.c
index 5db5b61..d92a93b 100644
--- a/main/i2c.c
+++ b/main/i2c.c
@@ -9,26 +9,26 @@
#include "i2c.h"
#include "pb-mod.h"
-uint8_t* scan_bus(uint8_t *array) {
- int ret;
- int i = 0;
- uint8_t rxdata;
-
- for(int addr = 0; addr < (1<<7); addr++) {
- // ignore reserved addresses
- // These are any addresses of the form 000 0xxx or 111 1xxx
- // ret = i2c_read_blocking(I2C_PORT, addr, &rxdata, 1, false);
-
- // if acknowledged -> ret == number of bytes sent
- if(ret > 0){
- printf("found i2c slave on addr: %d\n", addr);
- array[i] = addr;
- i++;
- }
- }
-
- return array;
-}
+// uint8_t* scan_bus(uint8_t *array) {
+// int ret;
+// int i = 0;
+// uint8_t rxdata;
+//
+// for(int addr = 0; addr < (1<<7); addr++) {
+// // ignore reserved addresses
+// // These are any addresses of the form 000 0xxx or 111 1xxx
+// // ret = i2c_read_blocking(I2C_PORT, addr, &rxdata, 1, false);
+//
+// // if acknowledged -> ret == number of bytes sent
+// if(ret > 0){
+// printf("found i2c slave on addr: %d\n", addr);
+// array[i] = addr;
+// i++;
+// }
+// }
+//
+// return array;
+// }
void bus_task() {
// scan bus for slaves
@@ -40,7 +40,7 @@ void bus_task() {
// init_addr_array(found, MAX_SLAVES);
while (true) {
- vTaskDelay(9 / portTICK_PERIOD_MS);
+ vTaskDelay(10 / portTICK_PERIOD_MS);
pbdrv_i2c_send(0x69, (uint8_t *) "bbbbbbbb", 9);
// i2c_write_blocking(i2c0, 0x69, (uint8_t *) "bbbbbbbb", 9, false);
diff --git a/main/init.c b/main/init.c
index 1cfec9a..bd00c04 100644
--- a/main/init.c
+++ b/main/init.c
@@ -25,8 +25,6 @@ static void init_wifi() {
if (cyw43_arch_wifi_connect_timeout_ms(CFG_NET_SSID, CFG_NET_PASS, CFG_NET_AUTH, CFG_NET_CONN_TIMEOUT))
panic("cyw43_arch_wifi_connect failed\n");
- printf("connected to Wi-Fi\n");
-
// TODO: announce hostname(?)
}
@@ -35,7 +33,6 @@ static void init_i2c() {
gpio_set_function(CFG_SCL_PIN, GPIO_FUNC_I2C);
pbdrv_setup();
- //printf("i2c setup\n");
}
static void async_init() {