1 /*
2  * @brief LPC15xx I2C slave driver
3  *
4  * @note
5  * Copyright(C) NXP Semiconductors, 2014
6  * All rights reserved.
7  *
8  * @par
9  * Software that is described herein is for illustrative purposes only
10  * which provides customers with programming information regarding the
11  * LPC products.  This software is supplied "AS IS" without any warranties of
12  * any kind, and NXP Semiconductors and its licensor disclaim any and
13  * all warranties, express or implied, including all implied warranties of
14  * merchantability, fitness for a particular purpose and non-infringement of
15  * intellectual property rights.  NXP Semiconductors assumes no responsibility
16  * or liability for the use of the software, conveys no license or rights under any
17  * patent, copyright, mask work right, or any other intellectual property rights in
18  * or to any products. NXP Semiconductors reserves the right to make changes
19  * in the software without notification. NXP Semiconductors also makes no
20  * representation or warranty that such application will be suitable for the
21  * specified use without further testing or modification.
22  *
23  * @par
24  * Permission to use, copy, modify, and distribute this software and its
25  * documentation is hereby granted, under NXP Semiconductors' and its
26  * licensor's relevant copyrights in the software, without fee, provided that it
27  * is used in conjunction with NXP Semiconductors microcontrollers.  This
28  * copyright, permission, and disclaimer notice must appear in all copies of
29  * this code.
30  */
31 
32 #include "chip.h"
33 
34 /*****************************************************************************
35  * Private types/enumerations/variables
36  ****************************************************************************/
37 
38 /*****************************************************************************
39  * Public types/enumerations/variables
40  ****************************************************************************/
41 
42 /*****************************************************************************
43  * Private functions
44  ****************************************************************************/
45 
46 /*****************************************************************************
47  * Public functions
48  ****************************************************************************/
49 
50 /* Slave transfer state change handler */
Chip_I2CS_XferHandler(LPC_I2C_T * pI2C,const I2CS_XFER_T * xfers)51 uint32_t Chip_I2CS_XferHandler(LPC_I2C_T *pI2C, const I2CS_XFER_T *xfers)
52 {
53 	uint32_t done = 0;
54 
55 	uint8_t data;
56 	uint32_t state;
57 
58 	/* transfer complete? */
59 	if ((Chip_I2C_GetPendingInt(pI2C) & I2C_INTENSET_SLVDESEL) != 0) {
60 		Chip_I2CS_ClearStatus(pI2C, I2C_STAT_SLVDESEL);
61 		xfers->slaveDone();
62 	}
63 	else {
64 		/* Determine the current I2C slave state */
65 		state = Chip_I2CS_GetSlaveState(pI2C);
66 
67 		switch (state) {
68 		case I2C_STAT_SLVCODE_ADDR:		/* Slave address received */
69 			/* Get slave address that needs servicing */
70 			data = Chip_I2CS_GetSlaveAddr(pI2C, Chip_I2CS_GetSlaveMatchIndex(pI2C));
71 
72 			/* Call address callback */
73 			xfers->slaveStart(data);
74 			break;
75 
76 		case I2C_STAT_SLVCODE_RX:		/* Data byte received */
77 			/* Get received data */
78 			data = Chip_I2CS_ReadByte(pI2C);
79 			done = xfers->slaveRecv(data);
80 			break;
81 
82 		case I2C_STAT_SLVCODE_TX:		/* Get byte that needs to be sent */
83 			/* Get data to send */
84 			done = xfers->slaveSend(&data);
85 			Chip_I2CS_WriteByte(pI2C, data);
86 			break;
87 		}
88 	}
89 
90 	if (done == 0) {
91 		Chip_I2CS_SlaveContinue(pI2C);
92 	}
93 	else {
94 		Chip_I2CS_SlaveNACK(pI2C);
95 	}
96 
97 	return done;
98 }
99