I2C master and slave testing example
i2c_3200.cpp@0:0c4c8f8e3e04, 2015-08-14 (annotated)
- Committer:
- Yunfeng
- Date:
- Fri Aug 14 15:00:28 2015 +0000
- Revision:
- 0:0c4c8f8e3e04
initial commit for I2C master and slave test
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
Yunfeng | 0:0c4c8f8e3e04 | 1 | #include "fw_config.h" |
Yunfeng | 0:0c4c8f8e3e04 | 2 | #if SEL_I2C_3200_TEST == 1 |
Yunfeng | 0:0c4c8f8e3e04 | 3 | |
Yunfeng | 0:0c4c8f8e3e04 | 4 | #include "mbed.h" |
Yunfeng | 0:0c4c8f8e3e04 | 5 | #if SEL_I2C_SLAVE_MODE == 1 |
Yunfeng | 0:0c4c8f8e3e04 | 6 | |
Yunfeng | 0:0c4c8f8e3e04 | 7 | #else |
Yunfeng | 0:0c4c8f8e3e04 | 8 | |
Yunfeng | 0:0c4c8f8e3e04 | 9 | #endif |
Yunfeng | 0:0c4c8f8e3e04 | 10 | |
Yunfeng | 0:0c4c8f8e3e04 | 11 | DigitalOut pin07 (P0_20); |
Yunfeng | 0:0c4c8f8e3e04 | 12 | DigitalOut pin12 (P0_21); |
Yunfeng | 0:0c4c8f8e3e04 | 13 | DigitalOut pin21 (P0_11); |
Yunfeng | 0:0c4c8f8e3e04 | 14 | |
Yunfeng | 0:0c4c8f8e3e04 | 15 | #if SEL_I2C_SLAVE_MODE == 1 |
Yunfeng | 0:0c4c8f8e3e04 | 16 | void i2c_3200 () { |
Yunfeng | 0:0c4c8f8e3e04 | 17 | |
Yunfeng | 0:0c4c8f8e3e04 | 18 | I2CSlave slave(P0_5 , P0_4); |
Yunfeng | 0:0c4c8f8e3e04 | 19 | // indicate enter |
Yunfeng | 0:0c4c8f8e3e04 | 20 | volatile int d = 0; |
Yunfeng | 0:0c4c8f8e3e04 | 21 | for (int i = 0; i < 5; i++) { |
Yunfeng | 0:0c4c8f8e3e04 | 22 | d = d > 0? 0:1; |
Yunfeng | 0:0c4c8f8e3e04 | 23 | pin07 = d; |
Yunfeng | 0:0c4c8f8e3e04 | 24 | pin12 = d; |
Yunfeng | 0:0c4c8f8e3e04 | 25 | pin21 = d; |
Yunfeng | 0:0c4c8f8e3e04 | 26 | wait(1); |
Yunfeng | 0:0c4c8f8e3e04 | 27 | } |
Yunfeng | 0:0c4c8f8e3e04 | 28 | pin07 = 1; |
Yunfeng | 0:0c4c8f8e3e04 | 29 | pin12 = 1; |
Yunfeng | 0:0c4c8f8e3e04 | 30 | pin21 = 1; |
Yunfeng | 0:0c4c8f8e3e04 | 31 | //while (1); |
Yunfeng | 0:0c4c8f8e3e04 | 32 | |
Yunfeng | 0:0c4c8f8e3e04 | 33 | |
Yunfeng | 0:0c4c8f8e3e04 | 34 | slave.address(0x60); |
Yunfeng | 0:0c4c8f8e3e04 | 35 | char buf[2]; |
Yunfeng | 0:0c4c8f8e3e04 | 36 | |
Yunfeng | 0:0c4c8f8e3e04 | 37 | while (1) { |
Yunfeng | 0:0c4c8f8e3e04 | 38 | int i = slave.receive(); |
Yunfeng | 0:0c4c8f8e3e04 | 39 | switch (i) { |
Yunfeng | 0:0c4c8f8e3e04 | 40 | case I2CSlave::ReadAddressed: |
Yunfeng | 0:0c4c8f8e3e04 | 41 | buf[1] = 'Z'; |
Yunfeng | 0:0c4c8f8e3e04 | 42 | slave.write(buf, 1); // Includes null char |
Yunfeng | 0:0c4c8f8e3e04 | 43 | pin07 = 0; |
Yunfeng | 0:0c4c8f8e3e04 | 44 | pin12 = 1; |
Yunfeng | 0:0c4c8f8e3e04 | 45 | pin21 = 1; |
Yunfeng | 0:0c4c8f8e3e04 | 46 | break; |
Yunfeng | 0:0c4c8f8e3e04 | 47 | case I2CSlave::WriteGeneral: |
Yunfeng | 0:0c4c8f8e3e04 | 48 | slave.read(buf, 10); |
Yunfeng | 0:0c4c8f8e3e04 | 49 | pin12 = 0; |
Yunfeng | 0:0c4c8f8e3e04 | 50 | pin07 = 1; |
Yunfeng | 0:0c4c8f8e3e04 | 51 | pin21 = 1; |
Yunfeng | 0:0c4c8f8e3e04 | 52 | printf("Read G: \n"); |
Yunfeng | 0:0c4c8f8e3e04 | 53 | break; |
Yunfeng | 0:0c4c8f8e3e04 | 54 | case I2CSlave::WriteAddressed: |
Yunfeng | 0:0c4c8f8e3e04 | 55 | slave.read(buf, 1); |
Yunfeng | 0:0c4c8f8e3e04 | 56 | pin21 = 0; |
Yunfeng | 0:0c4c8f8e3e04 | 57 | pin07 = 1; |
Yunfeng | 0:0c4c8f8e3e04 | 58 | pin12 = 1; |
Yunfeng | 0:0c4c8f8e3e04 | 59 | if (buf[0] != 0xaa) { |
Yunfeng | 0:0c4c8f8e3e04 | 60 | pin07 = 0; |
Yunfeng | 0:0c4c8f8e3e04 | 61 | } |
Yunfeng | 0:0c4c8f8e3e04 | 62 | wait(0.3); |
Yunfeng | 0:0c4c8f8e3e04 | 63 | pin21 = 1; |
Yunfeng | 0:0c4c8f8e3e04 | 64 | printf("Read A: %x, %x\n", buf[0], buf[1]); |
Yunfeng | 0:0c4c8f8e3e04 | 65 | break; |
Yunfeng | 0:0c4c8f8e3e04 | 66 | } |
Yunfeng | 0:0c4c8f8e3e04 | 67 | //for(int i = 0; i < 10; i++) buf[i] = 0; // Clear buffer |
Yunfeng | 0:0c4c8f8e3e04 | 68 | } |
Yunfeng | 0:0c4c8f8e3e04 | 69 | } |
Yunfeng | 0:0c4c8f8e3e04 | 70 | #else |
Yunfeng | 0:0c4c8f8e3e04 | 71 | void i2c_3200_master () { |
Yunfeng | 0:0c4c8f8e3e04 | 72 | volatile int d = 0; |
Yunfeng | 0:0c4c8f8e3e04 | 73 | for (int i = 0; i < 10; i++) { |
Yunfeng | 0:0c4c8f8e3e04 | 74 | d = d > 0? 0:1; |
Yunfeng | 0:0c4c8f8e3e04 | 75 | pin07 = d; |
Yunfeng | 0:0c4c8f8e3e04 | 76 | pin12 = d; |
Yunfeng | 0:0c4c8f8e3e04 | 77 | pin21 = d; |
Yunfeng | 0:0c4c8f8e3e04 | 78 | wait(1); |
Yunfeng | 0:0c4c8f8e3e04 | 79 | } |
Yunfeng | 0:0c4c8f8e3e04 | 80 | pin07 = 1; |
Yunfeng | 0:0c4c8f8e3e04 | 81 | pin12 = 1; |
Yunfeng | 0:0c4c8f8e3e04 | 82 | pin21 = 1; |
Yunfeng | 0:0c4c8f8e3e04 | 83 | I2C master(P0_5 , P0_4); |
Yunfeng | 0:0c4c8f8e3e04 | 84 | char cmd[2]; |
Yunfeng | 0:0c4c8f8e3e04 | 85 | int err; |
Yunfeng | 0:0c4c8f8e3e04 | 86 | master.frequency(400000); |
Yunfeng | 0:0c4c8f8e3e04 | 87 | while (1) { |
Yunfeng | 0:0c4c8f8e3e04 | 88 | cmd[0] = 0xAA; |
Yunfeng | 0:0c4c8f8e3e04 | 89 | //cmd[1] = 0x01; |
Yunfeng | 0:0c4c8f8e3e04 | 90 | err = master.write(0x60, cmd, 1); |
Yunfeng | 0:0c4c8f8e3e04 | 91 | if (err) pin07 = 0; |
Yunfeng | 0:0c4c8f8e3e04 | 92 | wait(0.5); |
Yunfeng | 0:0c4c8f8e3e04 | 93 | |
Yunfeng | 0:0c4c8f8e3e04 | 94 | cmd[0] = 0xAA; |
Yunfeng | 0:0c4c8f8e3e04 | 95 | //cmd[1] = 0x80; |
Yunfeng | 0:0c4c8f8e3e04 | 96 | err = master.write(0x60, cmd, 1); |
Yunfeng | 0:0c4c8f8e3e04 | 97 | if (err) pin12 = 0; |
Yunfeng | 0:0c4c8f8e3e04 | 98 | wait(0.5); |
Yunfeng | 0:0c4c8f8e3e04 | 99 | //slave.read(addr, cmd, 2); |
Yunfeng | 0:0c4c8f8e3e04 | 100 | |
Yunfeng | 0:0c4c8f8e3e04 | 101 | //float tmp = (float((cmd[0]<<8)|cmd[1]) / 256.0); |
Yunfeng | 0:0c4c8f8e3e04 | 102 | //printf("Temp = %.2f\n", tmp); |
Yunfeng | 0:0c4c8f8e3e04 | 103 | } |
Yunfeng | 0:0c4c8f8e3e04 | 104 | } |
Yunfeng | 0:0c4c8f8e3e04 | 105 | #endif |
Yunfeng | 0:0c4c8f8e3e04 | 106 | |
Yunfeng | 0:0c4c8f8e3e04 | 107 | #endif |