1
1
/*
2
2
* Copyright (c) 2015, Freescale Semiconductor, Inc.
3
- * All rights reserved.
3
+ * Copyright 2016-2017 NXP
4
4
*
5
5
* Redistribution and use in source and binary forms, with or without modification,
6
6
* are permitted provided that the following conditions are met:
12
12
* list of conditions and the following disclaimer in the documentation and/or
13
13
* other materials provided with the distribution.
14
14
*
15
- * o Neither the name of Freescale Semiconductor, Inc. nor the names of its
15
+ * o Neither the name of the copyright holder nor the names of its
16
16
* contributors may be used to endorse or promote products derived from this
17
17
* software without specific prior written permission.
18
18
*
@@ -162,6 +162,26 @@ static void I2C_MasterTransferCallbackEDMA(edma_handle_t *handle, void *userData
162
162
result = I2C_MasterStop (i2cPrivateHandle -> base );
163
163
}
164
164
}
165
+ else
166
+ {
167
+ if (i2cPrivateHandle -> handle -> transfer .direction == kI2C_Read )
168
+ {
169
+ /* Change to send NAK at the last byte. */
170
+ i2cPrivateHandle -> base -> C1 |= I2C_C1_TXAK_MASK ;
171
+
172
+ /* Wait the last data to be received. */
173
+ while (!(i2cPrivateHandle -> base -> S & kI2C_TransferCompleteFlag ))
174
+ {
175
+ }
176
+
177
+ /* Change direction to send. */
178
+ i2cPrivateHandle -> base -> C1 |= I2C_C1_TX_MASK ;
179
+
180
+ /* Read the last data byte. */
181
+ * (i2cPrivateHandle -> handle -> transfer .data + i2cPrivateHandle -> handle -> transfer .dataSize - 1 ) =
182
+ i2cPrivateHandle -> base -> D ;
183
+ }
184
+ }
165
185
166
186
i2cPrivateHandle -> handle -> state = kIdleState ;
167
187
@@ -203,7 +223,6 @@ static status_t I2C_InitTransferStateMachineEDMA(I2C_Type *base,
203
223
assert (xfer );
204
224
205
225
status_t result = kStatus_Success ;
206
- uint16_t timeout = UINT16_MAX ;
207
226
208
227
if (handle -> state != kIdleState )
209
228
{
@@ -221,16 +240,6 @@ static status_t I2C_InitTransferStateMachineEDMA(I2C_Type *base,
221
240
222
241
handle -> state = kTransferDataState ;
223
242
224
- /* Wait until ready to complete. */
225
- while ((!(base -> S & kI2C_TransferCompleteFlag )) && (-- timeout ))
226
- {
227
- }
228
-
229
- /* Failed to start the transfer. */
230
- if (timeout == 0 )
231
- {
232
- return kStatus_I2C_Timeout ;
233
- }
234
243
/* Clear all status before transfer. */
235
244
I2C_MasterClearStatusFlags (base , kClearFlags );
236
245
@@ -250,22 +259,55 @@ static status_t I2C_InitTransferStateMachineEDMA(I2C_Type *base,
250
259
result = I2C_MasterStart (base , handle -> transfer .slaveAddress , direction );
251
260
}
252
261
253
- /* Send subaddress. */
254
- if (handle -> transfer .subaddressSize )
262
+ if (result )
255
263
{
256
- do
264
+ return result ;
265
+ }
266
+
267
+ while (!(base -> S & kI2C_IntPendingFlag ))
268
+ {
269
+ }
270
+
271
+ /* Check if there's transfer error. */
272
+ result = I2C_CheckAndClearError (base , base -> S );
273
+
274
+ /* Return if error. */
275
+ if (result )
276
+ {
277
+ if (result == kStatus_I2C_Nak )
257
278
{
258
- /* Wait until data transfer complete. */
259
- while (!(base -> S & kI2C_IntPendingFlag ))
279
+ result = kStatus_I2C_Addr_Nak ;
280
+
281
+ if (I2C_MasterStop (base ) != kStatus_Success )
260
282
{
283
+ result = kStatus_I2C_Timeout ;
261
284
}
262
285
286
+ if (handle -> completionCallback )
287
+ {
288
+ (handle -> completionCallback )(base , handle , result , handle -> userData );
289
+ }
290
+ }
291
+
292
+ return result ;
293
+ }
294
+
295
+ /* Send subaddress. */
296
+ if (handle -> transfer .subaddressSize )
297
+ {
298
+ do
299
+ {
263
300
/* Clear interrupt pending flag. */
264
301
base -> S = kI2C_IntPendingFlag ;
265
302
266
303
handle -> transfer .subaddressSize -- ;
267
304
base -> D = ((handle -> transfer .subaddress ) >> (8 * handle -> transfer .subaddressSize ));
268
305
306
+ /* Wait until data transfer complete. */
307
+ while (!(base -> S & kI2C_IntPendingFlag ))
308
+ {
309
+ }
310
+
269
311
/* Check if there's transfer error. */
270
312
result = I2C_CheckAndClearError (base , base -> S );
271
313
@@ -278,34 +320,34 @@ static status_t I2C_InitTransferStateMachineEDMA(I2C_Type *base,
278
320
279
321
if (handle -> transfer .direction == kI2C_Read )
280
322
{
281
- /* Wait until data transfer complete. */
282
- while (!(base -> S & kI2C_IntPendingFlag ))
283
- {
284
- }
285
-
286
323
/* Clear pending flag. */
287
324
base -> S = kI2C_IntPendingFlag ;
288
325
289
326
/* Send repeated start and slave address. */
290
327
result = I2C_MasterRepeatedStart (base , handle -> transfer .slaveAddress , kI2C_Read );
291
- }
292
- }
293
328
294
- if (result )
295
- {
296
- return result ;
297
- }
329
+ if (result )
330
+ {
331
+ return result ;
332
+ }
298
333
299
- /* Wait until data transfer complete. */
300
- while (!(base -> S & kI2C_IntPendingFlag ))
301
- {
334
+ /* Wait until data transfer complete. */
335
+ while (!(base -> S & kI2C_IntPendingFlag ))
336
+ {
337
+ }
338
+
339
+ /* Check if there's transfer error. */
340
+ result = I2C_CheckAndClearError (base , base -> S );
341
+
342
+ if (result )
343
+ {
344
+ return result ;
345
+ }
346
+ }
302
347
}
303
348
304
349
/* Clear pending flag. */
305
350
base -> S = kI2C_IntPendingFlag ;
306
-
307
- /* Check if there's transfer error. */
308
- result = I2C_CheckAndClearError (base , base -> S );
309
351
}
310
352
311
353
return result ;
@@ -319,17 +361,7 @@ static void I2C_MasterTransferEDMAConfig(I2C_Type *base, i2c_master_edma_handle_
319
361
{
320
362
transfer_config .srcAddr = (uint32_t )I2C_GetDataRegAddr (base );
321
363
transfer_config .destAddr = (uint32_t )(handle -> transfer .data );
322
-
323
- /* Send stop if kI2C_TransferNoStop flag is not asserted. */
324
- if (!(handle -> transfer .flags & kI2C_TransferNoStopFlag ))
325
- {
326
- transfer_config .majorLoopCounts = (handle -> transfer .dataSize - 1 );
327
- }
328
- else
329
- {
330
- transfer_config .majorLoopCounts = handle -> transfer .dataSize ;
331
- }
332
-
364
+ transfer_config .majorLoopCounts = (handle -> transfer .dataSize - 1 );
333
365
transfer_config .srcTransferSize = kEDMA_TransferSize1Bytes ;
334
366
transfer_config .srcOffset = 0 ;
335
367
transfer_config .destTransferSize = kEDMA_TransferSize1Bytes ;
@@ -348,6 +380,9 @@ static void I2C_MasterTransferEDMAConfig(I2C_Type *base, i2c_master_edma_handle_
348
380
transfer_config .minorLoopBytes = 1 ;
349
381
}
350
382
383
+ /* Store the initially configured eDMA minor byte transfer count into the I2C handle */
384
+ handle -> nbytes = transfer_config .minorLoopBytes ;
385
+
351
386
EDMA_SubmitTransfer (handle -> dmaHandle , & transfer_config );
352
387
EDMA_StartTransfer (handle -> dmaHandle );
353
388
}
@@ -427,7 +462,7 @@ status_t I2C_MasterTransferEDMA(I2C_Type *base, i2c_master_edma_handle_t *handle
427
462
if (handle -> transfer .direction == kI2C_Read )
428
463
{
429
464
/* Change direction for receive. */
430
- base -> C1 &= ~I2C_C1_TX_MASK ;
465
+ base -> C1 &= ~( I2C_C1_TX_MASK | I2C_C1_TXAK_MASK ) ;
431
466
432
467
/* Read dummy to release the bus. */
433
468
dummy = base -> D ;
@@ -479,6 +514,11 @@ status_t I2C_MasterTransferEDMA(I2C_Type *base, i2c_master_edma_handle_t *handle
479
514
{
480
515
result = I2C_MasterStop (base );
481
516
}
517
+ else
518
+ {
519
+ /* Change direction to send. */
520
+ base -> C1 |= I2C_C1_TX_MASK ;
521
+ }
482
522
483
523
/* Read the last byte of data. */
484
524
if (handle -> transfer .direction == kI2C_Read )
@@ -504,7 +544,9 @@ status_t I2C_MasterTransferGetCountEDMA(I2C_Type *base, i2c_master_edma_handle_t
504
544
505
545
if (kIdleState != handle -> state )
506
546
{
507
- * count = (handle -> transferSize - EDMA_GetRemainingBytes (handle -> dmaHandle -> base , handle -> dmaHandle -> channel ));
547
+ * count = (handle -> transferSize -
548
+ (uint32_t )handle -> nbytes *
549
+ EDMA_GetRemainingMajorLoopCount (handle -> dmaHandle -> base , handle -> dmaHandle -> channel ));
508
550
}
509
551
else
510
552
{
0 commit comments