15 volatile uint32_t I2CMasterState = I2C_IDLE;
16 volatile uint32_t I2CSlaveState = I2C_IDLE;
18 volatile uint32_t I2CMode;
20 volatile uint8_t I2CMasterBuffer[BUFSIZE];
21 volatile uint8_t I2CSlaveBuffer[BUFSIZE];
22 volatile uint32_t I2CCount = 0;
23 volatile uint32_t I2CReadLength;
24 volatile uint32_t I2CWriteLength;
26 volatile uint32_t RdIndex = 0;
27 volatile uint32_t WrIndex = 0;
48 void I2C_IRQHandler(
void)
53 StatValue = LPC_I2C->STAT;
58 LPC_I2C->DAT = I2CMasterBuffer[WrIndex++];
59 LPC_I2C->CONCLR = (I2CONCLR_SIC | I2CONCLR_STAC);
60 I2CMasterState = I2C_STARTED;
66 LPC_I2C->DAT = I2CMasterBuffer[WrIndex++];
67 LPC_I2C->CONCLR = (I2CONCLR_SIC | I2CONCLR_STAC);
68 I2CMasterState = I2C_RESTARTED;
72 if ( I2CMasterState == I2C_STARTED )
74 LPC_I2C->DAT = I2CMasterBuffer[WrIndex++];
75 I2CMasterState = DATA_ACK;
77 LPC_I2C->CONCLR = I2CONCLR_SIC;
82 if ( WrIndex < I2CWriteLength )
84 LPC_I2C->DAT = I2CMasterBuffer[WrIndex++];
85 I2CMasterState = DATA_ACK;
89 if ( I2CReadLength != 0 )
91 LPC_I2C->CONSET = I2CONSET_STA;
92 I2CMasterState = I2C_REPEATED_START;
96 I2CMasterState = DATA_NACK;
97 LPC_I2C->CONSET = I2CONSET_STO;
100 LPC_I2C->CONCLR = I2CONCLR_SIC;
104 if ( I2CReadLength == 1 )
107 LPC_I2C->CONCLR = I2CONCLR_AAC;
112 LPC_I2C->CONSET = I2CONSET_AA;
114 LPC_I2C->CONCLR = I2CONCLR_SIC;
118 I2CSlaveBuffer[RdIndex++] = LPC_I2C->DAT;
119 if ( RdIndex < I2CReadLength )
121 I2CMasterState = DATA_ACK;
122 LPC_I2C->CONSET = I2CONSET_AA;
126 I2CMasterState = DATA_NACK;
127 LPC_I2C->CONCLR = I2CONCLR_AAC;
129 LPC_I2C->CONCLR = I2CONCLR_SIC;
133 I2CSlaveBuffer[RdIndex++] = LPC_I2C->DAT;
134 I2CMasterState = DATA_NACK;
135 LPC_I2C->CONSET = I2CONSET_STO;
136 LPC_I2C->CONCLR = I2CONCLR_SIC;
141 LPC_I2C->CONCLR = I2CONCLR_SIC;
142 I2CMasterState = DATA_NACK;
148 LPC_I2C->CONCLR = I2CONCLR_SIC;
165 uint32_t I2CStart(
void )
167 uint32_t timeout = 0;
168 uint32_t retVal = FALSE;
171 LPC_I2C->CONSET = I2CONSET_STA;
176 if ( I2CMasterState == I2C_STARTED )
181 if ( timeout >= MAX_TIMEOUT )
201 uint32_t I2CStop(
void )
203 LPC_I2C->CONSET = I2CONSET_STO;
204 LPC_I2C->CONCLR = I2CONCLR_SIC;
207 while( LPC_I2C->CONSET & I2CONSET_STO );
221 uint32_t I2CInit( uint32_t I2cMode )
229 LPC_SYSCON->PRESETCTRL |= (0x1<<1);
231 LPC_SYSCON->PRESETCTRL |= (0x1<<0);
233 LPC_SYSCON->SYSAHBCLKCTRL |= (1<<5);
234 LPC_IOCON->PIO0_4 &= ~0x3F;
235 LPC_IOCON->PIO0_4 |= 0x01;
236 LPC_IOCON->PIO0_5 &= ~0x3F;
237 LPC_IOCON->PIO0_5 |= 0x01;
240 LPC_I2C->CONCLR = I2CONCLR_AAC | I2CONCLR_SIC | I2CONCLR_STAC | I2CONCLR_I2ENC;
244 LPC_IOCON->PIO0_4 |= (0x1<<9);
245 LPC_IOCON->PIO0_5 |= (0x1<<9);
246 LPC_I2C->SCLL = I2SCLL_HS_SCLL;
247 LPC_I2C->SCLH = I2SCLH_HS_SCLH;
253 if ( I2cMode == I2CSLAVE )
255 LPC_I2C->ADR0 = PCF8594_ADDR;
259 NVIC_EnableIRQ(I2C_IRQn);
261 LPC_I2C->CONSET = I2CONSET_I2EN;
282 uint32_t I2CEngine(
void )
284 I2CMasterState = I2C_IDLE;
287 if ( I2CStart() != TRUE )
295 if ( I2CMasterState == DATA_NACK )