118 lines
3.3 KiB
C
118 lines
3.3 KiB
C
/*
|
|
* Copyright (c) 2016 Intel Corporation
|
|
*
|
|
* SPDX-License-Identifier: Apache-2.0
|
|
*/
|
|
|
|
/**
|
|
* @brief Header file for Atmel SAM3 I2C/TWI driver.
|
|
*
|
|
* Contains register definitions for the TWI controller.
|
|
* This uses TWI instead of I2C to align with the datasheet.
|
|
*/
|
|
|
|
#ifndef _DRIVERS_I2C_ATMEL_SAM3_H_
|
|
#define _DRIVERS_I2C_ATMEL_SAM3_H_
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
/*
|
|
* Control Register
|
|
*/
|
|
#define TWI_CR_START (1 << 0) /* START for read */
|
|
#define TWI_CR_STOP (1 << 1) /* Send STOP */
|
|
#define TWI_CR_MSEN (1 << 2) /* Master enable */
|
|
#define TWI_CR_MSDIS (1 << 3) /* Master disable */
|
|
#define TWI_CR_SVEN (1 << 4) /* Slave enable */
|
|
#define TWI_CR_SVDIS (1 << 5) /* Slave disable */
|
|
#define TWI_CR_QUICK (1 << 6) /* SMBUS quick command */
|
|
#define TWI_CR_SWRST (1 << 7) /* Software reset */
|
|
|
|
/*
|
|
* Master Mode Register
|
|
*/
|
|
#define TWI_MMR_MREAD (1 << 12) /* 0 for write, 1 for read */
|
|
|
|
/* IADR is for internal address. This specifies how many bytes to use. */
|
|
#define TWI_MMR_IADRSZ_POS (8)
|
|
#define TWI_MMR_IADRSZ_MASK (3 << TWI_MMR_IADRSZ_POS)
|
|
#define TWI_MMR_IADRSZ_1_BYTE (1 << 8)
|
|
#define TWI_MMR_IADRSZ_2_BYTE (2 << 8)
|
|
#define TWI_MMR_IADRSZ_3_BYTE (3 << 8)
|
|
|
|
/* DADR is for destination (slave) address in master mode */
|
|
#define TWI_MMR_DADR_POS (16)
|
|
#define TWI_MMR_DADR_MASK (0x7F << TWI_MMR_DADR_POS)
|
|
|
|
/*
|
|
* Slave Mode Register
|
|
*/
|
|
#define TWI_MMR_SADR_POS (16)
|
|
#define TWI_MMR_SADR_MASK (0x7F << TWI_MMR_DADR_POS)
|
|
|
|
/*
|
|
* Internal Address Register
|
|
*/
|
|
#define TWI_IADR_POS (0)
|
|
#define TWI_IADR_MASK (0xFFFFFF << TWI_IADR_POS)
|
|
|
|
/*
|
|
* Clock Waveform Generator Register
|
|
*/
|
|
#define TWI_CWGR_CKDIV_POS (16)
|
|
#define TWI_CWGR_CKDIV_MSGK (0x07 << TWI_CWGR_CKDIV_POS)
|
|
|
|
#define TWI_CWGR_CHDIV_POS (8)
|
|
#define TWI_CWGR_CHDIV_MASK (0xFF << TWI_CWGR_CHDIV_POS)
|
|
|
|
#define TWI_CWGR_CLDIV_POS (0)
|
|
#define TWI_CWGR_CLDIV_MASK (0xFF << TWI_CWGR_CLDIV_POS)
|
|
|
|
/*
|
|
* Status (SR),
|
|
* Interrupt Enable (IER),
|
|
* Interrupt Disable (IDR),
|
|
* Interrupt Mask (IMR) registers
|
|
*/
|
|
#define TWI_IRQ_TXCOMP (1 << 0) /* Transfer complete */
|
|
#define TWI_IRQ_RXRDY (1 << 1) /* RX ready */
|
|
#define TWI_IRQ_TXRDY (1 << 2) /* TX ready */
|
|
#define TWI_IRQ_SVREAD (1 << 3) /* Slave read */
|
|
#define TWI_IRQ_SVACC (1 << 4) /* Slave access */
|
|
#define TWI_IRQ_GACC (1 << 5) /* General call access */
|
|
#define TWI_IRQ_OVRE (1 << 6) /* Overrun error */
|
|
#define TWI_IRQ_NACK (1 << 8) /* No ACK */
|
|
#define TWI_IRQ_ARBLST (1 << 9) /* Arbitration lost */
|
|
#define TWI_IRQ_SCLWS (1 << 10) /* Clock wait state */
|
|
#define TWI_IRQ_EOSACC (1 << 11) /* End of slave access */
|
|
#define TWI_IRQ_ENDRX (1 << 12) /* End of RX buffer (PDC) */
|
|
#define TWI_IRQ_ENDTX (1 << 13) /* End of TX buffer (PDC) */
|
|
#define TWI_IRQ_RXBUFF (1 << 14) /* RX buffer full (PDC) */
|
|
#define TWI_IRQ_TXBUFE (1 << 15) /* TX buffer full (PDC) */
|
|
|
|
#define TWI_IRQ_PDC \
|
|
(TWI_IRQ_ENDRX | TWI_IRQ_ENDTX | TWI_IRQ_RXBUFF | TWI_IRQ_TXBUFE)
|
|
|
|
/* Bits to disable all interrupts */
|
|
#define TWI_IRQ_DISABLE (0x0000FF77)
|
|
|
|
/*
|
|
* Receive Holding Register
|
|
*/
|
|
#define TWI_RHR_POS (0)
|
|
#define TWI_RHR_MASK (0xFF << TWI_RHR_POS)
|
|
|
|
/*
|
|
* Transmit Holding Register
|
|
*/
|
|
#define TWI_THR_POS (0)
|
|
#define TWI_THR_MASK (0xFF << TWI_THR_POS)
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
#endif /* _DRIVERS_I2C_ATMEL_SAM3H_ */
|