@@ -32,6 +32,7 @@ void i2c_init(i2c_t *obj, PinName sda, PinName scl)
32
32
uint32_t i2c_scl = pinmap_peripheral (scl , PinMap_I2C_SCL );
33
33
obj -> instance = pinmap_merge (i2c_sda , i2c_scl );
34
34
obj -> next_repeated_start = 0 ;
35
+ obj -> issue_start = 0 ;
35
36
MBED_ASSERT ((int )obj -> instance != NC );
36
37
37
38
i2c_master_config_t master_config ;
@@ -92,23 +93,7 @@ void i2c_init(i2c_t *obj, PinName sda, PinName scl)
92
93
93
94
int i2c_start (i2c_t * obj )
94
95
{
95
- I2C_Type * base = i2c_addrs [obj -> instance ];
96
- uint32_t status ;
97
-
98
- do {
99
- status = I2C_GetStatusFlags (base );
100
- } while ((status & I2C_STAT_MSTPENDING_MASK ) == 0 );
101
-
102
- /* Clear controller state. */
103
- I2C_MasterClearStatusFlags (base , I2C_STAT_MSTARBLOSS_MASK | I2C_STAT_MSTSTSTPERR_MASK );
104
-
105
- /* Start the transfer */
106
- base -> MSTDAT = 0 ;
107
- base -> MSTCTL = I2C_MSTCTL_MSTSTART_MASK ;
108
-
109
- do {
110
- status = I2C_GetStatusFlags (base );
111
- } while ((status & I2C_STAT_MSTPENDING_MASK ) == 0 );
96
+ obj -> issue_start = 1 ;
112
97
113
98
return 0 ;
114
99
}
@@ -131,6 +116,8 @@ int i2c_stop(i2c_t *obj)
131
116
status = I2C_GetStatusFlags (base );
132
117
} while ((status & I2C_STAT_MSTPENDING_MASK ) == 0 );
133
118
119
+ obj -> issue_start = 0 ;
120
+
134
121
return 0 ;
135
122
}
136
123
@@ -236,12 +223,24 @@ int i2c_byte_write(i2c_t *obj, int data)
236
223
// write the data
237
224
base -> MSTDAT = data ;
238
225
239
- base -> MSTCTL = I2C_MSTCTL_MSTCONTINUE_MASK ;
240
-
241
226
do {
242
227
status = I2C_GetStatusFlags (base );
243
228
} while ((status & I2C_STAT_MSTPENDING_MASK ) == 0 );
244
229
230
+ /* Clear controller state. */
231
+ I2C_MasterClearStatusFlags (base , I2C_STAT_MSTARBLOSS_MASK | I2C_STAT_MSTSTSTPERR_MASK );
232
+
233
+ if (obj -> issue_start ) {
234
+ base -> MSTCTL = I2C_MSTCTL_MSTSTART_MASK ;
235
+ /* Clear the flag */
236
+ obj -> issue_start = 0 ;
237
+ } else {
238
+ base -> MSTCTL = I2C_MSTCTL_MSTCONTINUE_MASK ;
239
+ }
240
+
241
+ do {
242
+ status = I2C_GetStatusFlags (base );
243
+ } while ((status & I2C_STAT_MSTPENDING_MASK ) == 0 );
245
244
246
245
/* Check if arbitration lost */
247
246
if (status & I2C_STAT_MSTARBLOSS_MASK ) {
0 commit comments