add/fix mcp23017 i2c gpio expander functions and tests
Change-Id: Ia2e5a1bf3f97272931014e54e587109297556c03
diff --git a/firmware/libboard/octsimtest/include/i2c.h b/firmware/libboard/octsimtest/include/i2c.h
index 5a8c908..6c94d26 100644
--- a/firmware/libboard/octsimtest/include/i2c.h
+++ b/firmware/libboard/octsimtest/include/i2c.h
@@ -22,7 +22,7 @@
bool i2c_write_byte(bool send_start, bool send_stop, uint8_t byte);
uint8_t i2c_read_byte(bool nack, bool send_stop);
-static void i2c_stop_cond(void);
+void i2c_stop_cond(void);
int eeprom_write_byte(uint8_t slave, uint8_t addr, uint8_t byte);
int eeprom_read_byte(uint8_t slave, uint8_t addr);
diff --git a/firmware/libboard/octsimtest/include/mcp23017.h b/firmware/libboard/octsimtest/include/mcp23017.h
index dea6285..962a1d5 100644
--- a/firmware/libboard/octsimtest/include/mcp23017.h
+++ b/firmware/libboard/octsimtest/include/mcp23017.h
@@ -19,5 +19,7 @@
#define MCP23017_ADDRESS 0x20
int mcp23017_init(uint8_t slave);
+int mcp23017_test(uint8_t slave);
+int mcp23017_toggle(uint8_t slave);
//int mcp23017_write_byte(uint8_t slave, uint8_t addr, uint8_t byte);
//int mcp23017_read_byte(uint8_t slave, uint8_t addr);
diff --git a/firmware/libboard/octsimtest/source/board_octsimtest.c b/firmware/libboard/octsimtest/source/board_octsimtest.c
index 2772015..b7d7245 100644
--- a/firmware/libboard/octsimtest/source/board_octsimtest.c
+++ b/firmware/libboard/octsimtest/source/board_octsimtest.c
@@ -32,12 +32,20 @@
case '?':
printf("\t?\thelp\n\r");
printf("\tR\treset SAM3\n\r");
+ printf("\tm\trun mcp23017 test\n\r");
+ printf("\tR\ttoggle MSB of gpio on mcp23017\n\r");
break;
case 'R':
printf("Asking NVIC to reset us\n\r");
USBD_Disconnect();
NVIC_SystemReset();
break;
+ case 'm':
+ mcp23017_test(MCP23017_ADDRESS);
+ break;
+ case 't':
+ mcp23017_toggle(MCP23017_ADDRESS);
+ break;
default:
printf("Unknown command '%c'\n\r", ch);
break;
@@ -50,7 +58,8 @@
usb_buf_init();
i2c_pin_init();
- mcp23017_init(MCP23017_ADDRESS);
+ if (!mcp23017_init(MCP23017_ADDRESS))
+ printf("mcp23017 not found!\n\r");
/* Initialize checking for card insert/remove events */
//card_present_init();
#endif
diff --git a/firmware/libboard/octsimtest/source/i2c.c b/firmware/libboard/octsimtest/source/i2c.c
index a708704..2cd8423 100644
--- a/firmware/libboard/octsimtest/source/i2c.c
+++ b/firmware/libboard/octsimtest/source/i2c.c
@@ -96,7 +96,7 @@
i2c_started = true;
}
-static void i2c_stop_cond(void)
+void i2c_stop_cond(void)
{
clear_sda();
set_scl();
diff --git a/firmware/libboard/octsimtest/source/mcp23017.c b/firmware/libboard/octsimtest/source/mcp23017.c
index 63390b4..167bf34 100644
--- a/firmware/libboard/octsimtest/source/mcp23017.c
+++ b/firmware/libboard/octsimtest/source/mcp23017.c
@@ -94,13 +94,47 @@
int mcp23017_init(uint8_t slave)
{
- printf("mcp23017_init\n");
+ printf("mcp23017_init\n\r");
// all gpio input
if (mcp23017_write_byte(slave, MCP23017_IODIRA, 0xff))
return false;
- if (mcp23017_write_byte(slave, MCP23017_IODIRB, 0xff))
+ // msb of portb output, rest input
+ if (mcp23017_write_byte(slave, MCP23017_IODIRB, 0x7f))
return false;
- printf("mcp23017 found\n");
+ if (mcp23017_write_byte(slave, MCP23017_IOCONA, 0x20)) //disable SEQOP (autoinc addressing)
+ return false;
+ printf("mcp23017 found\n\r");
return true;
}
+int mcp23017_test(uint8_t slave)
+{
+ printf("mcp23017_test\n\r");
+ printf("GPIOA 0x%x\n\r", mcp23017_read_byte(slave,MCP23017_GPIOA));
+ printf("GPIOB 0x%x\n\r", mcp23017_read_byte(slave,MCP23017_GPIOB));
+ printf("IODIRA 0x%x\n\r", mcp23017_read_byte(slave,MCP23017_IODIRA));
+ printf("IODIRB 0x%x\n\r", mcp23017_read_byte(slave,MCP23017_IODIRB));
+ printf("IOCONA 0x%x\n\r", mcp23017_read_byte(slave,MCP23017_IOCONA));
+ printf("IOCONB 0x%x\n\r", mcp23017_read_byte(slave,MCP23017_IOCONB));
+
+ return 0;
+}
+
+int mcp23017_toggle(uint8_t slave)
+{
+ // example writing MSB of gpio
+ static bool foo=false;
+ if (foo)
+ {
+ printf("+\n\r");
+ mcp23017_write_byte(slave, MCP23017_OLATB, 0x80);
+ foo=false;
+ }
+ else
+ {
+ printf("-\n\r");
+ mcp23017_write_byte(slave, MCP23017_OLATB, 0x00);
+ foo=true;
+ }
+ return 0;
+}