17
17
#include "cmsis.h"
18
18
#include "pinmap.h"
19
19
20
+ #if DEVICE_I2C
21
+
20
22
static const SWM_Map SWM_I2C_SDA [] = {
21
23
{7 , 24 },
22
24
};
@@ -75,6 +77,10 @@ void i2c_init(i2c_t *obj, PinName sda, PinName scl) {
75
77
i2c_interface_enable (obj );
76
78
}
77
79
80
+ //Actually Wrong. Spec says: First store Address in DAT before setting STA !
81
+ //Undefined state when using single byte I2C operations and too much delay
82
+ //between i2c_start and do_i2c_write(Address).
83
+ //Also note that lpc812 will immediately continue reading a byte when Address b0 == 1
78
84
inline int i2c_start (i2c_t * obj ) {
79
85
int status = 0 ;
80
86
if (repeated_start ) {
@@ -86,16 +92,15 @@ inline int i2c_start(i2c_t *obj) {
86
92
return status ;
87
93
}
88
94
89
-
90
-
91
95
//Generate Stop condition and wait until bus is Idle
92
96
//Will also send NAK for previous RD
93
97
inline int i2c_stop (i2c_t * obj ) {
94
98
int timeout = 0 ;
95
99
96
100
obj -> i2c -> MSTCTL = (1 << 2 ) | (1 << 0 ); // STP bit and Continue bit. Sends NAK to complete previous RD
97
101
98
- while ((obj -> i2c -> STAT & ((7 << 1 ) | (1 << 0 ))) != ((0 << 1 ) | (1 << 0 ))) { //Spin until Ready (b0 == 1)and Status is Idle (b3..b1 == 000)
102
+ //Spin until Ready (b0 == 1)and Status is Idle (b3..b1 == 000)
103
+ while ((obj -> i2c -> STAT & ((7 << 1 ) | (1 << 0 ))) != ((0 << 1 ) | (1 << 0 ))) {
99
104
timeout ++ ;
100
105
if (timeout > 100000 ) return 1 ;
101
106
}
@@ -265,3 +270,244 @@ int i2c_byte_write(i2c_t *obj, int data) {
265
270
266
271
return ack ;
267
272
}
273
+
274
+ #if DEVICE_I2CSLAVE
275
+
276
+ #define I2C_SLVDAT (x ) (x->i2c->SLVDAT)
277
+ #define I2C_SLVSTAT (x ) ((x->i2c->STAT >> 9) & (0x03))
278
+ #define I2C_SLVSI (x ) ((x->i2c->STAT >> 8) & (0x01))
279
+ //#define I2C_SLVCNT(x) (x->i2c->SLVCTL = (1 << 0))
280
+ //#define I2C_SLVNAK(x) (x->i2c->SLVCTL = (1 << 1))
281
+
282
+ #if (0 )
283
+ // Wait until the Slave Serial Interrupt (SI) is set
284
+ // Timeout when it takes too long.
285
+ static int i2c_wait_slave_SI (i2c_t * obj ) {
286
+ int timeout = 0 ;
287
+ while (!(obj -> i2c -> STAT & (1 << 8 ))) {
288
+ timeout ++ ;
289
+ if (timeout > 100000 ) return -1 ;
290
+ }
291
+ return 0 ;
292
+ }
293
+ #endif
294
+
295
+ void i2c_slave_mode (i2c_t * obj , int enable_slave ) {
296
+
297
+ if (enable_slave ) {
298
+ // obj->i2c->CFG &= ~(1 << 0); //Disable Master mode
299
+ obj -> i2c -> CFG |= (1 << 1 ); //Enable Slave mode
300
+ }
301
+ else {
302
+ // obj->i2c->CFG |= (1 << 0); //Enable Master mode
303
+ obj -> i2c -> CFG &= ~(1 << 1 ); //Disable Slave mode
304
+ }
305
+ }
306
+
307
+ // Wait for next I2C event and find out what is going on
308
+ //
309
+ int i2c_slave_receive (i2c_t * obj ) {
310
+ int addr ;
311
+
312
+ // Check if there is any data pending
313
+ if (! I2C_SLVSI (obj )) {
314
+ return 0 ; //NoData
315
+ };
316
+
317
+ // Check State
318
+ switch (I2C_SLVSTAT (obj )) {
319
+ case 0x0 : // Slave address plus R/W received
320
+ // At least one of the four slave addresses has been matched by hardware.
321
+ // You can figure out which address by checking Slave address match Index in STAT register.
322
+
323
+ // Get the received address
324
+ addr = I2C_SLVDAT (obj ) & 0xFF ;
325
+ // Send ACK on address and Continue
326
+ obj -> i2c -> SLVCTL = (1 << 0 );
327
+
328
+ if (addr == 0x00 ) {
329
+ return 2 ; //WriteGeneral
330
+ }
331
+ //check the RW bit
332
+ if ((addr & 0x01 ) == 0x01 ) {
333
+ return 1 ; //ReadAddressed
334
+ }
335
+ else {
336
+ return 3 ; //WriteAddressed
337
+ }
338
+ //break;
339
+
340
+ case 0x1 : // Slave receive. Received data is available (Slave Receiver mode).
341
+ // Oops, should never get here...
342
+ obj -> i2c -> SLVCTL = (1 << 1 ); // Send NACK on received data, try to recover...
343
+ return 0 ; //NoData
344
+
345
+ case 0x2 : // Slave transmit. Data can be transmitted (Slave Transmitter mode).
346
+ // Oops, should never get here...
347
+ I2C_SLVDAT (obj ) = 0xFF ; // Send dummy data for transmission
348
+ obj -> i2c -> SLVCTL = (1 << 0 ); // Continue and try to recover...
349
+ return 0 ; //NoData
350
+
351
+ case 0x3 : // Reserved.
352
+ default : // Oops, should never get here...
353
+ obj -> i2c -> SLVCTL = (1 << 0 ); // Continue and try to recover...
354
+ return 0 ; //NoData
355
+ //break;
356
+ } //switch status
357
+ }
358
+
359
+ // The dedicated I2C Slave byte read and byte write functions need to be called
360
+ // from 'common' mbed I2CSlave API for devices that have separate Master and
361
+ // Slave engines such as the lpc812 and lpc1549.
362
+
363
+ //Called when Slave is addressed for Write, Slave will receive Data in polling mode
364
+ //Parameter last=1 means received byte will be NACKed.
365
+ int i2c_slave_byte_read (i2c_t * obj , int last ) {
366
+ int data ;
367
+
368
+ // Wait for data
369
+ while (!I2C_SLVSI (obj )); // Wait forever
370
+ //if (i2c_wait_slave_SI(obj) != 0) {return -2;} // Wait with timeout
371
+
372
+ // Dont bother to check State, were not returning it anyhow..
373
+ //if (I2C_SLVSTAT(obj)) == 0x01) {
374
+ // Slave receive. Received data is available (Slave Receiver mode).
375
+ //};
376
+
377
+ data = I2C_SLVDAT (obj ) & 0xFF ; // Get and store the received data
378
+ if (last ) {
379
+ obj -> i2c -> SLVCTL = (1 << 1 ); // Send NACK on received data and Continue
380
+ }
381
+ else {
382
+ obj -> i2c -> SLVCTL = (1 << 0 ); // Send ACK on data and Continue to read
383
+ }
384
+
385
+ return data ;
386
+ }
387
+
388
+
389
+ //Called when Slave is addressed for Read, Slave will send Data in polling mode
390
+ //
391
+ int i2c_slave_byte_write (i2c_t * obj , int data ) {
392
+
393
+ // Wait until Ready
394
+ while (!I2C_SLVSI (obj )); // Wait forever
395
+ // if (i2c_wait_slave_SI(obj) != 0) {return -2;} // Wait with timeout
396
+
397
+ // Check State
398
+ switch (I2C_SLVSTAT (obj )) {
399
+ case 0x0 : // Slave address plus R/W received
400
+ // At least one of the four slave addresses has been matched by hardware.
401
+ // You can figure out which address by checking Slave address match Index in STAT register.
402
+ // I2C Restart occurred
403
+ return -1 ;
404
+ //break;
405
+ case 0x1 : // Slave receive. Received data is available (Slave Receiver mode).
406
+ // Should not get here...
407
+ return -2 ;
408
+ //break;
409
+ case 0x2 : // Slave transmit. Data can be transmitted (Slave Transmitter mode).
410
+ I2C_SLVDAT (obj ) = data & 0xFF ; // Store the data for transmission
411
+ obj -> i2c -> SLVCTL = (1 << 0 ); // Continue to send
412
+
413
+ return 1 ;
414
+ //break;
415
+ case 0x3 : // Reserved.
416
+ default :
417
+ // Should not get here...
418
+ return -3 ;
419
+ //break;
420
+ } // switch status
421
+ }
422
+
423
+
424
+ //Called when Slave is addressed for Write, Slave will receive Data in polling mode
425
+ //Parameter length (>=1) is the maximum allowable number of bytes. All bytes will be ACKed.
426
+ int i2c_slave_read (i2c_t * obj , char * data , int length ) {
427
+ int count = 0 ;
428
+
429
+ // Read and ACK all expected bytes
430
+ while (count < length ) {
431
+ // Wait for data
432
+ while (!I2C_SLVSI (obj )); // Wait forever
433
+ // if (i2c_wait_slave_SI(obj) != 0) {return -2;} // Wait with timeout
434
+
435
+ // Check State
436
+ switch (I2C_SLVSTAT (obj )) {
437
+ case 0x0 : // Slave address plus R/W received
438
+ // At least one of the four slave addresses has been matched by hardware.
439
+ // You can figure out which address by checking Slave address match Index in STAT register.
440
+ // I2C Restart occurred
441
+ return -1 ;
442
+ //break;
443
+
444
+ case 0x1 : // Slave receive. Received data is available (Slave Receiver mode).
445
+ data [count ] = I2C_SLVDAT (obj ) & 0xFF ; // Get and store the received data
446
+ obj -> i2c -> SLVCTL = (1 << 0 ); // Send ACK on data and Continue to read
447
+ break ;
448
+
449
+ case 0x2 : // Slave transmit. Data can be transmitted (Slave Transmitter mode).
450
+ case 0x3 : // Reserved.
451
+ default : // Should never get here...
452
+ return -2 ;
453
+ //break;
454
+ } // switch status
455
+
456
+ count ++ ;
457
+ } // for all bytes
458
+
459
+ return count ; // Received the expected number of bytes
460
+ }
461
+
462
+
463
+ //Called when Slave is addressed for Read, Slave will send Data in polling mode
464
+ //Parameter length (>=1) is the maximum number of bytes. Exit when Slave byte is NACKed.
465
+ int i2c_slave_write (i2c_t * obj , const char * data , int length ) {
466
+ int count ;
467
+
468
+ // Send and all bytes or Exit on NAK
469
+ for (count = 0 ; count < length ; count ++ ) {
470
+ // Wait until Ready for data
471
+ while (!I2C_SLVSI (obj )); // Wait forever
472
+ // if (i2c_wait_slave_SI(obj) != 0) {return -2;} // Wait with timeout
473
+
474
+ // Check State
475
+ switch (I2C_SLVSTAT (obj )) {
476
+ case 0x0 : // Slave address plus R/W received
477
+ // At least one of the four slave addresses has been matched by hardware.
478
+ // You can figure out which address by checking Slave address match Index in STAT register.
479
+ // I2C Restart occurred
480
+ return -1 ;
481
+ //break;
482
+ case 0x1 : // Slave receive. Received data is available (Slave Receiver mode).
483
+ // Should not get here...
484
+ return -2 ;
485
+ //break;
486
+ case 0x2 : // Slave transmit. Data can be transmitted (Slave Transmitter mode).
487
+ I2C_SLVDAT (obj ) = data [count ] & 0xFF ; // Store the data for transmission
488
+ obj -> i2c -> SLVCTL = (1 << 0 ); // Continue to send
489
+ break ;
490
+ case 0x3 : // Reserved.
491
+ default :
492
+ // Should not get here...
493
+ return -3 ;
494
+ //break;
495
+ } // switch status
496
+ } // for all bytes
497
+
498
+ return length ; // Transmitted the max number of bytes
499
+ }
500
+
501
+
502
+ // Set the four slave addresses.
503
+ void i2c_slave_address (i2c_t * obj , int idx , uint32_t address , uint32_t mask ) {
504
+ obj -> i2c -> SLVADR0 = (address & 0xFE ); // Store address in address 0 register
505
+ obj -> i2c -> SLVADR1 = (0x00 & 0xFE ); // Store general call write address in address 1 register
506
+ obj -> i2c -> SLVADR2 = (0x01 ); // Disable address 2 register
507
+ obj -> i2c -> SLVADR3 = (0x01 ); // Disable address 3 register
508
+ obj -> i2c -> SLVQUAL0 = (mask & 0xFE ); // Qualifier mask for address 0 register. Any maskbit that is 1 will always be a match
509
+ }
510
+
511
+ #endif
512
+
513
+ #endif
0 commit comments