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