]> begriffs open source - cmsis-driver-validation/blob - Source/DV_I2C.c
Minor update to release notes
[cmsis-driver-validation] / Source / DV_I2C.c
1 /*-----------------------------------------------------------------------------
2  *      Name:         DV_I2C.c
3  *      Purpose:      I2C test cases
4  *----------------------------------------------------------------------------
5  *      Copyright(c) KEIL - An ARM Company
6  *----------------------------------------------------------------------------*/
7 #include "cmsis_dv.h" 
8 #include "DV_Config.h"
9 #include "DV_Framework.h"
10 #include "Driver_I2C.h"
11 #include <stdio.h>
12 #include <stdlib.h> 
13 #include <string.h> 
14
15 // Register Driver_I2C#
16 extern ARM_DRIVER_I2C CREATE_SYMBOL(Driver_I2C, DRV_I2C);
17 static ARM_DRIVER_I2C *drv = &CREATE_SYMBOL(Driver_I2C, DRV_I2C);
18 static ARM_I2C_CAPABILITIES capab;  
19
20 // Event flags
21 static uint8_t volatile Event;    
22
23 // I2C event
24 static void I2C_DrvEvent (uint32_t event) {
25   Event |= event;
26 }
27
28 /*-----------------------------------------------------------------------------
29  *      Test cases
30  *----------------------------------------------------------------------------*/
31  
32 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
33 /**
34 \defgroup i2c_funcs I2C Validation
35 \brief I2C test cases
36 \details
37 The I2C validation test checks the API interface compliance only.
38 @{
39 */
40
41 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
42 /**
43 \brief Test case: I2C_GetCapabilities
44 \details
45 The test case \b I2C_GetCapabilities verifies the function \b GetCapabilities.
46 */
47 void I2C_GetCapabilities (void) {                    
48   /* Get SPI capabilities */
49   capab = drv->GetCapabilities();
50   TEST_ASSERT(&capab != NULL); 
51 }
52
53 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
54 /**
55 \brief  Test case: I2C_Initialization
56 \details
57 The test case \b I2C_Initialization verifies the I2C functions with the sequence:
58   - \b Initialize  without callback
59   - \b Uninitialize
60   - \b Initialize with callback
61   - \b Uninitialize
62 */
63 void I2C_Initialization (void) { 
64   
65   /* Initialize without callback */
66   TEST_ASSERT(drv->Initialize(NULL) == ARM_DRIVER_OK); 
67     
68   /* Uninitialize */
69   TEST_ASSERT(drv->Uninitialize() == ARM_DRIVER_OK); 
70   
71   /* Initialize with callback */
72   TEST_ASSERT(drv->Initialize(I2C_DrvEvent) == ARM_DRIVER_OK); 
73   
74   /* Uninitialize */
75   TEST_ASSERT(drv->Uninitialize() == ARM_DRIVER_OK); 
76 }
77
78 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
79 /**
80 \brief  Test case: I2C_CheckInvalidInit
81 \details
82 The test case \b I2C_CheckInvalidInit verifies the driver behaviour when receiving an invalid initialization sequence:
83   - \b Uninitialize
84   - \b PowerControl with Power off
85   - \b PowerControl with Power on
86   - \b Control with bus speed fast 
87   - \b PowerControl with Power off
88   - \b Uninitialize
89 */
90 void I2C_CheckInvalidInit (void) { 
91   
92   /* Uninitialize */
93   TEST_ASSERT(drv->Uninitialize() == ARM_DRIVER_OK); 
94   
95   /* Power off */
96   TEST_ASSERT(drv->PowerControl (ARM_POWER_OFF) == ARM_DRIVER_OK);
97   
98   /* Try to power on */
99   TEST_ASSERT(drv->PowerControl (ARM_POWER_FULL) != ARM_DRIVER_OK); 
100   
101   /* Try to set configuration */
102   TEST_ASSERT(drv->Control(ARM_I2C_BUS_SPEED, ARM_I2C_BUS_SPEED_FAST) != ARM_DRIVER_OK);
103
104   /* Power off */
105   TEST_ASSERT(drv->PowerControl (ARM_POWER_OFF) == ARM_DRIVER_OK);
106   
107   /* Uninitialize */
108   TEST_ASSERT(drv->Uninitialize() == ARM_DRIVER_OK); 
109 }
110
111 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
112 /**
113 \brief  Test case: I2C_PowerControl
114 \details
115 The test case \b I2C_PowerControl verifies the \b PowerControl function with the sequence:
116  - Initialize 
117  - Power on
118  - Power low
119  - Power off 
120  - Uninitialize 
121 */
122 void I2C_PowerControl (void) { 
123   int32_t val;
124   
125   /* Initialize with callback */
126   TEST_ASSERT(drv->Initialize(I2C_DrvEvent) == ARM_DRIVER_OK); 
127   
128   /* Power on */
129   TEST_ASSERT(drv->PowerControl (ARM_POWER_FULL) == ARM_DRIVER_OK);  
130   
131   /* Power low */
132   val = drv->PowerControl (ARM_POWER_LOW);
133   if (val == ARM_DRIVER_ERROR_UNSUPPORTED) { TEST_MESSAGE("[WARNING] Low power is not supported"); }
134   else { TEST_ASSERT(val == ARM_DRIVER_OK); }
135    
136   /* Power off */
137   TEST_ASSERT(drv->PowerControl (ARM_POWER_OFF) == ARM_DRIVER_OK);
138   
139   /* Uninitialize */
140   TEST_ASSERT(drv->Uninitialize() == ARM_DRIVER_OK); 
141 }
142
143 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
144 /**
145 \brief  Test case: I2C_SetBusSpeed
146 \details
147 The test case \b I2C_SetBusSpeed verifies the \b Control function with the sequence:
148  - Initialize 
149  - Power on
150  - Set bus speed standard 
151  - Set bus speed fast 
152  - Set bus speed fast plus 
153  - Set bus speed high 
154  - Power off 
155  - Uninitialize 
156 */
157 void I2C_SetBusSpeed (void) { 
158 int32_t val;  
159   
160   /* Initialize with callback and power on */
161   TEST_ASSERT(drv->Initialize(I2C_DrvEvent) == ARM_DRIVER_OK); 
162   TEST_ASSERT(drv->PowerControl (ARM_POWER_FULL) == ARM_DRIVER_OK); 
163   
164   /* Set bus speed standard */
165   TEST_ASSERT(drv->Control(ARM_I2C_BUS_SPEED, ARM_I2C_BUS_SPEED_STANDARD) == ARM_DRIVER_OK);
166   
167   /* Set bus speed fast */
168   val = drv->Control(ARM_I2C_BUS_SPEED, ARM_I2C_BUS_SPEED_FAST);
169   if (val == ARM_DRIVER_ERROR_UNSUPPORTED) { TEST_MESSAGE("[WARNING] Fast speed is not supported"); }
170   else { TEST_ASSERT(val == ARM_DRIVER_OK); } 
171   
172   /* Set bus speed fast plus */
173   val = drv->Control(ARM_I2C_BUS_SPEED, ARM_I2C_BUS_SPEED_FAST_PLUS);
174   if (val == ARM_DRIVER_ERROR_UNSUPPORTED) { TEST_MESSAGE("[WARNING] Fast plus speed is not supported"); }
175   else { TEST_ASSERT(val == ARM_DRIVER_OK); } 
176   
177   /* Set bus speed high */
178   val = drv->Control(ARM_I2C_BUS_SPEED, ARM_I2C_BUS_SPEED_HIGH);
179   if (val == ARM_DRIVER_ERROR_UNSUPPORTED) { TEST_MESSAGE("[WARNING] High speed is not supported"); }
180   else { TEST_ASSERT(val == ARM_DRIVER_OK); } 
181   
182   /* Power off and uninitialize*/
183   TEST_ASSERT(drv->PowerControl (ARM_POWER_OFF) == ARM_DRIVER_OK);
184   TEST_ASSERT(drv->Uninitialize() == ARM_DRIVER_OK); 
185 }
186
187 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
188 /**
189 \brief  Test case: I2C_SetOwnAddress
190 \details
191 The test case \b I2C_SetOwnAddress verifies the \b Control function with the sequence:
192  - Initialize 
193  - Power on
194  - Set slave own address \token{0x0000}
195  - Set slave own address \token{0x0001}
196  - Set slave own address \token{0x00FF}
197  - Set slave own address \token{0x03FF}
198  - Power off 
199  - Uninitialize 
200 */
201 void I2C_SetOwnAddress (void) { 
202   
203   /* Initialize with callback and power on */
204   TEST_ASSERT(drv->Initialize(I2C_DrvEvent) == ARM_DRIVER_OK); 
205   TEST_ASSERT(drv->PowerControl (ARM_POWER_FULL) == ARM_DRIVER_OK); 
206   
207   /* Set slave own address */
208   TEST_ASSERT(drv->Control(ARM_I2C_OWN_ADDRESS, 0x0000) == ARM_DRIVER_OK);
209   
210   /* Set slave own address */
211   TEST_ASSERT(drv->Control(ARM_I2C_OWN_ADDRESS, 0x0001) == ARM_DRIVER_OK);
212   
213   /* Set slave own address */
214   TEST_ASSERT(drv->Control(ARM_I2C_OWN_ADDRESS, 0x00FF) == ARM_DRIVER_OK);
215   
216   /* Set slave own address */
217   TEST_ASSERT(drv->Control(ARM_I2C_OWN_ADDRESS, 0x03FF) == ARM_DRIVER_OK);
218   
219   /* Power off and uninitialize*/
220   TEST_ASSERT(drv->PowerControl (ARM_POWER_OFF) == ARM_DRIVER_OK);
221   TEST_ASSERT(drv->Uninitialize() == ARM_DRIVER_OK);   
222 }
223
224 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
225 /**
226 \brief  Test case: I2C_BusClear
227 \details
228 The test case \b I2C_BusClear verifies the \b Control function with the sequence:
229  - Initialize 
230  - Power on
231  - Clear Bus
232  - Power off 
233  - Uninitialize 
234 */
235 void I2C_BusClear (void) { 
236   
237   /* Initialize with callback and power on */
238   TEST_ASSERT(drv->Initialize(I2C_DrvEvent) == ARM_DRIVER_OK); 
239   TEST_ASSERT(drv->PowerControl (ARM_POWER_FULL) == ARM_DRIVER_OK);
240   
241   /* Clear Bus */
242   TEST_ASSERT(drv->Control(ARM_I2C_BUS_CLEAR, 0x0000) == ARM_DRIVER_OK);
243   
244   /* Power off and uninitialize*/
245   TEST_ASSERT(drv->PowerControl (ARM_POWER_OFF) == ARM_DRIVER_OK);
246   TEST_ASSERT(drv->Uninitialize() == ARM_DRIVER_OK); 
247 }
248   
249 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
250 /**
251 \brief  Test case: I2C_AbortTransfer
252 \details
253 The test case \b I2C_AbortTransfer verifies the \b Control function with the sequence:
254  - Initialize 
255  - Power on
256  - Abort transfer
257  - Power off 
258  - Uninitialize 
259 */
260 void I2C_AbortTransfer (void) { 
261   
262   /* Initialize with callback and power on */
263   TEST_ASSERT(drv->Initialize(I2C_DrvEvent) == ARM_DRIVER_OK); 
264   TEST_ASSERT(drv->PowerControl (ARM_POWER_FULL) == ARM_DRIVER_OK);
265   
266   /* Abort transfer */
267   TEST_ASSERT(drv->Control(ARM_I2C_ABORT_TRANSFER, 0x0000) == ARM_DRIVER_OK);
268   
269   /* Power off and uninitialize*/
270   TEST_ASSERT(drv->PowerControl (ARM_POWER_OFF) == ARM_DRIVER_OK);
271   TEST_ASSERT(drv->Uninitialize() == ARM_DRIVER_OK); 
272 }
273
274 /**
275 @}
276 */ 
277 // end of group i2c_funcs
278