2 * Copyright (c) 2015-2020 Arm Limited. All rights reserved.
4 * SPDX-License-Identifier: Apache-2.0
6 * Licensed under the Apache License, Version 2.0 (the License); you may
7 * not use this file except in compliance with the License.
8 * You may obtain a copy of the License at
10 * www.apache.org/licenses/LICENSE-2.0
12 * Unless required by applicable law or agreed to in writing, software
13 * distributed under the License is distributed on an AS IS BASIS, WITHOUT
14 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 * See the License for the specific language governing permissions and
16 * limitations under the License.
18 * -----------------------------------------------------------------------------
20 * Project: CMSIS-Driver Validation
21 * Title: Inter-Integrated Circuit (I2C) Driver Validation tests
23 * -----------------------------------------------------------------------------
28 #include "DV_I2C_Config.h"
29 #include "DV_Framework.h"
30 #include "Driver_I2C.h"
35 // Register Driver_I2C#
36 extern ARM_DRIVER_I2C CREATE_SYMBOL(Driver_I2C, DRV_I2C);
37 static ARM_DRIVER_I2C *drv = &CREATE_SYMBOL(Driver_I2C, DRV_I2C);
38 static ARM_I2C_CAPABILITIES capab;
41 static uint8_t volatile Event;
44 static void I2C_DrvEvent (uint32_t event) {
48 /*-----------------------------------------------------------------------------
50 *----------------------------------------------------------------------------*/
52 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
54 \defgroup dv_i2c I2C Validation
55 \brief I2C driver validation
57 The I2C validation test checks the API interface compliance only.
59 \defgroup i2c_tests Tests
65 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
67 \brief Function: I2C_GetCapabilities
69 The test function \b I2C_GetCapabilities verifies the function \b GetCapabilities.
71 void I2C_GetCapabilities (void) {
72 /* Get SPI capabilities */
73 capab = drv->GetCapabilities();
74 TEST_ASSERT(&capab != NULL);
77 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
79 \brief Function: I2C_Initialization
81 The test function \b I2C_Initialization verifies the I2C functions with the sequence:
82 - \b Initialize without callback
84 - \b Initialize with callback
87 void I2C_Initialization (void) {
89 /* Initialize without callback */
90 TEST_ASSERT(drv->Initialize(NULL) == ARM_DRIVER_OK);
93 TEST_ASSERT(drv->Uninitialize() == ARM_DRIVER_OK);
95 /* Initialize with callback */
96 TEST_ASSERT(drv->Initialize(I2C_DrvEvent) == ARM_DRIVER_OK);
99 TEST_ASSERT(drv->Uninitialize() == ARM_DRIVER_OK);
102 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
104 \brief Function: I2C_CheckInvalidInit
106 The test function \b I2C_CheckInvalidInit verifies the driver behaviour when receiving an invalid initialization sequence:
108 - \b PowerControl with Power off
109 - \b PowerControl with Power on
110 - \b Control with bus speed fast
111 - \b PowerControl with Power off
114 void I2C_CheckInvalidInit (void) {
117 TEST_ASSERT(drv->Uninitialize() == ARM_DRIVER_OK);
120 TEST_ASSERT(drv->PowerControl (ARM_POWER_OFF) == ARM_DRIVER_OK);
122 /* Try to power on */
123 TEST_ASSERT(drv->PowerControl (ARM_POWER_FULL) != ARM_DRIVER_OK);
125 /* Try to set configuration */
126 TEST_ASSERT(drv->Control(ARM_I2C_BUS_SPEED, ARM_I2C_BUS_SPEED_FAST) != ARM_DRIVER_OK);
129 TEST_ASSERT(drv->PowerControl (ARM_POWER_OFF) == ARM_DRIVER_OK);
132 TEST_ASSERT(drv->Uninitialize() == ARM_DRIVER_OK);
135 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
137 \brief Function: I2C_PowerControl
139 The test function \b I2C_PowerControl verifies the \b PowerControl function with the sequence:
146 void I2C_PowerControl (void) {
149 /* Initialize with callback */
150 TEST_ASSERT(drv->Initialize(I2C_DrvEvent) == ARM_DRIVER_OK);
153 TEST_ASSERT(drv->PowerControl (ARM_POWER_FULL) == ARM_DRIVER_OK);
156 val = drv->PowerControl (ARM_POWER_LOW);
157 if (val == ARM_DRIVER_ERROR_UNSUPPORTED) { TEST_MESSAGE("[WARNING] Low power is not supported"); }
158 else { TEST_ASSERT(val == ARM_DRIVER_OK); }
161 TEST_ASSERT(drv->PowerControl (ARM_POWER_OFF) == ARM_DRIVER_OK);
164 TEST_ASSERT(drv->Uninitialize() == ARM_DRIVER_OK);
167 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
169 \brief Function: I2C_SetBusSpeed
171 The test function \b I2C_SetBusSpeed verifies the \b Control function with the sequence:
174 - Set bus speed standard
176 - Set bus speed fast plus
181 void I2C_SetBusSpeed (void) {
184 /* Initialize with callback and power on */
185 TEST_ASSERT(drv->Initialize(I2C_DrvEvent) == ARM_DRIVER_OK);
186 TEST_ASSERT(drv->PowerControl (ARM_POWER_FULL) == ARM_DRIVER_OK);
188 /* Set bus speed standard */
189 TEST_ASSERT(drv->Control(ARM_I2C_BUS_SPEED, ARM_I2C_BUS_SPEED_STANDARD) == ARM_DRIVER_OK);
191 /* Set bus speed fast */
192 val = drv->Control(ARM_I2C_BUS_SPEED, ARM_I2C_BUS_SPEED_FAST);
193 if (val == ARM_DRIVER_ERROR_UNSUPPORTED) { TEST_MESSAGE("[WARNING] Fast speed is not supported"); }
194 else { TEST_ASSERT(val == ARM_DRIVER_OK); }
196 /* Set bus speed fast plus */
197 val = drv->Control(ARM_I2C_BUS_SPEED, ARM_I2C_BUS_SPEED_FAST_PLUS);
198 if (val == ARM_DRIVER_ERROR_UNSUPPORTED) { TEST_MESSAGE("[WARNING] Fast plus speed is not supported"); }
199 else { TEST_ASSERT(val == ARM_DRIVER_OK); }
201 /* Set bus speed high */
202 val = drv->Control(ARM_I2C_BUS_SPEED, ARM_I2C_BUS_SPEED_HIGH);
203 if (val == ARM_DRIVER_ERROR_UNSUPPORTED) { TEST_MESSAGE("[WARNING] High speed is not supported"); }
204 else { TEST_ASSERT(val == ARM_DRIVER_OK); }
206 /* Power off and uninitialize*/
207 TEST_ASSERT(drv->PowerControl (ARM_POWER_OFF) == ARM_DRIVER_OK);
208 TEST_ASSERT(drv->Uninitialize() == ARM_DRIVER_OK);
211 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
213 \brief Function: I2C_SetOwnAddress
215 The test function \b I2C_SetOwnAddress verifies the \b Control function with the sequence:
218 - Set slave own address \token{0x0000}
219 - Set slave own address \token{0x0001}
220 - Set slave own address \token{0x00FF}
221 - Set slave own address \token{0x03FF}
225 void I2C_SetOwnAddress (void) {
227 /* Initialize with callback and power on */
228 TEST_ASSERT(drv->Initialize(I2C_DrvEvent) == ARM_DRIVER_OK);
229 TEST_ASSERT(drv->PowerControl (ARM_POWER_FULL) == ARM_DRIVER_OK);
231 /* Set slave own address */
232 TEST_ASSERT(drv->Control(ARM_I2C_OWN_ADDRESS, 0x0000) == ARM_DRIVER_OK);
234 /* Set slave own address */
235 TEST_ASSERT(drv->Control(ARM_I2C_OWN_ADDRESS, 0x0001) == ARM_DRIVER_OK);
237 /* Set slave own address */
238 TEST_ASSERT(drv->Control(ARM_I2C_OWN_ADDRESS, 0x00FF) == ARM_DRIVER_OK);
240 /* Set slave own address */
241 TEST_ASSERT(drv->Control(ARM_I2C_OWN_ADDRESS, 0x03FF) == ARM_DRIVER_OK);
243 /* Power off and uninitialize*/
244 TEST_ASSERT(drv->PowerControl (ARM_POWER_OFF) == ARM_DRIVER_OK);
245 TEST_ASSERT(drv->Uninitialize() == ARM_DRIVER_OK);
248 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
250 \brief Function: I2C_BusClear
252 The test function \b I2C_BusClear verifies the \b Control function with the sequence:
259 void I2C_BusClear (void) {
261 /* Initialize with callback and power on */
262 TEST_ASSERT(drv->Initialize(I2C_DrvEvent) == ARM_DRIVER_OK);
263 TEST_ASSERT(drv->PowerControl (ARM_POWER_FULL) == ARM_DRIVER_OK);
266 TEST_ASSERT(drv->Control(ARM_I2C_BUS_CLEAR, 0x0000) == ARM_DRIVER_OK);
268 /* Power off and uninitialize*/
269 TEST_ASSERT(drv->PowerControl (ARM_POWER_OFF) == ARM_DRIVER_OK);
270 TEST_ASSERT(drv->Uninitialize() == ARM_DRIVER_OK);
273 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
275 \brief Function: I2C_AbortTransfer
277 The test function \b I2C_AbortTransfer verifies the \b Control function with the sequence:
284 void I2C_AbortTransfer (void) {
286 /* Initialize with callback and power on */
287 TEST_ASSERT(drv->Initialize(I2C_DrvEvent) == ARM_DRIVER_OK);
288 TEST_ASSERT(drv->PowerControl (ARM_POWER_FULL) == ARM_DRIVER_OK);
291 TEST_ASSERT(drv->Control(ARM_I2C_ABORT_TRANSFER, 0x0000) == ARM_DRIVER_OK);
293 /* Power off and uninitialize*/
294 TEST_ASSERT(drv->PowerControl (ARM_POWER_OFF) == ARM_DRIVER_OK);
295 TEST_ASSERT(drv->Uninitialize() == ARM_DRIVER_OK);
301 // end of group dv_i2c