/******************************************************************************* | |
* (c) Copyright 2007-2008 Actel Corporation. All rights reserved. | |
* | |
* SmartFusion microcontroller subsystem I2C bare metal software driver public | |
* API. | |
* | |
* SVN $Revision: 2150 $ | |
* SVN $Date: 2010-02-11 14:39:24 +0000 (Thu, 11 Feb 2010) $ | |
*/ | |
/*=========================================================================*//** | |
@mainpage SmartFusion MSS I2C Bare Metal Driver. | |
@section intro_sec Introduction | |
The SmartFusion™ microcontroller subsystem (MSS) includes two I2C peripherals | |
for serial communication. This driver provides a set of functions for | |
controlling the MSS I2Cs as part of a bare metal system where no operating | |
system is available. These drivers can be adapted for use as part of an | |
operating system, but the implementation of the adaptation layer between this | |
driver and the operating system's driver model is outside the scope of this | |
driver. | |
@section hw_dependencies Hardware Flow Dependencies | |
The configuration of all features of the MSS I2Cs is covered by this driver | |
with the exception of the SmartFusion IOMUX configuration. SmartFusion allows | |
multiple non-concurrent uses of some external pins through IOMUX configuration. | |
This feature allows optimization of external pin usage by assigning external | |
pins for use by either the microcontroller subsystem or the FPGA fabric. The | |
MSS I2Cs serial signals are routed through IOMUXes to the SmartFusion device | |
external pins. These IOMUXes are automatically configured correctly by the MSS | |
configurator tool in the hardware flow when the MSS I2Cs are enabled in that | |
tool. You must ensure that the MSS I2Cs are enabled by the MSS configurator | |
tool in the hardware flow; otherwise the serial inputs and outputs will not be | |
connected to the chip's external pins. For more information on IOMUX, refer to | |
the IOMUX section of the SmartFusion Datasheet. | |
The base address, register addresses and interrupt number assignment for the | |
MSS I2C blocks are defined as constants in the SmartFusion CMSIS-PAL. You must | |
ensure that the SmartFusion CMSIS-PAL is either included in the software tool | |
chain used to build your project or is included in your project. | |
@section theory_op Theory of Operation | |
The MSS I2C driver functions are grouped into the following categories: | |
• Initialization and configuration functions | |
• Interrupt control | |
• I2C master operations – functions to handle write, read and write-read transactions | |
• I2C slave operations – functions to handle write, read and write-read transactions | |
Initialization and Configuration | |
The MSS I2C driver is initialized through a call to the MSS_I2C_init() | |
function. This function takes the MSS I2C's configuration as parameters. The | |
MSS_I2C_init() function must be called before any other MSS I2C driver | |
functions can be called. The first parameter of the MSS_I2C_init() function | |
is a pointer to one of two global data structures used by the driver to | |
store state information for each MSS I2C. A pointer to these data structures | |
is also used as first parameter to any of the driver functions to identify | |
which MSS I2C will be used by the called function. The names of these two | |
data structures are g_mss_i2c0 and g_mss_i2c1. Therefore any call to an MSS | |
I2C driver function should be of the form MSS_I2C_function_name( &g_mss_i2c0, ... ) | |
or MSS_I2C_function_name( &g_mss_i2c1, ... ). | |
The MSS_I2C_init() function call for each MSS I2C also takes the I2C serial | |
address assigned to the MSS I2C and the serial clock divider to be used to | |
generate its I2C clock as configuration parameters. | |
Interrupt Control | |
The MSS I2C driver is interrupt driven and it enables and disables the | |
generation of interrupts by MSS I2C at various times when it is operating. | |
The driver automatically handles MSS I2C interrupts internally, including | |
enabling disabling and clearing MSS I2C interrupts in the Cortex-M3 | |
interrupt controller when required. | |
The function MSS_I2C_register_write_handler() is used to register a write | |
handler function with the MSS I2C driver that it will call on completion of | |
an I2C write transaction by the MSS I2C slave. It is your responsibility to | |
create and register the implementation of this handler function that will | |
process or trigger the processing of the received data. | |
Transaction Types | |
The MSS I2C driver is designed to handle three types of I2C transaction: | |
• Write transactions | |
• Read transactions | |
• Write-read transactions | |
Write transaction | |
The master I2C device initiates a write transaction by sending a START bit | |
as soon as the bus becomes free. The START bit is followed by the 7-bit | |
serial address of the target slave device followed by the read/write bit | |
indicating the direction of the transaction. The slave acknowledges receipt | |
of it’s address with an acknowledge bit. The master sends data one byte at | |
a time to the slave, which must acknowledge receipt of each byte for the | |
next byte to be sent. The master sends a STOP bit to complete the transaction. | |
The slave can abort the transaction by replying with a non-acknowledge bit | |
instead of an acknowledge. | |
The application programmer can choose not to send a STOP bit at the end of | |
the transaction causing the next transaction to begin with a repeated START bit. | |
Read transaction | |
The master I2C device initiates a read transaction by sending a START bit | |
as soon as the bus becomes free. The START bit is followed by the 7-bit | |
serial address of the target slave device followed by the read/write bit | |
indicating the direction of the transaction. The slave acknowledges receipt | |
of it’s slave address with an acknowledge bit. The slave sends data one byte | |
at a time to the master, which must acknowledge receipt of each byte for the | |
next byte to be sent. The master sends a non-acknowledge bit following the | |
last byte it wishes to read followed by a STOP bit. | |
The application programmer can choose not to send a STOP bit at the end of | |
the transaction causing the next transaction to begin with a repeated START bit. | |
Write-read transaction | |
The write-read transaction is a combination of a write transaction | |
immediately followed by a read transaction. There is no STOP bit between | |
the write and read phases of a write-read transaction. A repeated START | |
bit is sent between the write and read phases. | |
The write-read transaction is typically used to send a command or offset | |
in the write transaction specifying the logical data to be transferred | |
during the read phase. | |
The application programmer can choose not to send a STOP bit at the end of | |
the transaction causing the next transaction to begin with a repeated START bit. | |
Master Operations | |
The application can use the MSS_I2C_write(), MSS_I2C_read() and MSS_I2C_write_read() | |
functions to initiate an I2C bus transaction. The application can then wait | |
for the transaction to complete using the MSS_I2C_wait_complete() function | |
or poll the status of the I2C transaction using the MSS_I2C_get_status() | |
function until it returns a value different from MSS_I2C_IN_PROGRESS. | |
Slave Operations | |
The configuration of the MSS I2C driver to operate as an I2C slave requires | |
the use of the following functions: | |
• MSS_I2C_set_slave_tx_buffer() | |
• MSS_I2C_set_slave_rx_buffer() | |
• MSS_I2C_set_slave_mem_offset_length() | |
• MSS_I2C_register_write_handler() | |
• MSS_I2C_enable_slave_rx() | |
Use of all functions is not required if the slave I2C does not need to support | |
all types of I2C read transactions. The subsequent sections list the functions | |
that must be used to support each transaction type. | |
Responding to read transactions | |
The following functions are used to configure the MSS I2C driver to respond | |
to I2C read transactions: | |
• MSS_I2C_set_slave_tx_buffer() | |
• MSS_I2C_enable_slave_rx() | |
The function MSS_I2C_set_slave_tx_buffer() specifies the data buffer that | |
will be transmitted when the I2C slave is the target of an I2C read | |
transaction. It is then up to the application to manage the content of that | |
buffer to control the data that will be transmitted to the I2C master as a | |
result of the read transaction. | |
The function MSS_I2C_enable_slave_rx() enables the MSS I2C hardware instance | |
to respond to I2C transactions. It must be called after the MSS I2C driver | |
has been configured to respond to the required transaction types. | |
Responding to write transactions | |
The following functions are used to configure the MSS I2C driver to respond | |
to I2C write transactions: | |
• MSS_I2C_set_slave_rx_buffer() | |
• MSS_I2C_register_write_handler() | |
• MSS_I2C_enable_slave_rx() | |
The function MSS_I2C_set_slave_rx_buffer() specifies the data buffer that | |
will be used to store the data received by the I2C slave when it is the | |
target an I2C write transaction. | |
The function MSS_I2C_register_write_handler() specifies the handler function | |
that must be called on completion of the I2C write transaction. It is this | |
handler function that will process or trigger the processing of the received | |
data. | |
The function MSS_I2C_enable_slave_rx() enables the MSS I2C hardware instance | |
to respond to I2C transactions. It must be called after the MSS I2C driver | |
has been configured to respond to the required transaction types. | |
Responding to write-read transactions | |
The following functions are used to configure the MSS I2C driver to respond | |
to write-read transactions: | |
• MSS_I2C_set_slave_tx_buffer() | |
• MSS_I2C_set_slave_rx_buffer() | |
• MSS_I2C_set_slave_mem_offset_length() | |
• MSS_I2C_enable_slave_rx() | |
The function MSS_I2C_set_slave_mem_offset_length() specifies the number of | |
bytes expected by the I2C slave during the write phase of the write-read | |
transaction. | |
The function MSS_I2C_set_slave_tx_buffer() specifies the data that will be | |
transmitted to the I2C master during the read phase of the write-read | |
transaction. The value received by the I2C slave during the write phase of | |
the transaction will be used as an index into the transmit buffer specified | |
by this function to decide which part of the transmit buffer will be | |
transmitted to the I2C master as part of the read phase of the write-read | |
transaction. | |
The function MSS_I2C_set_slave_rx_buffer() specifies the data buffer that | |
will be used to store the data received by the I2C slave during the write | |
phase of the write-read transaction. This buffer must be at least large | |
enough to accommodate the number of bytes specified through the | |
MSS_I2C_set_slave_mem_offset_length() function. | |
The function MSS_I2C_enable_slave_rx() enables the MSS I2C hardware | |
instance to respond to I2C transactions. It must be called after the MSS | |
I2C driver has been configured to respond to the required transaction types. | |
*//*=========================================================================*/ | |
#ifndef I2C_H_ | |
#define I2C_H_ | |
#include "../../CMSIS/a2fxxxm3.h" | |
/* FreeRTOS includes. */ | |
#include "FreeRTOS.h" | |
#include "task.h" | |
#include "semphr.h" | |
#ifdef __cplusplus | |
extern "C" { | |
#endif | |
/*-------------------------------------------------------------------------*//** | |
The mss_i2c_clock_divider_t type is used to specify the divider to be applied | |
to the MSS I2C BCLK signal in order to generate the I2C clock. | |
*/ | |
typedef enum mss_i2c_clock_divider { | |
MSS_I2C_PCLK_DIV_256 = 0, | |
MSS_I2C_PCLK_DIV_224, | |
MSS_I2C_PCLK_DIV_192, | |
MSS_I2C_PCLK_DIV_160, | |
MSS_I2C_PCLK_DIV_960, | |
MSS_I2C_PCLK_DIV_120, | |
MSS_I2C_PCLK_DIV_60, | |
MSS_I2C_BCLK_DIV_8 | |
} mss_i2c_clock_divider_t; | |
/*-------------------------------------------------------------------------*//** | |
The MSS_I2C_RELEASE_BUS constant is used to specify the options parameter to | |
functions MSS_I2C_read(), MSS_I2C_write() and MSS_I2C_write_read() to indicate | |
that a STOP bit must be generated at the end of the I2C transaction to release | |
the bus. | |
*/ | |
#define MSS_I2C_RELEASE_BUS 0x00 | |
/*-------------------------------------------------------------------------*//** | |
The MSS_I2C_HOLD_BUS constant is used to specify the options parameter to | |
functions MSS_I2C_read(), MSS_I2C_write() and MSS_I2C_write_read() to indicate | |
that a STOP bit must not be generated at the end of the I2C transaction in | |
order to retain the bus ownership. This will cause the next transaction to | |
begin with a repeated START bit and no STOP bit between the transactions. | |
*/ | |
#define MSS_I2C_HOLD_BUS 0x01 | |
/*-------------------------------------------------------------------------*//** | |
The mss_i2c_status_t type is used to report the status of I2C transactions. | |
*/ | |
typedef enum mss_i2c_status | |
{ | |
MSS_I2C_SUCCESS = 0, | |
MSS_I2C_IN_PROGRESS, | |
MSS_I2C_FAILED | |
} mss_i2c_status_t; | |
/*-------------------------------------------------------------------------*//** | |
The mss_i2c_slave_handler_ret_t type is used by slave write handler functions | |
to indicate whether the received data buffer should be released or not. | |
*/ | |
typedef enum mss_i2c_slave_handler_ret { | |
MSS_I2C_REENABLE_SLAVE_RX = 0, | |
MSS_I2C_PAUSE_SLAVE_RX = 1 | |
} mss_i2c_slave_handler_ret_t; | |
/*-------------------------------------------------------------------------*//** | |
Slave write handler functions prototype. | |
------------------------------------------------------------------------------ | |
This defines the function prototype that must be followed by MSS I2C slave | |
write handler functions. These functions are registered with the MSS I2C driver | |
through the MSS_I2C_register_write_handler() function. | |
Declaring and Implementing Slave Write Handler Functions: | |
Slave write handler functions should follow the following prototype: | |
mss_i2c_slave_handler_ret_t write_handler( uint8_t * data, uint16_t size ); | |
The data parameter is a pointer to a buffer (received data buffer) holding | |
the data written to the MSS I2C slave. | |
The size parameter is the number of bytes held in the received data buffer. | |
Handler functions must return one of the following values: | |
• MSS_I2C_REENABLE_SLAVE_RX | |
• MSS_I2C_PAUSE_SLAVE_RX. | |
If the handler function returns MSS_I2C_REENABLE_SLAVE_RX, the driver will | |
release the received data buffer and allow further I2C write transactions to | |
the MSS I2C slave to take place. | |
If the handler function returns MSS_I2C_PAUSE_SLAVE_RX, the MSS I2C slave | |
will respond to subsequent write requests with a non-acknowledge bit (NACK), | |
until the received data buffer content has been processed by some other part | |
of the software application. | |
A call to MSS_I2C_enable_slave_rx() is required at some point after | |
returning MSS_I2C_PAUSE_SLAVE_RX in order to release the received data | |
buffer so it can be used to store data received by subsequent I2C write | |
transactions. | |
*/ | |
typedef mss_i2c_slave_handler_ret_t (*mss_i2c_slave_wr_handler_t)( uint8_t *, uint16_t ); | |
/*-------------------------------------------------------------------------*//** | |
mss_i2c_instance_t | |
------------------------------------------------------------------------------ | |
There is one instance of this structure for each of the microcontroller | |
subsystem's I2Cs. Instances of this structure are used to identify a specific | |
I2C. A pointer to an instance of the mss_i2c_instance_t structure is passed as | |
the first parameter to MSS I2C driver functions to identify which I2C should | |
perform the requested operation. | |
*/ | |
typedef struct mss_i2c_instance | |
{ | |
uint_fast8_t ser_address; | |
/* Transmit related info:*/ | |
uint_fast8_t target_addr; | |
/* Current transaction type (WRITE, READ, RANDOM_READ)*/ | |
uint8_t transaction; | |
uint_fast16_t random_read_addr; | |
uint8_t options; | |
/* I2C hardware instance identification */ | |
IRQn_Type irqn; | |
I2C_TypeDef * hw_reg; | |
I2C_BitBand_TypeDef * hw_reg_bit; | |
/* TX INFO: */ | |
const uint8_t * tx_buffer; | |
uint_fast16_t tx_size; | |
uint_fast16_t tx_idx; | |
uint_fast8_t dir; | |
/* RX INFO: */ | |
uint8_t * rx_buffer; | |
uint_fast16_t rx_size; | |
uint_fast16_t rx_idx; | |
/* status variable: */ | |
volatile mss_i2c_status_t status; | |
/* Slave data: */ | |
uint_fast8_t slave_mem_offset_length; | |
mss_i2c_slave_wr_handler_t slave_write_handler; | |
/* Used to get access to and wait for completion of an I2C transaction. */ | |
SemaphoreHandle_t xI2CCompleteSemaphore; | |
} mss_i2c_instance_t; | |
/*-------------------------------------------------------------------------*//** | |
This instance of mss_i2c_instance_t holds all data related to the operations | |
performed by MSS I2C 0. A pointer to g_mss_i2c0 is passed as the first | |
parameter to MSS I2C driver functions to indicate that MSS I2C 0 should | |
perform the requested operation. | |
*/ | |
extern mss_i2c_instance_t g_mss_i2c0; | |
/*-------------------------------------------------------------------------*//** | |
This instance of mss_i2c_instance_t holds all data related to the operations | |
performed by MSS I2C 1. A pointer to g_mss_i2c1 is passed as the first | |
parameter to MSS I2C driver functions to indicate that MSS I2C 1 should | |
perform the requested operation. | |
*/ | |
extern mss_i2c_instance_t g_mss_i2c1; | |
/*-------------------------------------------------------------------------*//** | |
MSS I2C initialisation routine. | |
------------------------------------------------------------------------------ | |
The MSS_I2C_init() function initializes and configures hardware and data | |
structures of one of the SmartFusion MSS I2Cs. | |
------------------------------------------------------------------------------ | |
@param this_i2c: | |
The this_i2c parameter is a pointer to an mss_i2c_instance_t structure | |
identifying the MSS I2C hardware block to be initialized. There are two such | |
data structures, g_mss_i2c0 and g_mss_i2c1, associated with MSS I2C 0 and | |
MSS I2C 1 respectively. This parameter must point to either the g_mss_i2c0 | |
or g_mss_i2c1 global data structure defined within the I2C driver. | |
@param ser_address: | |
This parameter sets the I2C serial address being initialized. It is the I2C | |
bus address to which the MSS I2C instance will respond. Any 8 bit address is | |
allowed. | |
@param ser_clock_speed: | |
This parameter sets the I2C serial clock frequency. It selects the divider | |
that will be used to generate the serial clock from the APB clock. It can be | |
one of the following: | |
• MSS_I2C_PCLK_DIV_256 | |
• MSS_I2C_PCLK_DIV_224 | |
• MSS_I2C_PCLK_DIV_192 | |
• MSS_I2C_PCLK_DIV_160 | |
• MSS_I2C_PCLK_DIV_960 | |
• MSS_I2C_PCLK_DIV_120 | |
• MSS_I2C_PCLK_DIV_60 | |
• MSS_I2C_BCLK_DIV_8 | |
*/ | |
void MSS_I2C_init | |
( | |
mss_i2c_instance_t * this_i2c, | |
uint8_t ser_address, | |
mss_i2c_clock_divider_t ser_clock_speed | |
); | |
/******************************************************************************* | |
******************************************************************************* | |
* | |
* Master specific functions | |
* | |
* The following functions are only used within an I2C master's implementation. | |
*/ | |
/*-------------------------------------------------------------------------*//** | |
I2C master write function. | |
------------------------------------------------------------------------------ | |
This function initiates an I2C master write transaction. This function returns | |
immediately after initiating the transaction. The content of the write buffer | |
passed as parameter should not be modified until the write transaction | |
completes. It also means that the memory allocated for the write buffer should | |
not be freed or go out of scope before the write completes. You can check for | |
the write transaction completion using the MSS_I2C_status() function. | |
------------------------------------------------------------------------------ | |
@param this_i2c: | |
The this_i2c parameter is a pointer to an mss_i2c_instance_t structure | |
identifying the MSS I2C hardware block that will perform the requested | |
function. There are two such data structures, g_mss_i2c0 and g_mss_i2c1, | |
associated with MSS I2C 0 and MSS I2C 1 respectively. This parameter must | |
point to either the g_mss_i2c0 or g_mss_i2c1 global data structure defined | |
within the I2C driver. | |
@param serial_addr: | |
This parameter specifies the serial address of the target I2C device. | |
@param write_buffer: | |
This parameter is a pointer to a buffer holding the data to be written to | |
the target I2C device. | |
Care must be taken not to release the memory used by this buffer before the | |
write transaction completes. For example, it is not appropriate to return | |
from a function allocating this buffer as an array variable before the write | |
transaction completes as this would result in the buffer's memory being | |
de-allocated from the stack when the function returns. This memory could | |
then be subsequently reused and modified causing unexpected data to be | |
written to the target I2C device. | |
@param write_size: | |
Number of bytes held in the write_buffer to be written to the target I2C | |
device. | |
@param options: | |
The options parameter is used to indicate if the I2C bus should be released | |
on completion of the write transaction. Using the MSS_I2C_RELEASE_BUS | |
constant for the options parameter causes a STOP bit to be generated at the | |
end of the write transaction causing the bus to be released for other I2C | |
devices to use. Using the MSS_I2C_HOLD_BUS constant as options parameter | |
prevents a STOP bit from being generated at the end of the write | |
transaction, preventing other I2C devices from initiating a bus transaction. | |
*/ | |
void MSS_I2C_write | |
( | |
mss_i2c_instance_t * this_i2c, | |
uint8_t serial_addr, | |
const uint8_t * write_buffer, | |
uint16_t write_size, | |
uint8_t options | |
); | |
/*-------------------------------------------------------------------------*//** | |
I2C master read. | |
------------------------------------------------------------------------------ | |
This function initiates an I2C master read transaction. This function returns | |
immediately after initiating the transaction. | |
The content of the read buffer passed as parameter should not be modified | |
until the read transaction completes. It also means that the memory allocated | |
for the read buffer should not be freed or go out of scope before the read | |
completes. You can check for the read transaction completion using the | |
MSS_I2C_status() function. | |
------------------------------------------------------------------------------ | |
@param this_i2c: | |
The this_i2c parameter is a pointer to an mss_i2c_instance_t structure | |
identifying the MSS I2C hardware block that will perform the requested | |
function. There are two such data structures, g_mss_i2c0 and g_mss_i2c1, | |
associated with MSS I2C 0 and MSS I2C 1 respectively. This parameter must | |
point to either the g_mss_i2c0 or g_mss_i2c1 global data structure defined | |
within the I2C driver. | |
@param serial_addr: | |
This parameter specifies the serial address of the target I2C device. | |
@param read_buffer | |
Pointer to a buffer where the data received from the target device will be | |
stored. | |
Care must be taken not to release the memory used by this buffer before the | |
read transaction completes. For example, it is not appropriate to return | |
from a function allocating this buffer as an array variable before the read | |
transaction completes as this would result in the buffer's memory being | |
de-allocated from the stack when the function returns. This memory could | |
then be subsequently reallocated resulting in the read transaction | |
corrupting the newly allocated memory. | |
@param read_size: | |
This parameter is the number of bytes to read from the target device. This | |
size must not exceed the size of the read_buffer buffer. | |
@param options: | |
The options parameter is used to indicate if the I2C bus should be released | |
on completion of the read transaction. Using the MSS_I2C_RELEASE_BUS | |
constant for the options parameter causes a STOP bit to be generated at the | |
end of the read transaction causing the bus to be released for other I2C | |
devices to use. Using the MSS_I2C_HOLD_BUS constant as options parameter | |
prevents a STOP bit from being generated at the end of the read transaction, | |
preventing other I2C devices from initiating a bus transaction. | |
*/ | |
void MSS_I2C_read | |
( | |
mss_i2c_instance_t * this_i2c, | |
uint8_t serial_addr, | |
uint8_t * read_buffer, | |
uint16_t read_size, | |
uint8_t options | |
); | |
/*-------------------------------------------------------------------------*//** | |
I2C master write-read | |
------------------------------------------------------------------------------ | |
This function initiates an I2C write-read transaction where data is first | |
written to the target device before issuing a restart condition and changing | |
the direction of the I2C transaction in order to read from the target device. | |
------------------------------------------------------------------------------ | |
@param this_i2c: | |
The this_i2c parameter is a pointer to an mss_i2c_instance_t structure | |
identifying the MSS I2C hardware block that will perform the requested | |
function. There are two such data structures, g_mss_i2c0 and g_mss_i2c1, | |
associated with MSS I2C 0 and MSS I2C 1 respectively. This parameter must | |
point to either the g_mss_i2c0 or g_mss_i2c1 global data structure defined | |
within the I2C driver. | |
@param serial_addr: | |
This parameter specifies the serial address of the target I2C device. | |
@param addr_offset: | |
This parameter is a pointer to the buffer containing the data that will be | |
sent to the slave during the write phase of the write-read transaction. This | |
data is typically used to specify an address offset specifying to the I2C | |
slave device what data it must return during the read phase of the | |
write-read transaction. | |
@param offset_size: | |
This parameter specifies the number of offset bytes to be written during the | |
write phase of the write-read transaction. This is typically the size of the | |
buffer pointed to by the addr_offset parameter. | |
@param read_buffer: | |
This parameter is a pointer to the buffer where the data read from the I2C | |
slave will be stored. | |
@param read_size: | |
This parameter specifies the number of bytes to read from the target I2C | |
slave device. This size must not exceed the size of the buffer pointed to by | |
the read_buffer parameter. | |
@param options: | |
The options parameter is used to indicate if the I2C bus should be released | |
on completion of the write-read transaction. Using the MSS_I2C_RELEASE_BUS | |
constant for the options parameter causes a STOP bit to be generated at the | |
end of the write-read transaction causing the bus to be released for other | |
I2C devices to use. Using the MSS_I2C_HOLD_BUS constant as options parameter | |
prevents a STOP bit from being generated at the end of the write-read | |
transaction, preventing other I2C devices from initiating a bus transaction. | |
*/ | |
void MSS_I2C_write_read | |
( | |
mss_i2c_instance_t * this_i2c, | |
uint8_t serial_addr, | |
const uint8_t * addr_offset, | |
uint16_t offset_size, | |
uint8_t * read_buffer, | |
uint16_t read_size, | |
uint8_t options | |
); | |
/*-------------------------------------------------------------------------*//** | |
I2C status | |
------------------------------------------------------------------------------ | |
This function indicates the current state of a MSS I2C instance. | |
------------------------------------------------------------------------------ | |
@param this_i2c: | |
The this_i2c parameter is a pointer to an mss_i2c_instance_t structure | |
identifying the MSS I2C hardware block that will perform the requested | |
function. There are two such data structures, g_mss_i2c0 and g_mss_i2c1, | |
associated with MSS I2C 0 and MSS I2C 1 respectively. This parameter must | |
point to either the g_mss_i2c0 or g_mss_i2c1 global data structure defined | |
within the I2C driver. | |
------------------------------------------------------------------------------ | |
@return | |
The return value indicates the current state of a MSS I2C instance or the | |
outcome of the previous transaction if no transaction is in progress. | |
Possible return values are: | |
SUCCESS | |
The last I2C transaction has completed successfully. | |
IN_PROGRESS | |
There is an I2C transaction in progress. | |
FAILED | |
The last I2C transaction failed. | |
*/ | |
mss_i2c_status_t MSS_I2C_get_status | |
( | |
mss_i2c_instance_t * this_i2c | |
); | |
/*-------------------------------------------------------------------------*//** | |
Wait for I2C transaction completion. | |
------------------------------------------------------------------------------ | |
This function waits for the current I2C transaction to complete. The return | |
value indicates whether the last I2C transaction was successful, or is still | |
in progress, or failed. | |
------------------------------------------------------------------------------ | |
@param this_i2c: | |
The this_i2c parameter is a pointer to an mss_i2c_instance_t structure | |
identifying the MSS I2C hardware block that will perform the requested | |
function. There are two such data structures, g_mss_i2c0 and g_mss_i2c1, | |
associated with MSS I2C 0 and MSS I2C 1 respectively. This parameter must | |
point to either the g_mss_i2c0 or g_mss_i2c1 global data structure defined | |
within the I2C driver. | |
------------------------------------------------------------------------------ | |
@return | |
The return value indicates the outcome of the last I2C transaction. It can | |
be one of the following: | |
MSS_I2C_SUCCESS | |
The last I2C transaction has completed successfully. | |
MSS_I2C_IN_PROGRESS | |
The current I2C transaction is still in progress. | |
MSS_I2C_FAILED | |
The last I2C transaction failed. | |
*/ | |
mss_i2c_status_t MSS_I2C_wait_complete | |
( | |
mss_i2c_instance_t * this_i2c | |
); | |
/******************************************************************************* | |
******************************************************************************* | |
* | |
* Slave specific functions | |
* | |
* The following functions are only used within the implementation of an I2C | |
* slave device. | |
*/ | |
/*-------------------------------------------------------------------------*//** | |
I2C slave transmit buffer configuration. | |
------------------------------------------------------------------------------ | |
This function specifies the memory buffer holding the data that will be sent | |
to the I2C master when this MSS I2C instance is the target of an I2C read or | |
write-read transaction. | |
------------------------------------------------------------------------------ | |
@param this_i2c: | |
The this_i2c parameter is a pointer to an mss_i2c_instance_t structure | |
identifying the MSS I2C hardware block that will perform the requested | |
function. There are two such data structures, g_mss_i2c0 and g_mss_i2c1, | |
associated with MSS I2C 0 and MSS I2C 1 respectively. This parameter must | |
point to either the g_mss_i2c0 or g_mss_i2c1 global data structure defined | |
within the I2C driver. | |
@param tx_buffer: | |
This parameter is a pointer to the memory buffer holding the data to be | |
returned to the I2C master when this MSS I2C instance is the target of an | |
I2C read or write-read transaction. | |
@param tx_size: | |
Size of the transmit buffer pointed to by the tx_buffer parameter. | |
*/ | |
void MSS_I2C_set_slave_tx_buffer | |
( | |
mss_i2c_instance_t * this_i2c, | |
uint8_t * tx_buffer, | |
uint16_t tx_size | |
); | |
/*-------------------------------------------------------------------------*//** | |
I2C slave receive buffer configuration. | |
------------------------------------------------------------------------------ | |
This function specifies the memory buffer that will be used by the MSS I2C | |
instance to receive data when it is a slave. This buffer is the memory where | |
data will be stored when the MSS I2C is the target of an I2C master write | |
transaction (i.e. when it is the slave). | |
------------------------------------------------------------------------------ | |
@param this_i2c: | |
The this_i2c parameter is a pointer to an mss_i2c_instance_t structure | |
identifying the MSS I2C hardware block that will perform the requested | |
function. There are two such data structures, g_mss_i2c0 and g_mss_i2c1, | |
associated with MSS I2C 0 and MSS I2C 1 respectively. This parameter must | |
point to either the g_mss_i2c0 or g_mss_i2c1 global data structure defined | |
within the I2C driver. | |
@param rx_buffer: | |
This parameter is a pointer to the memory buffer allocated by the caller | |
software to be used as a slave receive buffer. | |
@param rx_size: | |
Size of the slave receive buffer. This is the amount of memory that is | |
allocated to the buffer pointed to by rx_buffer. | |
Note: This buffer size will indirectly specify the maximum I2C write | |
transaction length this MSS I2C instance can be the target of. This | |
is because this MSS I2C instance will respond to further received | |
bytes with a non-acknowledge bit (NACK) as soon as its receive | |
buffer is full. This will cause the write transaction to fail. | |
*/ | |
void MSS_I2C_set_slave_rx_buffer | |
( | |
mss_i2c_instance_t * this_i2c, | |
uint8_t * rx_buffer, | |
uint16_t rx_size | |
); | |
/*-------------------------------------------------------------------------*//** | |
I2C slave memory offset length configuration. | |
------------------------------------------------------------------------------ | |
This function is used as part of the configuration of a MSS I2C instance for | |
operation as a slave supporting write-read transactions. It specifies the | |
number of bytes expected as part of the write phase of a write-read | |
transaction. The bytes received during the write phase of a write-read | |
transaction will be interpreted as an offset into the slave’s transmit buffer. | |
This allows random access into the I2C slave transmit buffer from a remote | |
I2C master. | |
------------------------------------------------------------------------------ | |
@param this_i2c: | |
The this_i2c parameter is a pointer to an mss_i2c_instance_t structure | |
identifying the MSS I2C hardware block that will perform the requested | |
function. There are two such data structures, g_mss_i2c0 and g_mss_i2c1, | |
associated with MSS I2C 0 and MSS I2C 1 respectively. This parameter must | |
point to either the g_mss_i2c0 or g_mss_i2c1 global data structure defined | |
within the I2C driver. | |
@param offset_length: | |
The offset_length parameter configures the number of bytes to be interpreted | |
by the MSS I2C slave as a memory offset value during the write phase of | |
write-read transactions. | |
*/ | |
void MSS_I2C_set_slave_mem_offset_length | |
( | |
mss_i2c_instance_t * this_i2c, | |
uint8_t offset_length | |
); | |
/*-------------------------------------------------------------------------*//** | |
I2C write handler registration. | |
------------------------------------------------------------------------------ | |
Register the function that will be called to process the data written to this | |
MSS I2C instance when it is the slave in an I2C write transaction. | |
Note: The write handler is not called as a result of a write-read transaction. | |
The write data of a write read transaction is interpreted as an offset | |
into the slave’s transmit buffer and handled by the driver. | |
------------------------------------------------------------------------------ | |
@param this_i2c: | |
The this_i2c parameter is a pointer to an mss_i2c_instance_t structure | |
identifying the MSS I2C hardware block that will perform the requested | |
function. There are two such data structures, g_mss_i2c0 and g_mss_i2c1, | |
associated with MSS I2C 0 and MSS I2C 1 respectively. This parameter must | |
point to either the g_mss_i2c0 or g_mss_i2c1 global data structure defined | |
within the I2C driver. | |
@param handler: | |
Pointer to the function that will process the I2C write request. | |
*/ | |
void MSS_I2C_register_write_handler | |
( | |
mss_i2c_instance_t * this_i2c, | |
mss_i2c_slave_wr_handler_t handler | |
); | |
/*-------------------------------------------------------------------------*//** | |
I2C slave receive enable. | |
------------------------------------------------------------------------------ | |
Enables the MSS I2C instance identified through the this_i2c parameter to | |
receive data when it is the target of an I2C write or write-read transaction. | |
------------------------------------------------------------------------------ | |
@param this_i2c: | |
The this_i2c parameter is a pointer to an mss_i2c_instance_t structure | |
identifying the MSS I2C hardware block that will perform the requested | |
function. There are two such data structures, g_mss_i2c0 and g_mss_i2c1, | |
associated with MSS I2C 0 and MSS I2C 1 respectively. This parameter must | |
point to either the g_mss_i2c0 or g_mss_i2c1 global data structure defined | |
within the I2C driver. | |
*/ | |
void MSS_I2C_enable_slave_rx | |
( | |
mss_i2c_instance_t * this_i2c | |
); | |
#ifdef __cplusplus | |
} | |
#endif | |
#endif /*MSS_I2C_H_*/ |