1 #include "Driver_I2C.h"
2 
3 #define EEPROM_I2C_ADDR       0x51      /* EEPROM I2C address */
4 
5 /* I2C driver instance */
6 extern ARM_DRIVER_I2C            Driver_I2C0;
7 static ARM_DRIVER_I2C *I2Cdrv = &Driver_I2C0;
8 
9 static volatile uint32_t I2C_Event;
10 
11 /* I2C Signal Event function callback */
I2C_SignalEvent(uint32_t event)12 void I2C_SignalEvent (uint32_t event) {
13 
14   /* Save received events */
15   I2C_Event |= event;
16 
17   /* Optionally, user can define specific actions for an event */
18 
19   if (event & ARM_I2C_EVENT_TRANSFER_INCOMPLETE) {
20     /* Less data was transferred than requested */
21   }
22 
23   if (event & ARM_I2C_EVENT_TRANSFER_DONE) {
24     /* Transfer or receive is finished */
25   }
26 
27   if (event & ARM_I2C_EVENT_ADDRESS_NACK) {
28     /* Slave address was not acknowledged */
29   }
30 
31   if (event & ARM_I2C_EVENT_ARBITRATION_LOST) {
32     /* Master lost bus arbitration */
33   }
34 
35   if (event & ARM_I2C_EVENT_BUS_ERROR) {
36     /* Invalid start/stop position detected */
37   }
38 
39   if (event & ARM_I2C_EVENT_BUS_CLEAR) {
40     /* Bus clear operation completed */
41   }
42 
43   if (event & ARM_I2C_EVENT_GENERAL_CALL) {
44     /* Slave was addressed with a general call address */
45   }
46 
47   if (event & ARM_I2C_EVENT_SLAVE_RECEIVE) {
48     /* Slave addressed as receiver but SlaveReceive operation is not started */
49   }
50 
51   if (event & ARM_I2C_EVENT_SLAVE_TRANSMIT) {
52     /* Slave addressed as transmitter but SlaveTransmit operation is not started */
53   }
54 }
55 
56 /* Read I2C connected EEPROM (event driven example) */
EEPROM_Read_Event(uint16_t addr,uint8_t * buf,uint32_t len)57 int32_t EEPROM_Read_Event (uint16_t addr, uint8_t *buf, uint32_t len) {
58   uint8_t a[2];
59 
60   a[0] = (uint8_t)(addr >> 8);
61   a[1] = (uint8_t)(addr & 0xFF);
62 
63   /* Clear event flags before new transfer */
64   I2C_Event = 0U;
65 
66   I2Cdrv->MasterTransmit (EEPROM_I2C_ADDR, a, 2, true);
67 
68   /* Wait until transfer completed */
69   while ((I2C_Event & ARM_I2C_EVENT_TRANSFER_DONE) == 0U);
70   /* Check if all data transferred */
71   if ((I2C_Event & ARM_I2C_EVENT_TRANSFER_INCOMPLETE) != 0U) return -1;
72 
73   /* Clear event flags before new transfer */
74   I2C_Event = 0U;
75 
76   I2Cdrv->MasterReceive (EEPROM_I2C_ADDR, buf, len, false);
77 
78   /* Wait until transfer completed */
79   while ((I2C_Event & ARM_I2C_EVENT_TRANSFER_DONE) == 0U);
80   /* Check if all data transferred */
81   if ((I2C_Event & ARM_I2C_EVENT_TRANSFER_INCOMPLETE) != 0U) return -1;
82 
83   return 0;
84 }
85 
86 /* Read I2C connected EEPROM (pooling example) */
EEPROM_Read_Pool(uint16_t addr,uint8_t * buf,uint32_t len)87 int32_t EEPROM_Read_Pool (uint16_t addr, uint8_t *buf, uint32_t len) {
88   uint8_t a[2];
89 
90   a[0] = (uint8_t)(addr >> 8);
91   a[1] = (uint8_t)(addr & 0xFF);
92 
93   I2Cdrv->MasterTransmit (EEPROM_I2C_ADDR, a, 2, true);
94 
95   /* Wait until transfer completed */
96   while (I2Cdrv->GetStatus().busy);
97   /* Check if all data transferred */
98   if (I2Cdrv->GetDataCount () != len) return -1;
99 
100   I2Cdrv->MasterReceive (EEPROM_I2C_ADDR, buf, len, false);
101 
102   /* Wait until transfer completed */
103   while (I2Cdrv->GetStatus().busy);
104   /* Check if all data transferred */
105   if (I2Cdrv->GetDataCount () != len) return -1;
106 
107   return 0;
108 }
109 
110 /* Initialize I2C connected EEPROM */
EEPROM_Initialize(bool pooling)111 int32_t EEPROM_Initialize (bool pooling) {
112   int32_t status;
113   uint8_t val;
114 
115   if (pooling == true) {
116     I2Cdrv->Initialize (NULL);
117   } else {
118     I2Cdrv->Initialize (I2C_SignalEvent);
119   }
120   I2Cdrv->PowerControl (ARM_POWER_FULL);
121   I2Cdrv->Control      (ARM_I2C_BUS_SPEED, ARM_I2C_BUS_SPEED_FAST);
122   I2Cdrv->Control      (ARM_I2C_BUS_CLEAR, 0);
123 
124   /* Check if EEPROM can be accessed */
125   if (pooling == true) {
126     status = EEPROM_Read_Pool (0x00, &val, 1);
127   } else {
128     status = EEPROM_Read_Event (0x00, &val, 1);
129   }
130 
131   return (status);
132 }
133