Skip to content
GitLab
Projects
Groups
Snippets
Help
Loading...
Help
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
A
arduino-esp32
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Analytics
Analytics
Repository
Value Stream
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Commits
Open sidebar
xpstem
arduino-esp32
Commits
f9f70d2f
Commit
f9f70d2f
authored
Oct 09, 2021
by
me-no-dev
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
I2C Slave Implementation
parent
5b207104
Changes
7
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
7 changed files
with
1068 additions
and
0 deletions
+1068
-0
cores/esp32/esp32-hal-i2c-slave.c
cores/esp32/esp32-hal-i2c-slave.c
+829
-0
cores/esp32/esp32-hal-i2c-slave.h
cores/esp32/esp32-hal-i2c-slave.h
+35
-0
libraries/Wire/examples/WireMaster/WireMaster.ino
libraries/Wire/examples/WireMaster/WireMaster.ino
+30
-0
libraries/Wire/examples/WireScan/WireScan.ino
libraries/Wire/examples/WireScan/WireScan.ino
+28
-0
libraries/Wire/examples/WireSlave/WireSlave.ino
libraries/Wire/examples/WireSlave/WireSlave.ino
+37
-0
libraries/Wire/src/Wire.cpp
libraries/Wire/src/Wire.cpp
+101
-0
libraries/Wire/src/Wire.h
libraries/Wire/src/Wire.h
+8
-0
No files found.
cores/esp32/esp32-hal-i2c-slave.c
0 → 100755
View file @
f9f70d2f
This diff is collapsed.
Click to expand it.
cores/esp32/esp32-hal-i2c-slave.h
0 → 100755
View file @
f9f70d2f
// Copyright 2015-2021 Espressif Systems (Shanghai) PTE LTD
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
#pragma once
#ifdef __cplusplus
extern
"C"
{
#endif
#include "stdint.h"
#include "stddef.h"
#include "esp_err.h"
typedef
void
(
*
i2c_slave_request_cb_t
)
(
uint8_t
num
,
void
*
arg
);
typedef
void
(
*
i2c_slave_receive_cb_t
)
(
uint8_t
num
,
uint8_t
*
data
,
size_t
len
,
bool
stop
,
void
*
arg
);
esp_err_t
i2c_slave_attach_callbacks
(
uint8_t
num
,
i2c_slave_request_cb_t
request_callback
,
i2c_slave_receive_cb_t
receive_callback
,
void
*
arg
);
esp_err_t
i2c_slave_init
(
uint8_t
num
,
int
sda
,
int
scl
,
uint16_t
slaveID
,
uint32_t
frequency
,
size_t
rx_len
,
size_t
tx_len
);
esp_err_t
i2c_slave_deinit
(
uint8_t
num
);
size_t
i2c_slave_write
(
uint8_t
num
,
const
uint8_t
*
buf
,
uint32_t
len
,
uint32_t
timeout_ms
);
#ifdef __cplusplus
}
#endif
libraries/Wire/examples/WireMaster/WireMaster.ino
0 → 100644
View file @
f9f70d2f
#include "Wire.h"
#define I2C_DEV_ADDR 0x55
uint32_t
i
=
0
;
void
setup
()
{
Serial
.
begin
(
115200
);
Serial
.
setDebugOutput
(
true
);
Wire
.
begin
();
}
void
loop
()
{
delay
(
5000
);
//Write message to the slave
Wire
.
beginTransmission
(
I2C_DEV_ADDR
);
Wire
.
printf
(
"Hello World! %u"
,
i
++
);
uint8_t
error
=
Wire
.
endTransmission
(
true
);
Serial
.
printf
(
"endTransmission: %u
\n
"
,
error
);
//Read 16 bytes from the slave
error
=
Wire
.
requestFrom
(
I2C_DEV_ADDR
,
16
);
Serial
.
printf
(
"requestFrom: %u
\n
"
,
error
);
if
(
error
){
uint8_t
temp
[
error
];
Wire
.
readBytes
(
temp
,
error
);
log_print_buf
(
temp
,
error
);
}
}
libraries/Wire/examples/WireScan/WireScan.ino
0 → 100644
View file @
f9f70d2f
#include "Wire.h"
void
setup
()
{
Serial
.
begin
(
115200
);
Wire
.
begin
();
}
void
loop
()
{
byte
error
,
address
;
int
nDevices
=
0
;
delay
(
5000
);
Serial
.
println
(
"Scanning for I2C devices ..."
);
for
(
address
=
0x01
;
address
<
0x7f
;
address
++
){
Wire
.
beginTransmission
(
address
);
error
=
Wire
.
endTransmission
();
if
(
error
==
0
){
Serial
.
printf
(
"I2C device found at address 0x%02X
\n
"
,
address
);
nDevices
++
;
}
else
if
(
error
!=
2
){
Serial
.
printf
(
"Error %d at address 0x%02X
\n
"
,
error
,
address
);
}
}
if
(
nDevices
==
0
){
Serial
.
println
(
"No I2C devices found"
);
}
}
libraries/Wire/examples/WireSlave/WireSlave.ino
0 → 100644
View file @
f9f70d2f
#include "Wire.h"
#define I2C_DEV_ADDR 0x55
uint32_t
i
=
0
;
void
onRequest
(){
Wire
.
print
(
i
++
);
Wire
.
print
(
" Packets."
);
Serial
.
println
(
"onRequest"
);
}
void
onReceive
(
int
len
){
Serial
.
printf
(
"onReceive[%d]: "
,
len
);
while
(
Wire
.
available
()){
Serial
.
write
(
Wire
.
read
());
}
Serial
.
println
();
}
void
setup
()
{
Serial
.
begin
(
115200
);
Serial
.
setDebugOutput
(
true
);
Wire
.
onReceive
(
onReceive
);
Wire
.
onRequest
(
onRequest
);
Wire
.
begin
((
uint8_t
)
I2C_DEV_ADDR
);
#if CONFIG_IDF_TARGET_ESP32
char
message
[
64
];
snprintf
(
message
,
64
,
"%u Packets."
,
i
++
);
Wire
.
slaveWrite
((
uint8_t
*
)
message
,
strlen
(
message
));
#endif
}
void
loop
()
{
}
libraries/Wire/src/Wire.cpp
View file @
f9f70d2f
...
...
@@ -30,6 +30,7 @@ extern "C" {
}
#include "esp32-hal-i2c.h"
#include "esp32-hal-i2c-slave.h"
#include "Wire.h"
#include "Arduino.h"
...
...
@@ -47,6 +48,9 @@ TwoWire::TwoWire(uint8_t bus_num)
,
nonStopTask
(
NULL
)
,
lock
(
NULL
)
#endif
,
is_slave
(
false
)
,
user_onRequest
(
NULL
)
,
user_onReceive
(
NULL
)
{}
TwoWire
::~
TwoWire
()
...
...
@@ -402,5 +406,102 @@ uint8_t TwoWire::endTransmission(void)
return
endTransmission
(
true
);
}
bool
TwoWire
::
begin
(
uint8_t
addr
,
int
sdaPin
,
int
sclPin
,
uint32_t
frequency
)
{
if
(
!
frequency
){
frequency
=
100000
;
}
else
if
(
frequency
>
1000000
){
frequency
=
1000000
;
}
if
(
sdaPin
<
0
)
{
// default param passed
if
(
num
==
0
)
{
if
(
sda
==-
1
)
{
sdaPin
=
SDA
;
//use Default Pin
}
else
{
sdaPin
=
sda
;
// reuse prior pin
}
}
else
{
if
(
sda
==-
1
)
{
log_e
(
"no Default SDA Pin for Second Peripheral"
);
return
false
;
//no Default pin for Second Peripheral
}
else
{
sdaPin
=
sda
;
// reuse prior pin
}
}
}
if
(
sclPin
<
0
)
{
// default param passed
if
(
num
==
0
)
{
if
(
scl
==
-
1
)
{
sclPin
=
SCL
;
// use Default pin
}
else
{
sclPin
=
scl
;
// reuse prior pin
}
}
else
{
if
(
scl
==
-
1
)
{
log_e
(
"no Default SCL Pin for Second Peripheral"
);
return
false
;
//no Default pin for Second Peripheral
}
else
{
sclPin
=
scl
;
// reuse prior pin
}
}
}
sda
=
sdaPin
;
scl
=
sclPin
;
i2c_slave_attach_callbacks
(
num
,
onRequestService
,
onReceiveService
,
this
);
if
(
i2c_slave_init
(
num
,
sda
,
scl
,
addr
,
frequency
,
I2C_BUFFER_LENGTH
,
I2C_BUFFER_LENGTH
)
!=
ESP_OK
){
Serial
.
println
(
"INIT ERROR"
);
return
false
;
}
is_slave
=
true
;
return
true
;
}
size_t
TwoWire
::
slaveWrite
(
const
uint8_t
*
buffer
,
size_t
len
)
{
return
i2c_slave_write
(
num
,
buffer
,
len
,
_timeOutMillis
);
}
void
TwoWire
::
onReceiveService
(
uint8_t
num
,
uint8_t
*
inBytes
,
size_t
numBytes
,
bool
stop
,
void
*
arg
)
{
TwoWire
*
wire
=
(
TwoWire
*
)
arg
;
if
(
!
wire
->
user_onReceive
){
return
;
}
for
(
uint8_t
i
=
0
;
i
<
numBytes
;
++
i
){
wire
->
rxBuffer
[
i
]
=
inBytes
[
i
];
}
wire
->
rxIndex
=
0
;
wire
->
rxLength
=
numBytes
;
wire
->
user_onReceive
(
numBytes
);
}
void
TwoWire
::
onRequestService
(
uint8_t
num
,
void
*
arg
)
{
TwoWire
*
wire
=
(
TwoWire
*
)
arg
;
if
(
!
wire
->
user_onRequest
){
return
;
}
wire
->
txLength
=
0
;
wire
->
user_onRequest
();
if
(
wire
->
txLength
){
wire
->
slaveWrite
((
uint8_t
*
)
wire
->
txBuffer
,
wire
->
txLength
);
}
}
void
TwoWire
::
onReceive
(
void
(
*
function
)(
int
)
)
{
user_onReceive
=
function
;
}
// sets function called on slave read
void
TwoWire
::
onRequest
(
void
(
*
function
)(
void
)
)
{
user_onRequest
=
function
;
}
TwoWire
Wire
=
TwoWire
(
0
);
TwoWire
Wire1
=
TwoWire
(
1
);
libraries/Wire/src/Wire.h
View file @
f9f70d2f
...
...
@@ -61,6 +61,12 @@ protected:
TaskHandle_t
nonStopTask
;
SemaphoreHandle_t
lock
;
#endif
private:
bool
is_slave
;
void
(
*
user_onRequest
)(
void
);
void
(
*
user_onReceive
)(
int
);
static
void
onRequestService
(
uint8_t
,
void
*
);
static
void
onReceiveService
(
uint8_t
,
uint8_t
*
,
size_t
,
bool
,
void
*
);
public:
TwoWire
(
uint8_t
bus_num
);
...
...
@@ -70,6 +76,7 @@ public:
bool
setPins
(
int
sda
,
int
scl
);
bool
begin
(
int
sda
=-
1
,
int
scl
=-
1
,
uint32_t
frequency
=
0
);
// returns true, if successful init of i2c bus
bool
begin
(
uint8_t
slaveAddr
,
int
sda
=-
1
,
int
scl
=-
1
,
uint32_t
frequency
=
0
);
bool
end
();
void
setTimeOut
(
uint16_t
timeOutMillis
);
// default timeout of i2c transactions is 50ms
...
...
@@ -123,6 +130,7 @@ public:
void
onReceive
(
void
(
*
)(
int
)
);
void
onRequest
(
void
(
*
)(
void
)
);
size_t
slaveWrite
(
const
uint8_t
*
,
size_t
);
};
extern
TwoWire
Wire
;
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment