Code for BSC I2C/SPI slave on the BCM2711 (PI4B)

Added documentation for callback usage
This commit is contained in:
joan2937 2020-03-01 13:35:16 +00:00
parent bab05ceb97
commit 4753b0d37c
9 changed files with 311 additions and 77 deletions

View File

@ -1682,6 +1682,15 @@ will be a latency.
.br
.br
If you want to track the level of more than one GPIO do so by
maintaining the state in the callback. Do not use \fBgpioRead\fP.
Remember the event that triggered the callback may have
happened several milliseconds before and the GPIO may have
changed level many times since then.
.br
.br
The tick value is the time stamp of the sample in microseconds, see
\fBgpioTick\fP for more details.
@ -4181,12 +4190,6 @@ queue and the master removes it.
.br
.br
This function is not available on the BCM2711 (e.g. as
used in the Pi4B).
.br
.br
I can't get SPI to work properly. I tried with a
control word of 0x303 and swapped MISO and MOSI.
@ -4249,14 +4252,37 @@ that mode until a different control word is sent.
.br
.br
The BSC peripheral uses GPIO 18 (SDA) and 19 (SCL) in I2C mode
and GPIO 18 (MOSI), 19 (SCLK), 20 (MISO), and 21 (CE) in SPI mode. You
need to swap MISO/MOSI between master and slave.
GPIO used for models other than those based on the BCM2711.
.br
.br
When a zero control word is received GPIO 18-21 will be reset
SDA SCL MOSI SCLK MISO CE
.br
I2C 18 19 - - - -
.br
SPI - - 18 19 20 21
.br
.br
.br
GPIO used for models based on the BCM2711 (e.g. the Pi4B).
.br
.br
SDA SCL MOSI SCLK MISO CE
.br
I2C 10 11 - - - -
.br
SPI - - 10 11 9 8
.br
.br
.br
When a zero control word is received the used GPIO will be reset
to INPUT mode.
.br

View File

@ -25,7 +25,7 @@ OTHER DEALINGS IN THE SOFTWARE.
For more information, please refer to <http://unlicense.org/>
*/
/* pigpio version 74 */
/* pigpio version 75 */
/* include ------------------------------------------------------- */
@ -10730,35 +10730,69 @@ int bbI2CZip(
void bscInit(int mode)
{
int sda, scl, miso, ce;
bscsReg[BSC_CR]=0; /* clear device */
bscsReg[BSC_RSR]=0; /* clear underrun and overrun errors */
bscsReg[BSC_SLV]=0; /* clear I2C slave address */
bscsReg[BSC_IMSC]=0xf; /* mask off all interrupts */
bscsReg[BSC_ICR]=0x0f; /* clear all interrupts */
gpioSetMode(BSC_SDA_MOSI, PI_ALT3);
gpioSetMode(BSC_SCL_SCLK, PI_ALT3);
if (pi_is_2711)
{
sda = BSC_SDA_MOSI_2711;
scl = BSC_SCL_SCLK_2711;
miso = BSC_MISO_2711;
ce = BSC_CE_N_2711;
}
else
{
sda = BSC_SDA_MOSI;
scl = BSC_SCL_SCLK;
miso = BSC_MISO;
ce = BSC_CE_N;
}
gpioSetMode(sda, PI_ALT3);
gpioSetMode(scl, PI_ALT3);
if (mode > 1) /* SPI uses all GPIO */
{
gpioSetMode(BSC_MISO, PI_ALT3);
gpioSetMode(BSC_CE_N, PI_ALT3);
gpioSetMode(miso, PI_ALT3);
gpioSetMode(ce, PI_ALT3);
}
}
void bscTerm(int mode)
{
int sda, scl, miso, ce;
bscsReg[BSC_CR] = 0; /* clear device */
bscsReg[BSC_RSR]=0; /* clear underrun and overrun errors */
bscsReg[BSC_SLV]=0; /* clear I2C slave address */
gpioSetMode(BSC_SDA_MOSI, PI_INPUT);
gpioSetMode(BSC_SCL_SCLK, PI_INPUT);
if (pi_is_2711)
{
sda = BSC_SDA_MOSI_2711;
scl = BSC_SCL_SCLK_2711;
miso = BSC_MISO_2711;
ce = BSC_CE_N_2711;
}
else
{
sda = BSC_SDA_MOSI;
scl = BSC_SCL_SCLK;
miso = BSC_MISO;
ce = BSC_CE_N;
}
gpioSetMode(sda, PI_INPUT);
gpioSetMode(scl, PI_INPUT);
if (mode > 1)
{
gpioSetMode(BSC_MISO, PI_INPUT);
gpioSetMode(BSC_CE_N, PI_INPUT);
gpioSetMode(miso, PI_INPUT);
gpioSetMode(ce, PI_INPUT);
}
}
@ -10778,9 +10812,6 @@ int bscXfer(bsc_xfer_t *xfer)
CHECK_INITED;
if (pi_is_2711)
SOFT_ERROR(PI_NOT_ON_BCM2711, "SPI/BSC slave not available on BCM2711");
eventAlert[PI_EVENT_BSC].ignore = 1;
if (xfer->control)
@ -10794,7 +10825,7 @@ int bscXfer(bsc_xfer_t *xfer)
if (mode > bscMode)
{
bscInit(bscMode);
bscInit(mode);
bscMode = mode;
}
}

View File

@ -30,7 +30,7 @@ For more information, please refer to <http://unlicense.org/>
#include <stdint.h>
#include <pthread.h>
#define PIGPIO_VERSION 74
#define PIGPIO_VERSION 7401
/*TEXT
@ -797,6 +797,11 @@ typedef void *(gpioThreadFunc_t) (void *);
#define BSC_MISO 20
#define BSC_CE_N 21
#define BSC_SDA_MOSI_2711 10
#define BSC_SCL_SCLK_2711 11
#define BSC_MISO_2711 9
#define BSC_CE_N_2711 8
/* Longest busy delay */
#define PI_MAX_BUSY_DELAY 100
@ -1439,6 +1444,12 @@ once per level change since the last time the thread was activated.
i.e. The active alert functions will get all level changes but there
will be a latency.
If you want to track the level of more than one GPIO do so by
maintaining the state in the callback. Do not use [*gpioRead*].
Remember the event that triggered the callback may have
happened several milliseconds before and the GPIO may have
changed level many times since then.
The tick value is the time stamp of the sample in microseconds, see
[*gpioTick*] for more details.
@ -2913,9 +2924,6 @@ The output process is simple. You simply append data to the FIFO
buffer on the chip. This works like a queue, you add data to the
queue and the master removes it.
This function is not available on the BCM2711 (e.g. as
used in the Pi4B).
I can't get SPI to work properly. I tried with a
control word of 0x303 and swapped MISO and MOSI.
@ -2947,11 +2955,19 @@ in rxBuf.
Note that the control word sets the BSC mode. The BSC will stay in
that mode until a different control word is sent.
The BSC peripheral uses GPIO 18 (SDA) and 19 (SCL) in I2C mode
and GPIO 18 (MOSI), 19 (SCLK), 20 (MISO), and 21 (CE) in SPI mode. You
need to swap MISO/MOSI between master and slave.
GPIO used for models other than those based on the BCM2711.
When a zero control word is received GPIO 18-21 will be reset
@ SDA @ SCL @ MOSI @ SCLK @ MISO @ CE
I2C @ 18 @ 19 @ - @ - @ - @ -
SPI @ - @ - @ 18 @ 19 @ 20 @ 21
GPIO used for models based on the BCM2711 (e.g. the Pi4B).
@ SDA @ SCL @ MOSI @ SCLK @ MISO @ CE
I2C @ 10 @ 11 @ - @ - @ - @ -
SPI @ - @ - @ 10 @ 11 @ 9 @ 8
When a zero control word is received the used GPIO will be reset
to INPUT mode.
The returned function value is the status of the transfer (see below).

View File

@ -330,7 +330,7 @@ import threading
import os
import atexit
VERSION = "1.45"
VERSION = "1.46"
exceptions = True
@ -3557,13 +3557,9 @@ class pi():
buffer on the chip. This works like a queue, you add data to the
queue and the master removes it.
This function is not available on the BCM2711 (e.g. as
used in the Pi4B).
I can't get SPI to work properly. I tried with a
control word of 0x303 and swapped MISO and MOSI.
The function sets the BSC mode, writes any data in
the transmit buffer to the BSC transmit FIFO, and
copies any data in the BSC receive FIFO to the
@ -3580,12 +3576,19 @@ class pi():
Note that the control word sets the BSC mode. The BSC will
stay in that mode until a different control word is sent.
The BSC peripheral uses GPIO 18 (SDA) and 19 (SCL)
in I2C mode and GPIO 18 (MOSI), 19 (SCLK), 20 (MISO),
and 21 (CE) in SPI mode. You need to swap MISO/MOSI
between master and slave.
GPIO used for models other than those based on the BCM2711.
When a zero control word is received GPIO 18-21 will be reset
@ SDA @ SCL @ MOSI @ SCLK @ MISO @ CE
I2C @ 18 @ 19 @ - @ - @ - @ -
SPI @ - @ - @ 18 @ 19 @ 20 @ 21
GPIO used for models based on the BCM2711 (e.g. the Pi4B).
@ SDA @ SCL @ MOSI @ SCLK @ MISO @ CE
I2C @ 10 @ 11 @ - @ - @ - @ -
SPI @ - @ - @ 10 @ 11 @ 9 @ 8
When a zero control word is received the used GPIO will be reset
to INPUT mode.
bsc_control consists of the following bits:
@ -3684,10 +3687,10 @@ class pi():
(and will contain the error code).
Note that an i2c_address of 0 may be used to close
the BSC device and reassign the used GPIO (18/19)
as inputs.
the BSC device and reassign the used GPIO as inputs.
This example assumes GPIO 2/3 are connected to GPIO 18/19.
This example assumes GPIO 2/3 are connected to GPIO 18/19
(GPIO 10/11 on the BCM2711).
...
#!/usr/bin/env python
@ -4939,6 +4942,37 @@ class pi():
A GPIO may have multiple callbacks (although I can't think of
a reason to do so).
The GPIO are sampled at a rate set when the pigpio daemon
is started (default 5 us).
The number of samples per second is given in the following table.
. .
samples
per sec
1 1,000,000
2 500,000
sample 4 250,000
rate 5 200,000
(us) 8 125,000
10 100,000
. .
GPIO level changes shorter than the sample rate may be missed.
The daemon software which generates the callbacks is triggered
1000 times per second. The callbacks will be called once per
level change since the last time they were called.
i.e. The callbacks will get all level changes but there will
be a latency.
If you want to track the level of more than one GPIO do so by
maintaining the state in the callback. Do not use [*read*].
Remember the event that triggered the callback may have
happened several milliseconds before and the GPIO may have
changed level many times since then.
...
def cbf(gpio, level, tick):
print(gpio, level, tick)

View File

@ -5920,6 +5920,66 @@ tick 32 bit The number of microseconds since boot
.EE
.br
.br
The GPIO are sampled at a rate set when the pigpio daemon
is started (default 5 us).
.br
.br
The number of samples per second is given in the following table.
.br
.br
.EX
samples
.br
per sec
.br
.br
1 1,000,000
.br
2 500,000
.br
sample 4 250,000
.br
rate 5 200,000
.br
(us) 8 125,000
.br
10 100,000
.br
.EE
.br
.br
GPIO level changes shorter than the sample rate may be missed.
.br
.br
The daemon software which generates the callbacks is triggered
1000 times per second. The callbacks will be called once per
level change since the last time they were called.
i.e. The callbacks will get all level changes but there will
be a latency.
.br
.br
If you want to track the level of more than one GPIO do so by
maintaining the state in the callback. Do not use \fBgpio_read\fP.
Remember the event that triggered the callback may have
happened several milliseconds before and the GPIO may have
changed level many times since then.
.IP "\fBint callback_ex(int pi, unsigned user_gpio, unsigned edge, CBFuncEx_t f, void *userdata)\fP"
.IP "" 4
This function initialises a new callback.
@ -6072,12 +6132,6 @@ queue and the master removes it.
.br
.br
This function is not available on the BCM2711 (e.g. as
used in the Pi4B).
.br
.br
I can't get SPI to work properly. I tried with a
control word of 0x303 and swapped MISO and MOSI.
@ -6160,14 +6214,37 @@ that mode until a different control word is sent.
.br
.br
The BSC peripheral uses GPIO 18 (SDA) and 19 (SCL) in I2C mode
and GPIO 18 (MOSI), 19 (SCLK), 20 (MISO), and 21 (CE) in SPI mode. You
need to swap MISO/MOSI between master and slave.
GPIO used for models other than those based on the BCM2711.
.br
.br
When a zero control word is received GPIO 18-21 will be reset
SDA SCL MOSI SCLK MISO CE
.br
I2C 18 19 - - - -
.br
SPI - - 18 19 20 21
.br
.br
.br
GPIO used for models based on the BCM2711 (e.g. the Pi4B).
.br
.br
SDA SCL MOSI SCLK MISO CE
.br
I2C 10 11 - - - -
.br
SPI - - 10 11 9 8
.br
.br
.br
When a zero control word is received the used GPIO will be reset
to INPUT mode.
.br
@ -6390,8 +6467,7 @@ If there was an error the status will be less than zero
.br
Note that an i2c_address of 0 may be used to close
the BSC device and reassign the used GPIO (18/19)
as inputs.
the BSC device and reassign the used GPIO as inputs.
.IP "\fBint event_callback(int pi, unsigned event, evtCBFunc_t f)\fP"
.IP "" 4

View File

@ -25,7 +25,7 @@ OTHER DEALINGS IN THE SOFTWARE.
For more information, please refer to <http://unlicense.org/>
*/
/* PIGPIOD_IF2_VERSION 16 */
/* PIGPIOD_IF2_VERSION 17 */
#include <stdio.h>
#include <stdlib.h>

View File

@ -30,7 +30,7 @@ For more information, please refer to <http://unlicense.org/>
#include "pigpio.h"
#define PIGPIOD_IF2_VERSION 16
#define PIGPIOD_IF2_VERSION 17
/*TEXT
@ -3352,6 +3352,37 @@ tick 32 bit The number of microseconds since boot
WARNING: this wraps around from
4294967295 to 0 roughly every 72 minutes
. .
The GPIO are sampled at a rate set when the pigpio daemon
is started (default 5 us).
The number of samples per second is given in the following table.
. .
samples
per sec
1 1,000,000
2 500,000
sample 4 250,000
rate 5 200,000
(us) 8 125,000
10 100,000
. .
GPIO level changes shorter than the sample rate may be missed.
The daemon software which generates the callbacks is triggered
1000 times per second. The callbacks will be called once per
level change since the last time they were called.
i.e. The callbacks will get all level changes but there will
be a latency.
If you want to track the level of more than one GPIO do so by
maintaining the state in the callback. Do not use [*gpio_read*].
Remember the event that triggered the callback may have
happened several milliseconds before and the GPIO may have
changed level many times since then.
D*/
/*F*/
@ -3442,9 +3473,6 @@ The output process is simple. You simply append data to the FIFO
buffer on the chip. This works like a queue, you add data to the
queue and the master removes it.
This function is not available on the BCM2711 (e.g. as
used in the Pi4B).
I can't get SPI to work properly. I tried with a
control word of 0x303 and swapped MISO and MOSI.
@ -3486,11 +3514,19 @@ less than requested if the FIFO already contained untransmitted data).
Note that the control word sets the BSC mode. The BSC will stay in
that mode until a different control word is sent.
The BSC peripheral uses GPIO 18 (SDA) and 19 (SCL) in I2C mode
and GPIO 18 (MOSI), 19 (SCLK), 20 (MISO), and 21 (CE) in SPI mode. You
need to swap MISO/MOSI between master and slave.
GPIO used for models other than those based on the BCM2711.
When a zero control word is received GPIO 18-21 will be reset
@ SDA @ SCL @ MOSI @ SCLK @ MISO @ CE
I2C @ 18 @ 19 @ - @ - @ - @ -
SPI @ - @ - @ 18 @ 19 @ 20 @ 21
GPIO used for models based on the BCM2711 (e.g. the Pi4B).
@ SDA @ SCL @ MOSI @ SCLK @ MISO @ CE
I2C @ 10 @ 11 @ - @ - @ - @ -
SPI @ - @ - @ 10 @ 11 @ 9 @ 8
When a zero control word is received the used GPIO will be reset
to INPUT mode.
control consists of the following bits.
@ -3598,8 +3634,7 @@ If there was an error the status will be less than zero
(and will contain the error code).
Note that an i2c_address of 0 may be used to close
the BSC device and reassign the used GPIO (18/19)
as inputs.
the BSC device and reassign the used GPIO as inputs.
D*/
/*F*/

34
pigs.1
View File

@ -925,10 +925,6 @@ The output process is simple. You simply append data to the FIFO
buffer on the chip. This works like a queue, you add data to the
queue and the master removes it.
.br
This function is not available on the BCM2711 (e.g. as
used in the Pi4B).
.br
I can't get SPI to work properly. I tried with a
control word of 0x303 and swapped MISO and MOSI.
@ -950,12 +946,31 @@ For I2C use a control word of (I2C address << 16) + 0x305.
E.g. to talk as I2C slave with address 0x13 use 0x130305.
.br
The BSC peripheral uses GPIO 18 (SDA) and 19 (SCL) in I2C mode
and GPIO 18 (MOSI), 19 (SCLK), 20 (MISO), and 21 (CE) in SPI mode. You
need to swap MISO/MOSI between master and slave.
GPIO used for models other than those based on the BCM2711.
.br
When a zero control word is received GPIO 18-21 will be reset
.EX
SDA SCL MOSI SCLK MISO CE
I2C 18 19 - - - -
SPI - - 18 19 20 21
.EE
.br
GPIO used for models based on the BCM2711 (e.g. the Pi4B).
.br
.EX
SDA SCL MOSI SCLK MISO CE
I2C 10 11 - - - -
SPI - - 10 11 9 8
.EE
.br
When a zero control word is received the used GPIO will be reset
to INPUT mode.
.br
@ -1031,7 +1046,8 @@ TB transmit busy
.EE
.br
This example assumes that GPIO 2/3 are connected to GPIO 18/19.
This example assumes that GPIO 2/3 are connected to GPIO 18/19
(GPIO 10/11 on the BCM2711).
.br

View File

@ -3,7 +3,7 @@
from distutils.core import setup
setup(name='pigpio',
version='1.45',
version='1.46',
author='joan',
author_email='joan@abyz.me.uk',
maintainer='joan',