12 #include "sw/device/lib/runtime/irq.h"
15 #include "sw/device/lib/testing/i2c_testutils.h"
16 #include "sw/device/lib/testing/rv_core_ibex_testutils.h"
17 #include "sw/device/lib/testing/test_framework/check.h"
23 OTTF_DEFINE_TEST_CONFIG();
29 kTemperatureReg = 0x00,
31 kConfigurationReg = 0x02,
32 kManufacturerIdReg = 0xFE,
36 kManufacturerId = 0x5449,
40 kDefaultTimeoutMicros = 100000,
43 static dif_rv_core_ibex_t rv_core_ibex;
44 static dif_pinmux_t pinmux;
47 static status_t read_manufacture_id(
void) {
48 uint8_t reg = kManufacturerIdReg;
49 uint8_t data[2] = {0};
50 TRY(i2c_testutils_write(&i2c, kDeviceAddr, 1, ®,
true));
51 TRY(i2c_testutils_read(&i2c, kDeviceAddr, 2, data, kDefaultTimeoutMicros));
52 uint8_t manufacturer_id[2] = {kManufacturerId >> 8, kManufacturerId & 0xFF};
53 TRY_CHECK_ARRAYS_EQ(data, manufacturer_id,
sizeof(data));
57 static status_t read_product_id(
void) {
58 uint8_t reg = kDeviceIdReg;
59 uint8_t data[2] = {0};
60 TRY(i2c_testutils_write(&i2c, kDeviceAddr, 1, ®,
true));
61 TRY(i2c_testutils_read(&i2c, kDeviceAddr, 2, data, kDefaultTimeoutMicros));
62 uint8_t device_id[2] = {kDeviceId >> 8, kDeviceId & 0xFF};
63 TRY_CHECK_ARRAYS_EQ(data, device_id,
sizeof(data));
67 static status_t read_temperature(
void) {
68 uint8_t reg = kTemperatureReg;
69 uint8_t data[2] = {0};
70 TRY(i2c_testutils_write(&i2c, kDeviceAddr, 1, ®,
true));
71 TRY(i2c_testutils_read(&i2c, kDeviceAddr, 2, data, kDefaultTimeoutMicros));
75 int32_t temperature_raw = (data[0] << 8) | data[1];
76 int32_t temperature_fixed = (-40 * (1 << 16)) + (165 * temperature_raw);
77 temperature_fixed /= (1 << 16);
80 CHECK(temperature_fixed >= 15 && temperature_fixed <= 40,
81 "Temperature out of range: %d", temperature_fixed);
86 static status_t read_humidity(
void) {
87 uint8_t reg = kHumidityReg;
88 uint8_t data[2] = {0};
89 TRY(i2c_testutils_write(&i2c, kDeviceAddr, 1, ®,
true));
90 TRY(i2c_testutils_read(&i2c, kDeviceAddr, 2, data, kDefaultTimeoutMicros));
92 uint16_t humidity_raw = (uint16_t)(data[0] << 8) | data[1];
93 int32_t humidity_fixed = (100 * humidity_raw) / (1 << 16);
96 CHECK(humidity_fixed >= 5 && humidity_fixed <= 95,
97 "Humidity out of range: %d", humidity_fixed);
106 TRY(dif_rv_core_ibex_init(base_addr, &rv_core_ibex));
109 TRY(dif_i2c_init(base_addr, &i2c));
112 TRY(dif_pinmux_init(base_addr, &pinmux));
114 TRY(i2c_testutils_select_pinmux(&pinmux, 2, I2cPinmuxPlatformIdCw310Pmod));
123 CHECK_STATUS_OK(test_init());
129 test_result = OK_STATUS();
130 for (
size_t i = 0; i <
ARRAYSIZE(speeds); ++i) {
131 CHECK_STATUS_OK(i2c_testutils_set_speed(&i2c, speeds[i]));
138 return status_ok(test_result);