Skip to content

Commit ac78598

Browse files
committed
add wire style wrapper for i2c
1 parent 7bf65d2 commit ac78598

File tree

6 files changed

+313
-47
lines changed

6 files changed

+313
-47
lines changed
Lines changed: 33 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -1,53 +1,49 @@
11
#include <SoftI2C.h>
22

33
void setup() {
4-
scl_pin = 30; //extern variable in SoftI2C.h
5-
sda_pin = 31;
6-
I2CInit();
4+
//pass SCL and SDA pins
5+
Wire_begin(30, 31);
76
}
87

98
void loop() {
109

11-
uint8_t ack_bit, readData1, readData2;
12-
13-
USBSerial_println("\nDump first 8 bytes of 24C32 on 0x50 addr:");
14-
USBSerial_flush();
15-
I2CStart();
16-
ack_bit = I2CSend(0x50 << 1 | 1); //last bit is r(1)/w(0).
17-
I2CStop();
10+
if (!Wire_scan(0x50)) {
11+
USBSerial_println("No response from 0x50");
12+
USBSerial_flush();
13+
} else {
14+
USBSerial_println("\nDump first 8 bytes of 24C32 on 0x50 addr:");
15+
USBSerial_flush();
1816

19-
if (ack_bit == 0) {
20-
for (uint8_t i = 0; i < 8; i += 2) {
21-
I2CStart();
22-
ack_bit = I2CSend(0x50 << 1 | 0); //last bit is r(1)/w(0).
23-
if (ack_bit != 0) break;
24-
ack_bit = I2CSend(0); //high EEPROM addr
25-
if (ack_bit != 0) break;
26-
ack_bit = I2CSend(i); //low EEPROM addr
27-
if (ack_bit != 0) break;
28-
I2CRestart();
29-
ack_bit = I2CSend(0x50 << 1 | 1); //last bit is r(1)/w(0).
30-
if (ack_bit != 0) break;
31-
readData1 = I2CRead();
32-
I2CAck();
33-
readData2 = I2CRead();
34-
I2CNak();
35-
I2CStop();
36-
USBSerial_print("Get 2 bytes start from addr ");
17+
uint8_t readData[8];
18+
bool success;
19+
//read 1 byte from 0x50 addr 0
20+
success = Wire_readRegister16bitAddr(0x50, 0, readData, 1);
21+
if (success) {
22+
USBSerial_print("Get 1 byte from addr 0: ");
23+
USBSerial_println(readData[0], HEX);
3724
USBSerial_flush();
38-
USBSerial_print(i, HEX);
39-
USBSerial_print(": ");
40-
USBSerial_print(readData1, HEX);
41-
USBSerial_print(", ");
42-
USBSerial_println(readData2, HEX);
25+
} else {
26+
USBSerial_println("No response from 0x50");
4327
USBSerial_flush();
4428
}
4529

46-
} else {
47-
USBSerial_println("No response from 0x50");
48-
USBSerial_flush();
30+
if (success) {
31+
//read 7 bytes from 0x50 addr 1
32+
success = Wire_readRegister16bitAddr(0x50, 1, readData, 7);
33+
if (success) {
34+
USBSerial_println("Get 8 bytes from addr 1:");
35+
for (uint8_t i = 0; i < 7; i++) {
36+
USBSerial_print(readData[i], HEX);
37+
USBSerial_print(" ");
38+
}
39+
USBSerial_println("");
40+
USBSerial_flush();
41+
} else {
42+
USBSerial_println("No response from 0x50");
43+
USBSerial_flush();
44+
}
45+
}
4946
}
5047

5148
delay(1000);
52-
5349
}
Lines changed: 143 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,143 @@
1+
#include <SoftI2C.h>
2+
3+
//tested on Adafruit 4-Digit 7-Segment LED Matrix Display FeatherWing
4+
#define HT16K33_ADDR 0x70
5+
const uint8_t sevensegfonttable[];
6+
7+
void setup() {
8+
//pass SCL and SDA
9+
Wire_begin(30, 31);
10+
// Initialize the display
11+
uint8_t init_data[1];
12+
// Turn on oscillator
13+
init_data[0] = 0x21;
14+
Wire_writeBytes(HT16K33_ADDR, init_data, 1);
15+
// Turn brightness to max
16+
init_data[0] = 0xEF;
17+
Wire_writeBytes(HT16K33_ADDR, init_data, 1);
18+
// Turn display on
19+
init_data[0] = 0x81;
20+
Wire_writeBytes(HT16K33_ADDR, init_data, 1);
21+
}
22+
23+
void loop() {
24+
// Display milliseconds
25+
uint16_t ms = millis();
26+
uint8_t digit1 = (ms / 1000) % 10;
27+
ms = ms % 1000;
28+
uint8_t digit2 = ms / 100;
29+
ms = ms % 100;
30+
uint8_t digit3 = ms / 10;
31+
ms = ms % 10;
32+
uint8_t digit4 = ms;
33+
34+
uint8_t displayData[11];
35+
memset(displayData, 0, 11);
36+
displayData[0] = 0x00;
37+
displayData[1] = sevensegfonttable[digit1 + '0' - 32];
38+
displayData[3] = sevensegfonttable[digit2 + '0' - 32];
39+
displayData[7] = sevensegfonttable[digit3 + '0' - 32];
40+
displayData[9] = sevensegfonttable[digit4 + '0' - 32];
41+
Wire_writeBytes(HT16K33_ADDR, displayData, 11);
42+
}
43+
44+
45+
const uint8_t sevensegfonttable[] = {
46+
47+
0b00000000, // (space)
48+
0b10000110, // !
49+
0b00100010, // "
50+
0b01111110, // #
51+
0b01101101, // $
52+
0b11010010, // %
53+
0b01000110, // &
54+
0b00100000, // '
55+
0b00101001, // (
56+
0b00001011, // )
57+
0b00100001, // *
58+
0b01110000, // +
59+
0b00010000, // ,
60+
0b01000000, // -
61+
0b10000000, // .
62+
0b01010010, // /
63+
0b00111111, // 0
64+
0b00000110, // 1
65+
0b01011011, // 2
66+
0b01001111, // 3
67+
0b01100110, // 4
68+
0b01101101, // 5
69+
0b01111101, // 6
70+
0b00000111, // 7
71+
0b01111111, // 8
72+
0b01101111, // 9
73+
0b00001001, // :
74+
0b00001101, // ;
75+
0b01100001, // <
76+
0b01001000, // =
77+
0b01000011, // >
78+
0b11010011, // ?
79+
0b01011111, // @
80+
0b01110111, // A
81+
0b01111100, // B
82+
0b00111001, // C
83+
0b01011110, // D
84+
0b01111001, // E
85+
0b01110001, // F
86+
0b00111101, // G
87+
0b01110110, // H
88+
0b00110000, // I
89+
0b00011110, // J
90+
0b01110101, // K
91+
0b00111000, // L
92+
0b00010101, // M
93+
0b00110111, // N
94+
0b00111111, // O
95+
0b01110011, // P
96+
0b01101011, // Q
97+
0b00110011, // R
98+
0b01101101, // S
99+
0b01111000, // T
100+
0b00111110, // U
101+
0b00111110, // V
102+
0b00101010, // W
103+
0b01110110, // X
104+
0b01101110, // Y
105+
0b01011011, // Z
106+
0b00111001, // [
107+
0b01100100, //
108+
0b00001111, // ]
109+
0b00100011, // ^
110+
0b00001000, // _
111+
0b00000010, // `
112+
0b01011111, // a
113+
0b01111100, // b
114+
0b01011000, // c
115+
0b01011110, // d
116+
0b01111011, // e
117+
0b01110001, // f
118+
0b01101111, // g
119+
0b01110100, // h
120+
0b00010000, // i
121+
0b00001100, // j
122+
0b01110101, // k
123+
0b00110000, // l
124+
0b00010100, // m
125+
0b01010100, // n
126+
0b01011100, // o
127+
0b01110011, // p
128+
0b01100111, // q
129+
0b01010000, // r
130+
0b01101101, // s
131+
0b01111000, // t
132+
0b00011100, // u
133+
0b00011100, // v
134+
0b00010100, // w
135+
0b01110110, // x
136+
0b01101110, // y
137+
0b01011011, // z
138+
0b01000110, // {
139+
0b00110000, // |
140+
0b01110000, // }
141+
0b00000001, // ~
142+
0b00000000, // del
143+
};
Lines changed: 4 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,21 @@
11
#include <SoftI2C.h>
22

33
void setup() {
4-
scl_pin = 30; //extern variable in SoftI2C.h
5-
sda_pin = 31;
6-
I2CInit();
4+
//pass SCL and SDA pins
5+
Wire_begin(30, 31);
76
}
87

98
void loop() {
109

11-
uint8_t ack_bit;
12-
1310
USBSerial_println("\nScanning:");
1411

1512
for (uint8_t i = 0; i < 128; i++) {
16-
I2CStart();
17-
ack_bit = I2CSend(i << 1 | 1); //last bit is r(1)/w(0).
18-
I2CStop();
1913
delay(1);
20-
if (ack_bit == 0) {
14+
if (Wire_scan(i)) {
2115
USBSerial_print("I2C got ACK from: 0x");
2216
USBSerial_println(i, HEX);
2317
}
2418
}
25-
delay(1000);
2619

20+
delay(1000);
2721
}

ch55xduino/ch55x/libraries/SoftI2C/src/SoftI2C.c

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,15 +66,18 @@ uint8_t I2CSend(uint8_t i2cData) {
6666
digitalWrite(scl_pin, LOW);
6767
i2cData <<= 1;
6868
}
69+
pinMode(sda_pin, INPUT_PULLUP);
6970
digitalWrite(sda_pin, HIGH);
7071
digitalWrite(scl_pin, HIGH);
7172
ack_bit = digitalRead(sda_pin);
73+
pinMode(sda_pin, OUTPUT_OD);
7274
digitalWrite(scl_pin, LOW);
7375
return ack_bit;
7476
}
7577

7678
uint8_t I2CRead() {
7779
uint8_t i, Data = 0;
80+
pinMode(sda_pin, INPUT_PULLUP);
7881
for (i = 0; i < 8; i++) {
7982
digitalWrite(scl_pin, HIGH);
8083
if (digitalRead(sda_pin))
@@ -83,5 +86,6 @@ uint8_t I2CRead() {
8386
Data <<= 1;
8487
digitalWrite(scl_pin, LOW);
8588
}
89+
pinMode(sda_pin, OUTPUT_OD);
8690
return Data;
8791
}

ch55xduino/ch55x/libraries/SoftI2C/src/SoftI2C.h

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,4 +25,15 @@ void I2CNak();
2525
uint8_t I2CSend(uint8_t i2cData);
2626
uint8_t I2CRead();
2727

28+
void Wire_begin(uint8_t scl, __xdata uint8_t sda);
29+
bool Wire_scan(uint8_t i2caddr);
30+
bool Wire_writeBytes(uint8_t i2caddr, uint8_t *__xdata data,
31+
__xdata uint8_t bytes);
32+
bool Wire_readBytes(uint8_t i2caddr, uint8_t *__xdata data,
33+
__xdata uint8_t bytes);
34+
bool Wire_readRegister(uint8_t i2caddr, __xdata uint8_t regaddr,
35+
uint8_t *__xdata data, __xdata uint8_t bytes);
36+
bool Wire_readRegister16bitAddr(uint8_t i2caddr, __xdata uint16_t regaddr,
37+
uint8_t *__xdata data, __xdata uint8_t bytes);
38+
2839
#endif

0 commit comments

Comments
 (0)