| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121 |
- /* --------------------------------------------------------------------------
- * Copyright (c) 2013-2016 ARM Limited. All rights reserved.
- *
- * SPDX-License-Identifier: Apache-2.0
- *
- * Licensed under the Apache License, Version 2.0 (the License); you may
- * not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an AS IS BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- * $Date: 02. March 2016
- * $Revision: V2.1
- *
- * Project: I2C Driver Definitions for NXP LPC18xx
- * -------------------------------------------------------------------------- */
- #ifndef __I2C_LPC18XX_H
- #define __I2C_LPC18XX_H
- #include "LPC18xx.h"
- #include "Driver_I2C.h"
- /* Clock Control Unit register */
- #define CCU_CLK_CFG_RUN (1 << 0)
- #define CCU_CLK_CFG_AUTO (1 << 1)
- #define CCU_CLK_STAT_RUN (1 << 0)
- #define CLK_SRC_PLL1 0x09 // I2C clock source
- /* I2C reset value for RGU */
- #define RGU_RESET_I2C0 (1 << 16) // I2C0 reset
- #define RGU_RESET_I2C1 (1 << 17) // I2C1 reset
- /* I2C Driver state flags */
- #define I2C_FLAG_INIT (1 << 0) // Driver initialized
- #define I2C_FLAG_POWER (1 << 1) // Driver power on
- #define I2C_FLAG_SETUP (1 << 2) // Master configured, clock set
- #define I2C_FLAG_SLAVE_RX (1 << 3) // Slave receive registered
- /* I2C Common Control flags */
- #define I2C_CON_AA (1 << 2) // Assert acknowledge bit
- #define I2C_CON_SI (1 << 3) // I2C interrupt bit
- #define I2C_CON_STO (1 << 4) // STOP bit
- #define I2C_CON_STA (1 << 5) // START bit
- #define I2C_CON_I2EN (1 << 6) // I2C interface enable
- #define I2C_CON_FLAGS (I2C_CON_AA | I2C_CON_SI | I2C_CON_STO | I2C_CON_STA)
- /* I2C Stalled Status flags */
- #define I2C_MASTER (1 << 0) // Master stalled
- #define I2C_SLAVE_TX (1 << 1) // Slave stalled on transmit
- #define I2C_SLAVE_RX (1 << 2) // Slave stalled on receive
- #define I2C_SLAVE (I2C_SLAVE_TX | I2C_SLAVE_RX)
- /* I2C Status Miscellaneous states */
- #define I2C_STAT_BUSERR 0x00 // I2C Bus error
- /* I2C Status Master mode */
- #define I2C_STAT_MA_START 0x08 // START transmitted
- #define I2C_STAT_MA_RSTART 0x10 // Repeated START transmitted
- #define I2C_STAT_MA_SLAW_A 0x18 // SLA+W transmitted, ACK received
- #define I2C_STAT_MA_SLAW_NA 0x20 // SLA+W transmitted, no ACK recvd
- #define I2C_STAT_MA_DT_A 0x28 // Data transmitted, ACK received
- #define I2C_STAT_MA_DT_NA 0x30 // Data transmitted, no ACK recvd
- #define I2C_STAT_MA_ALOST 0x38 // Arbitration lost SLA+W or data
- #define I2C_STAT_MA_SLAR_A 0x40 // SLA+R transmitted, ACK received
- #define I2C_STAT_MA_SLAR_NA 0x48 // SLA+R transmitted, no ACK recvd
- #define I2C_STAT_MA_DR_A 0x50 // Data received, ACK returned
- #define I2C_STAT_MA_DR_NA 0x58 // Data received, no ACK returned
- /* I2C Status Slave mode */
- #define I2C_STAT_SL_SLAW_A 0x60 // SLA+W received, ACK returned
- #define I2C_STAT_SL_ALOST_MW 0x68 // Arbitration lost SLA+W in Master mode
- #define I2C_STAT_SL_GCA_A 0x70 // General address recvd, ACK returned
- #define I2C_STAT_SL_ALOST_GC 0x78 // Arbitration lost in General call
- #define I2C_STAT_SL_DR_A 0x80 // Data received, ACK returned
- #define I2C_STAT_SL_DR_NA 0x88 // Data received, no ACK returned
- #define I2C_STAT_SL_DRGC_A 0x90 // Data recvd General call, ACK returned
- #define I2C_STAT_SL_DRGC_NA 0x98 // Data recvd General call, no ACK returned
- #define I2C_STAT_SL_STOP 0xA0 // STOP received while addressed
- #define I2C_STAT_SL_SLAR_A 0xA8 // SLA+R received, ACK returned
- #define I2C_STAT_SL_ALOST_MR 0xB0 // Arbitration lost SLA+R in Master mode
- #define I2C_STAT_SL_DT_A 0xB8 // Data transmitted, ACK received
- #define I2C_STAT_SL_DT_NA 0xC0 // Data transmitted, no ACK received
- #define I2C_STAT_SL_LDT_A 0xC8 // Last data transmitted, ACK received
- /* I2C Control Information */
- typedef struct {
- ARM_I2C_SignalEvent_t cb_event; // Event callback
- ARM_I2C_STATUS status; // Status flags
- uint8_t flags; // Control and state flags
- uint8_t sla_rw; // Slave address and RW bit
- bool pending; // Transfer pending (no STOP)
- uint8_t stalled; // Stall mode status flags
- uint8_t con_aa; // I2C slave CON flag
- int32_t cnt; // Master transfer count
- uint8_t *data; // Master data to transfer
- uint32_t num; // Number of bytes to transfer
- uint8_t *sdata; // Slave data to transfer
- uint32_t snum; // Number of bytes to transfer
- } I2C_CTRL;
- /* I2C Resource Configuration */
- typedef struct {
- LPC_I2Cn_Type *reg; // I2C register interface
- IRQn_Type i2c_ev_irq; // I2C Event IRQ Number
- volatile uint32_t *base_clk_reg; // Base clock register
- volatile uint32_t *pclk_cfg_reg; // Peripheral clock config register
- const volatile uint32_t *pclk_stat_reg; // Peripheral clock status register
- uint32_t rgu_val; // Peripheral reset value
- I2C_CTRL *ctrl; // Run-Time control information
- } const I2C_RESOURCES;
- #endif /* __I2C_LPC18XX_H */
|