| /******************************************************************************* | |
| * (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_*/ |