123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434 |
- /**********************************************************************
- * $Id$ lpc17xx_i2c.h 2010-05-21
- *//**
- * @file lpc17xx_i2c.h
- * @brief Contains all macro definitions and function prototypes
- * support for I2C firmware library on LPC17xx
- * @version 2.0
- * @date 21. May. 2010
- * @author NXP MCU SW Application Team
- *
- * Copyright(C) 2010, NXP Semiconductor
- * All rights reserved.
- *
- ***********************************************************************
- * Software that is described herein is for illustrative purposes only
- * which provides customers with programming information regarding the
- * products. This software is supplied "AS IS" without any warranties.
- * NXP Semiconductors assumes no responsibility or liability for the
- * use of the software, conveys no license or title under any patent,
- * copyright, or mask work right to the product. NXP Semiconductors
- * reserves the right to make changes in the software without
- * notification. NXP Semiconductors also make no representation or
- * warranty that such application will be suitable for the specified
- * use without further testing or modification.
- * Permission to use, copy, modify, and distribute this software and its
- * documentation is hereby granted, under NXP Semiconductors'
- * relevant copyright in the software, without fee, provided that it
- * is used in conjunction with NXP Semiconductors microcontrollers. This
- * copyright, permission, and disclaimer notice must appear in all copies of
- * this code.
- **********************************************************************/
-
- /* Peripheral group ----------------------------------------------------------- */
- /** @defgroup I2C I2C (Inter-IC Control bus)
- * @ingroup LPC1700CMSIS_FwLib_Drivers
- * @{
- */
-
- #ifndef LPC17XX_I2C_H_
- #define LPC17XX_I2C_H_
-
- /* Includes ------------------------------------------------------------------- */
- #include "LPC17xx.h"
- #include "lpc_types.h"
-
-
- #ifdef __cplusplus
- extern "C"
- {
- #endif
-
-
- /* Private Macros ------------------------------------------------------------- */
- /** @defgroup I2C_Private_Macros I2C Private Macros
- * @{
- */
-
- /* --------------------- BIT DEFINITIONS -------------------------------------- */
- /*******************************************************************//**
- * I2C Control Set register description
- *********************************************************************/
- #define I2C_I2CONSET_AA ((0x04)) /*!< Assert acknowledge flag */
- #define I2C_I2CONSET_SI ((0x08)) /*!< I2C interrupt flag */
- #define I2C_I2CONSET_STO ((0x10)) /*!< STOP flag */
- #define I2C_I2CONSET_STA ((0x20)) /*!< START flag */
- #define I2C_I2CONSET_I2EN ((0x40)) /*!< I2C interface enable */
-
- /*******************************************************************//**
- * I2C Control Clear register description
- *********************************************************************/
- /** Assert acknowledge Clear bit */
- #define I2C_I2CONCLR_AAC ((1<<2))
- /** I2C interrupt Clear bit */
- #define I2C_I2CONCLR_SIC ((1<<3))
- /** I2C STOP Clear bit */
- #define I2C_I2CONCLR_STOC ((1<<4))
- /** START flag Clear bit */
- #define I2C_I2CONCLR_STAC ((1<<5))
- /** I2C interface Disable bit */
- #define I2C_I2CONCLR_I2ENC ((1<<6))
-
- /********************************************************************//**
- * I2C Status Code definition (I2C Status register)
- *********************************************************************/
- /* Return Code in I2C status register */
- #define I2C_STAT_CODE_BITMASK ((0xF8))
-
- /* I2C return status code definitions ----------------------------- */
-
- /** No relevant information */
- #define I2C_I2STAT_NO_INF ((0xF8))
-
- /** Bus Error */
- #define I2C_I2STAT_BUS_ERROR ((0x00))
-
- /* Master transmit mode -------------------------------------------- */
- /** A start condition has been transmitted */
- #define I2C_I2STAT_M_TX_START ((0x08))
-
- /** A repeat start condition has been transmitted */
- #define I2C_I2STAT_M_TX_RESTART ((0x10))
-
- /** SLA+W has been transmitted, ACK has been received */
- #define I2C_I2STAT_M_TX_SLAW_ACK ((0x18))
-
- /** SLA+W has been transmitted, NACK has been received */
- #define I2C_I2STAT_M_TX_SLAW_NACK ((0x20))
-
- /** Data has been transmitted, ACK has been received */
- #define I2C_I2STAT_M_TX_DAT_ACK ((0x28))
-
- /** Data has been transmitted, NACK has been received */
- #define I2C_I2STAT_M_TX_DAT_NACK ((0x30))
-
- /** Arbitration lost in SLA+R/W or Data bytes */
- #define I2C_I2STAT_M_TX_ARB_LOST ((0x38))
-
- /* Master receive mode -------------------------------------------- */
- /** A start condition has been transmitted */
- #define I2C_I2STAT_M_RX_START ((0x08))
-
- /** A repeat start condition has been transmitted */
- #define I2C_I2STAT_M_RX_RESTART ((0x10))
-
- /** Arbitration lost */
- #define I2C_I2STAT_M_RX_ARB_LOST ((0x38))
-
- /** SLA+R has been transmitted, ACK has been received */
- #define I2C_I2STAT_M_RX_SLAR_ACK ((0x40))
-
- /** SLA+R has been transmitted, NACK has been received */
- #define I2C_I2STAT_M_RX_SLAR_NACK ((0x48))
-
- /** Data has been received, ACK has been returned */
- #define I2C_I2STAT_M_RX_DAT_ACK ((0x50))
-
- /** Data has been received, NACK has been return */
- #define I2C_I2STAT_M_RX_DAT_NACK ((0x58))
-
- /* Slave receive mode -------------------------------------------- */
- /** Own slave address has been received, ACK has been returned */
- #define I2C_I2STAT_S_RX_SLAW_ACK ((0x60))
-
- /** Arbitration lost in SLA+R/W as master */
- #define I2C_I2STAT_S_RX_ARB_LOST_M_SLA ((0x68))
-
- /** General call address has been received, ACK has been returned */
- #define I2C_I2STAT_S_RX_GENCALL_ACK ((0x70))
-
- /** Arbitration lost in SLA+R/W (GENERAL CALL) as master */
- #define I2C_I2STAT_S_RX_ARB_LOST_M_GENCALL ((0x78))
-
- /** Previously addressed with own SLV address;
- * Data has been received, ACK has been return */
- #define I2C_I2STAT_S_RX_PRE_SLA_DAT_ACK ((0x80))
-
- /** Previously addressed with own SLA;
- * Data has been received and NOT ACK has been return */
- #define I2C_I2STAT_S_RX_PRE_SLA_DAT_NACK ((0x88))
-
- /** Previously addressed with General Call;
- * Data has been received and ACK has been return */
- #define I2C_I2STAT_S_RX_PRE_GENCALL_DAT_ACK ((0x90))
-
- /** Previously addressed with General Call;
- * Data has been received and NOT ACK has been return */
- #define I2C_I2STAT_S_RX_PRE_GENCALL_DAT_NACK ((0x98))
-
- /** A STOP condition or repeated START condition has
- * been received while still addressed as SLV/REC
- * (Slave Receive) or SLV/TRX (Slave Transmit) */
- #define I2C_I2STAT_S_RX_STA_STO_SLVREC_SLVTRX ((0xA0))
-
- /** Slave transmit mode */
- /** Own SLA+R has been received, ACK has been returned */
- #define I2C_I2STAT_S_TX_SLAR_ACK ((0xA8))
-
- /** Arbitration lost in SLA+R/W as master */
- #define I2C_I2STAT_S_TX_ARB_LOST_M_SLA ((0xB0))
-
- /** Data has been transmitted, ACK has been received */
- #define I2C_I2STAT_S_TX_DAT_ACK ((0xB8))
-
- /** Data has been transmitted, NACK has been received */
- #define I2C_I2STAT_S_TX_DAT_NACK ((0xC0))
-
- /** Last data byte in I2DAT has been transmitted (AA = 0);
- ACK has been received */
- #define I2C_I2STAT_S_TX_LAST_DAT_ACK ((0xC8))
-
- /** Time out in case of using I2C slave mode */
- #define I2C_SLAVE_TIME_OUT 0x10000UL
-
- /********************************************************************//**
- * I2C Data register definition
- *********************************************************************/
- /** Mask for I2DAT register*/
- #define I2C_I2DAT_BITMASK ((0xFF))
-
- /** Idle data value will be send out in slave mode in case of the actual
- * expecting data requested from the master is greater than its sending data
- * length that can be supported */
- #define I2C_I2DAT_IDLE_CHAR (0xFF)
-
- /********************************************************************//**
- * I2C Monitor mode control register description
- *********************************************************************/
- #define I2C_I2MMCTRL_MM_ENA ((1<<0)) /**< Monitor mode enable */
- #define I2C_I2MMCTRL_ENA_SCL ((1<<1)) /**< SCL output enable */
- #define I2C_I2MMCTRL_MATCH_ALL ((1<<2)) /**< Select interrupt register match */
- #define I2C_I2MMCTRL_BITMASK ((0x07)) /**< Mask for I2MMCTRL register */
-
- /********************************************************************//**
- * I2C Data buffer register description
- *********************************************************************/
- /** I2C Data buffer register bit mask */
- #define I2DATA_BUFFER_BITMASK ((0xFF))
-
- /********************************************************************//**
- * I2C Slave Address registers definition
- *********************************************************************/
- /** General Call enable bit */
- #define I2C_I2ADR_GC ((1<<0))
-
- /** I2C Slave Address registers bit mask */
- #define I2C_I2ADR_BITMASK ((0xFF))
-
- /********************************************************************//**
- * I2C Mask Register definition
- *********************************************************************/
- /** I2C Mask Register mask field */
- #define I2C_I2MASK_MASK(n) ((n&0xFE))
-
- /********************************************************************//**
- * I2C SCL HIGH duty cycle Register definition
- *********************************************************************/
- /** I2C SCL HIGH duty cycle Register bit mask */
- #define I2C_I2SCLH_BITMASK ((0xFFFF))
-
- /********************************************************************//**
- * I2C SCL LOW duty cycle Register definition
- *********************************************************************/
- /** I2C SCL LOW duty cycle Register bit mask */
- #define I2C_I2SCLL_BITMASK ((0xFFFF))
-
-
- /* I2C status values */
- #define I2C_SETUP_STATUS_ARBF (1<<8) /**< Arbitration false */
- #define I2C_SETUP_STATUS_NOACKF (1<<9) /**< No ACK returned */
- #define I2C_SETUP_STATUS_DONE (1<<10) /**< Status DONE */
-
- /*********************************************************************//**
- * I2C monitor control configuration defines
- **********************************************************************/
- #define I2C_MONITOR_CFG_SCL_OUTPUT I2C_I2MMCTRL_ENA_SCL /**< SCL output enable */
- #define I2C_MONITOR_CFG_MATCHALL I2C_I2MMCTRL_MATCH_ALL /**< Select interrupt register match */
-
- /* ---------------- CHECK PARAMETER DEFINITIONS ---------------------------- */
- /* Macros check I2C slave address */
- #define PARAM_I2C_SLAVEADDR_CH(n) (n<=3)
-
- /** Macro to determine if it is valid SSP port number */
- #define PARAM_I2Cx(n) ((((uint32_t *)n)==((uint32_t *)LPC_I2C0)) \
- || (((uint32_t *)n)==((uint32_t *)LPC_I2C1)) \
- || (((uint32_t *)n)==((uint32_t *)LPC_I2C2)))
-
- /* Macros check I2C monitor configuration type */
- #define PARAM_I2C_MONITOR_CFG(n) ((n==I2C_MONITOR_CFG_SCL_OUTPUT) || (I2C_MONITOR_CFG_MATCHALL))
-
- /* I2C state handle return values */
- #define I2C_OK 0x00
- #define I2C_BYTE_SENT 0x01
- #define I2C_BYTE_RECV 0x02
- #define I2C_LAST_BYTE_RECV 0x04
- #define I2C_SEND_END 0x08
- #define I2C_RECV_END 0x10
- #define I2C_STA_STO_RECV 0x20
-
- #define I2C_ERR (0x10000000)
- #define I2C_NAK_RECV (0x10000000 |0x01)
-
- #define I2C_CheckError(ErrorCode) (ErrorCode & 0x10000000)
-
- /**
- * @}
- */
-
-
-
- /* Public Types --------------------------------------------------------------- */
- /** @defgroup I2C_Public_Types I2C Public Types
- * @{
- */
-
- typedef enum
- {
- I2C_0 = 0,
- I2C_1,
- I2C_2
- } en_I2C_unitId;
-
- typedef enum
- {
- I2C_MASTER_MODE,
- I2C_SLAVE_MODE,
- I2C_GENERAL_MODE,
- } en_I2C_Mode;
- /**
- * @brief I2C Own slave address setting structure
- */
- typedef struct {
- uint8_t SlaveAddrChannel; /**< Slave Address channel in I2C control,
- should be in range from 0..3
- */
- uint8_t SlaveAddr_7bit; /**< Value of 7-bit slave address */
- uint8_t GeneralCallState; /**< Enable/Disable General Call Functionality
- when I2C control being in Slave mode, should be:
- - ENABLE: Enable General Call function.
- - DISABLE: Disable General Call function.
- */
- uint8_t SlaveAddrMaskValue; /**< Any bit in this 8-bit value (bit 7:1)
- which is set to '1' will cause an automatic compare on
- the corresponding bit of the received address when it
- is compared to the SlaveAddr_7bit value associated with this
- mask register. In other words, bits in SlaveAddr_7bit value
- which are masked are not taken into account in determining
- an address match
- */
- } I2C_OWNSLAVEADDR_CFG_Type;
-
-
- /**
- * @brief Master transfer setup data structure definitions
- */
- typedef struct
- {
- uint32_t sl_addr7bit; /**< Slave address in 7bit mode */
- __IO uint8_t* tx_data; /**< Pointer to Transmit data - NULL if data transmit
- is not used */
- uint32_t tx_length; /**< Transmit data length - 0 if data transmit
- is not used*/
- __IO uint32_t tx_count; /**< Current Transmit data counter */
- __IO uint8_t* rx_data; /**< Pointer to Receive data - NULL if data receive
- is not used */
- uint32_t rx_length; /**< Receive data length - 0 if data receive is
- not used */
- __IO uint32_t rx_count; /**< Current Receive data counter */
- uint32_t retransmissions_max; /**< Max Re-Transmission value */
- uint32_t retransmissions_count; /**< Current Re-Transmission counter */
- __IO uint32_t status; /**< Current status of I2C activity */
- void (*callback)(void); /**< Pointer to Call back function when transmission complete
- used in interrupt transfer mode */
- } I2C_M_SETUP_Type;
-
-
- /**
- * @brief Slave transfer setup data structure definitions
- */
- typedef struct
- {
- __IO uint8_t* tx_data;
- uint32_t tx_length;
- __IO uint32_t tx_count;
- __IO uint8_t* rx_data;
- uint32_t rx_length;
- __IO uint32_t rx_count;
- __IO uint32_t status;
- void (*callback)(void);
- } I2C_S_SETUP_Type;
-
- /**
- * @brief Transfer option type definitions
- */
- typedef enum {
- I2C_TRANSFER_POLLING = 0, /**< Transfer in polling mode */
- I2C_TRANSFER_INTERRUPT /**< Transfer in interrupt mode */
- } I2C_TRANSFER_OPT_Type;
-
-
- /**
- * @}
- */
-
-
- /* Public Functions ----------------------------------------------------------- */
- /** @defgroup I2C_Public_Functions I2C Public Functions
- * @{
- */
-
- /* I2C Init/DeInit functions ---------- */
- void I2C_Init(LPC_I2C_TypeDef *I2Cx, uint32_t clockrate);
- void I2C_DeInit(LPC_I2C_TypeDef* I2Cx);
- void I2C_Cmd(LPC_I2C_TypeDef* I2Cx, en_I2C_Mode Mode, FunctionalState NewState);
-
- /* I2C transfer data functions -------- */
- Status I2C_MasterTransferData(LPC_I2C_TypeDef *I2Cx, \
- I2C_M_SETUP_Type *TransferCfg, I2C_TRANSFER_OPT_Type Opt);
- Status I2C_SlaveTransferData(LPC_I2C_TypeDef *I2Cx, \
- I2C_S_SETUP_Type *TransferCfg, I2C_TRANSFER_OPT_Type Opt);
- uint32_t I2C_MasterTransferComplete(LPC_I2C_TypeDef *I2Cx);
- uint32_t I2C_SlaveTransferComplete(LPC_I2C_TypeDef *I2Cx);
-
-
- void I2C_SetOwnSlaveAddr(LPC_I2C_TypeDef *I2Cx, I2C_OWNSLAVEADDR_CFG_Type *OwnSlaveAddrConfigStruct);
- uint8_t I2C_GetLastStatusCode(LPC_I2C_TypeDef* I2Cx);
-
- /* I2C Monitor functions ---------------*/
- void I2C_MonitorModeConfig(LPC_I2C_TypeDef *I2Cx, uint32_t MonitorCfgType, FunctionalState NewState);
- void I2C_MonitorModeCmd(LPC_I2C_TypeDef *I2Cx, FunctionalState NewState);
- uint8_t I2C_MonitorGetDatabuffer(LPC_I2C_TypeDef *I2Cx);
- BOOL_8 I2C_MonitorHandler(LPC_I2C_TypeDef *I2Cx, uint8_t *buffer, uint32_t size);
-
- /* I2C Interrupt handler functions ------*/
- void I2C_IntCmd (LPC_I2C_TypeDef *I2Cx, Bool NewState);
- void I2C_MasterHandler (LPC_I2C_TypeDef *I2Cx);
- void I2C_SlaveHandler (LPC_I2C_TypeDef *I2Cx);
-
-
- /**
- * @}
- */
-
-
- #ifdef __cplusplus
- }
- #endif
-
- #endif /* LPC17XX_I2C_H_ */
-
- /**
- * @}
- */
-
- /* --------------------------------- End Of File ------------------------------ */
|