libpynq (release 5EWC0-2023 version 0.2.6 of 2023-10-24 17:28)
Loading...
Searching...
No Matches
IIC library

Enumerations

enum  iic_index_t { IIC0 = 0 , IIC1 = 1 , NUM_IICS = 2 }
 

Functions

void iic_init (const iic_index_t iic)
 
void iic_destroy (const iic_index_t iic)
 
bool iic_read_register (const iic_index_t iic, const uint8_t addr, const uint8_t reg, uint8_t *data, uint16_t length)
 
bool iic_write_register (const iic_index_t iic, const uint8_t addr, const uint8_t reg, uint8_t *data, uint16_t length)
 
bool iic_set_slave_mode (const iic_index_t iic, const uint8_t addr, uint32_t *register_map, const uint32_t rm_length)
 
void iic_slave_mode_handler (const iic_index_t iic)
 
void iic_reset (const iic_index_t iic)
 

Detailed Description

Functions to use the Inter-Integrated Circuit (IIC).

High-level functions to read/write to clients connected to the two integrated IIC modules. Before sending and receiving bytes the IIC2 must be connect to some I/O pins through the switchbox, e.g.

#define IO_PMODA3
Definition pinmap.h:152
#define IO_PMODA4
Definition pinmap.h:153
void switchbox_set_pin(const io_t pin_number, const io_configuration_t io_type)
Set the type of a switch pin.
Definition switchbox.c:126
@ SWB_IIC0_SDA
Definition switchbox.h:88
@ SWB_IIC0_SCL
Definition switchbox.h:90

The Pmod A pins (see pinmap.h) are good because they have 2K2 pull-up resistors built in. IICs can be routed through the switch box (e.g. SWB_IIC0_SCL/SDA, see switchbox.h).

After that, an example of how to use this library for the MASTER.

#include <libpynq.h>
int main (void)
{
// initialise all I/O
uint32_t i;
// you can use multiple slaves, here only one is shown
uint32_t slave_address = 0x70;
// read out all registers of the slave
for (int reg=0; reg < 32; reg++) {
if (iic_read_register(IIC0, slave_address, reg, (uint8_t *) &i, 4)) { // 4 bytes
printf("register[%d]=error\n",reg);
} else {
printf("register[%d]=%d\n",reg,i);
}
}
// clean up after use
return EXIT_SUCCESS;
}
bool iic_read_register(const iic_index_t iic, const uint8_t addr, const uint8_t reg, uint8_t *data, uint16_t data_length)
Definition iic.c:327
void iic_init(const iic_index_t iic)
Initialize the IIC specified by the index with a shared memory handle and a buffer size of 4096 bytes...
Definition iic.c:108
@ IIC0
Definition iic.h:104
void pynq_init(void)
Initialise the switchbox and GPIO of the PYNQ.
Definition libpynq.c:24
void pynq_destroy(void)
Reset and destroy the switchbox and GPIO of the PYNQ.
Definition libpynq.c:35

An example of how to use this library for the SLAVE.

int main(void)
{
// this is the address by which this slave is reached by the master
// different slaves must have different addresses
const uint32_t my_slave_address = 0x70;
// this array contains 32 registers that can be written & read by the master
// the slave can of course modify the values of the registers
uint32_t my_register_map[32] = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32};
const uint32_t my_register_map_length = sizeof(my_register_mmap)/sizeof(uint32_t);
iic_set_slave_mode(IIC0, my_slave_address, &(my_register_map[0]), my_register_map_length);
while (1) {
// the slave mode handler must be run regularly to react to the master
// insert your own code here, to do whatever the slave needs to do;
// make sure that you execute the slave mode handler regularly enough though
}
return EXIT_SUCCESS;
}
void iic_destroy(const iic_index_t iic)
Close the shared memory handle for the specified IIC index.
Definition iic.c:124
bool iic_set_slave_mode(const iic_index_t iic, const uint8_t addr, uint32_t *register_map, const uint32_t rm_length)
Definition iic.c:135
void iic_reset(const iic_index_t iic)
Definition iic.c:314
void iic_slave_mode_handler(const iic_index_t iic)
Definition iic.c:302
void sleep_msec(int msec)
Wait for msec milliseconds.
Definition util.c:32

Enumeration Type Documentation

◆ iic_index_t

Enum of IICs. Functions use a switch numbered from 0..NUM_IICS-1.

Enumerator
IIC0 
IIC1 
NUM_IICS 

Definition at line 104 of file iic.h.

Function Documentation

◆ iic_destroy()

void iic_destroy ( const iic_index_t  iic)
extern

Close the shared memory handle for the specified IIC index.

Parameters
uartThe IIC index to remove from the shared memory space.
Warning
Fails with program exit if the IIC channel is outside valid range.

Definition at line 124 of file iic.c.

Here is the call graph for this function:

◆ iic_init()

void iic_init ( const iic_index_t  iic)
extern

Initialize the IIC specified by the index with a shared memory handle and a buffer size of 4096 bytes.

Parameters
uartThe IIC index to initialize.
Warning
Fails with program exit if the IIC channel is outside valid range or when the shared memory system has not been instantiated.

Definition at line 108 of file iic.c.

Here is the call graph for this function:

◆ iic_read_register()

bool iic_read_register ( const iic_index_t  iic,
const uint8_t  addr,
const uint8_t  reg,
uint8_t *  data,
uint16_t  length 
)
extern
Parameters
iicThe IIC index to initialize.
addrThe IIC address of the client to access.
regThe clients register address.
dataBuffer where the register content is stored. [out]
lengthThe amount of data to read.

Reads the content of the register into data.

Returns
0 if successful, 1 on error

Definition at line 327 of file iic.c.

Here is the call graph for this function:

◆ iic_reset()

void iic_reset ( const iic_index_t  iic)
extern
Parameters
iicThe IIC index of the hardware to use. Return the IIC module into its default mode. This way it can be used as master.

Definition at line 314 of file iic.c.

◆ iic_set_slave_mode()

bool iic_set_slave_mode ( const iic_index_t  iic,
const uint8_t  addr,
uint32_t *  register_map,
const uint32_t  rm_length 
)
extern

Definition at line 135 of file iic.c.

◆ iic_slave_mode_handler()

void iic_slave_mode_handler ( const iic_index_t  iic)
extern
Parameters
iicThe IIC index of the hardware to use.

This handles requests that came in to the IIC unit when it is in slave mode.

Definition at line 302 of file iic.c.

◆ iic_write_register()

bool iic_write_register ( const iic_index_t  iic,
const uint8_t  addr,
const uint8_t  reg,
uint8_t *  data,
uint16_t  length 
)
extern
Parameters
iicThe IIC index to initialize.
addrThe IIC address of the client to access.
regThe clients register address.
dataBuffer where new the register content is stored.
lengthThe amount of data to write.

Writes data to register.

Returns
0 if successful, 1 on error

Definition at line 344 of file iic.c.

Here is the call graph for this function: