Skip to content

Commit 0dbc260

Browse files
committed
Improved I2CSlave example with code for both Mbed master and slave to test with
1 parent 907ae1b commit 0dbc260

File tree

1 file changed

+80
-26
lines changed

1 file changed

+80
-26
lines changed

drivers/I2CSlave.h

Lines changed: 80 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -34,39 +34,93 @@ namespace mbed {
3434
*
3535
* @note Synchronization level: Not protected
3636
*
37-
* Example Simple I2C responder:
37+
* Example Simple I2C slave and master (requires two Mbed-boards):
3838
* @code
3939
* #include <mbed.h>
40+
* #include <mbed_wait_api.h>
41+
* #include <string.h>
4042
*
41-
* const int SLAVE_ADDRESS = 0xA0;
42-
* const char message[] = "Slave!";
43+
* #define BUILD_I2C_SLAVE 1 // Build for slave or master of this example
4344
*
44-
* I2CSlave slave(I2C_SDA, I2C_SCL);
45+
* #define SLAVE_ADDR 0xA0
46+
* #define BUFFER_SIZE 6
47+
*
48+
* #if BUILD_I2C_SLAVE
49+
*
50+
* #if !DEVICE_I2CSLAVE
51+
* #error [NOT_SUPPORTED] I2C Slave is not supported
52+
* #endif
53+
*
54+
* I2CSlave slave(p3, p4);
55+
*
56+
* int main() {
57+
*
58+
* char buf[BUFFER_SIZE] = "ABCDE";
59+
*
60+
* slave.address(SLAVE_ADDR);
61+
* while (1) {
62+
* int i = slave.receive();
63+
* switch (i) {
64+
* case I2CSlave::ReadAddressed:
65+
* // Write back the buffer from the master
66+
* slave.write(buf, BUFFER_SIZE);
67+
* printf("Written to master (addressed): %s\n", buf);
68+
* break;
69+
* case I2CSlave::WriteGeneral:
70+
* slave.read(buf, BUFFER_SIZE);
71+
* printf("Read from master (general): %s\n", buf);
72+
* break;
73+
* case I2CSlave::WriteAddressed:
74+
* slave.read(buf, BUFFER_SIZE);
75+
* printf("Read from master (addressed): %s\n", buf);
76+
* break;
77+
* }
78+
* }
79+
* }
80+
*
81+
* #else
82+
*
83+
*
84+
*
85+
* I2C master(p3, p4);
86+
*
87+
* static const char* to_send[] = { "abcde", "12345", "EFGHI" };
4588
*
4689
* int main() {
47-
* slave.address(SLAVE_ADDRESS);
48-
* while (1) {
49-
* int operation = slave.receive();
50-
* switch (operation) {
51-
* case I2CSlave::ReadAddressed:
52-
* int status = slave.write(message, sizeof(message));
53-
* if (status == 0) {
54-
* printf("Written message: %s\n", message);
55-
* } else {
56-
* printf("Failed to write message.\n");
57-
* }
58-
* break;
59-
* case I2CSlave::WriteGeneral:
60-
* int byte_read = slave.read();
61-
* printf("Read General: %c (%d)\n", byte_read, byte_read);
62-
* break;
63-
* case I2CSlave::WriteAddressed:
64-
* int byte_read = slave.read();
65-
* printf("Read Addressed: %c (%d)\n", byte_read, byte_read);
66-
* break;
67-
* }
68-
* }
90+
*
91+
* char buf[BUFFER_SIZE];
92+
* int send_index = 0;
93+
94+
* while (1) {
95+
* strcpy(buf, to_send[send_index]);
96+
*
97+
* // Write the new message to the buffer
98+
* if (master.write(SLAVE_ADDR, buf, BUFFER_SIZE)) {
99+
* printf("Failed to write to slave!\n");
100+
* } else {
101+
* printf("Written to slave: %s\n", buf);
102+
* }
103+
*
104+
* // Read what the slave has (should be identical)
105+
* if (master.read(SLAVE_ADDR, buf, BUFFER_SIZE)) {
106+
* printf("Failed to read from slave!\n");
107+
* } else {
108+
* printf("Read from slave: %s\n", buf);
109+
* }
110+
*
111+
* // Change the message we're writing to the slave
112+
* send_index++;
113+
* if (send_index > 2) {
114+
* send_index = 0;
115+
* }
116+
*
117+
* wait_us(500000); // Wait 0.5s
118+
*
119+
* }
69120
* }
121+
*
122+
* #endif
123+
*
70124
* @endcode
71125
*/
72126
class I2CSlave {

0 commit comments

Comments
 (0)