Skip to content

Commit b964ca1

Browse files
committed
fixup! Add HTS221 sensor temperature read
1 parent f4e375c commit b964ca1

File tree

2 files changed

+49
-36
lines changed

2 files changed

+49
-36
lines changed

drivers/sensor/HTS221.zig

Lines changed: 49 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
//!
88
const std = @import("std");
99
const mdf_base = @import("../framework.zig").base;
10+
const InterfaceError = mdf_base.I2C_Device.InterfaceError;
1011

1112
const assert = std.debug.assert;
1213

@@ -67,7 +68,7 @@ pub const HTS221 = struct {
6768
T_OUT = 0x2A,
6869
STATUS_REG = 0x27,
6970

70-
// Callibration register
71+
// Calibration register
7172
T0_DEGC_X8 = 0x32,
7273
T1_DEGC_X8 = 0x33,
7374
T01_DEGC_MSB_x8 = 0x35,
@@ -131,83 +132,96 @@ pub const HTS221 = struct {
131132
reserved0: u2,
132133
});
133134

135+
const T01_DEGC_MSB = Reg(packed struct(u8) {
136+
T0MSB: i2,
137+
T1MSB: i2,
138+
reserved0: u4,
139+
});
140+
134141
dev: *mdf_base.I2C_Device,
135142

136-
// Needs to be initialize with calibration value.
143+
// Needs to be initialized with calibration value.
137144
t_slop: f32 = 0.0,
138145
t_b0: f32 = 0.0,
139146

140147
// internal read buffer
141-
read_buffer: [2]u8 = [2]u8{ 0, 0 },
148+
read_buffer: [2]u8 = .{ 0, 0 },
149+
150+
fn read_one_byte(self: *@This(), register: RegsAddr) InterfaceError!u8 {
151+
try self.dev.write_then_read(address, &[_]u8{register.v()}, self.read_buffer[0..1]);
152+
return self.read_buffer[0];
153+
}
154+
155+
// LSB is always read first.
156+
fn read_two_byte(self: *@This(), register: RegsAddr) InterfaceError!u16 {
157+
try self.dev.write_then_read(address, &[_]u8{register.auto_v()}, &self.read_buffer);
158+
return @as(u16, @intCast(self.read_buffer[0])) | (@as(u16, @intCast(self.read_buffer[1])) << 8);
159+
}
142160

143-
fn init_temp_callibration(self: *@This()) !void {
161+
fn init_temp_calibration(self: *@This()) InterfaceError!void {
144162
// Get the MSB of degC calibration value.
145-
try self.dev.write_then_read(address, &[_]u8{RegsAddr.T01_DEGC_MSB_x8.v()}, self.read_buffer[0..1]);
146-
const t0msb = @as(i10, @intCast(@as(i2, @bitCast(@as(u2, @truncate(self.read_buffer[0])))))) << 8;
147-
const t1msb = @as(i10, @intCast(@as(i2, @bitCast(@as(u2, @truncate(self.read_buffer[0] >> 2)))))) << 8;
163+
const t01_msb_reg = T01_DEGC_MSB.from(try self.read_one_byte(RegsAddr.T01_DEGC_MSB_x8));
164+
const t0msb = @as(i10, @intCast(t01_msb_reg.read().T0MSB)) << 8;
165+
const t1msb = @as(i10, @intCast(t01_msb_reg.read().T1MSB)) << 8;
148166

149-
try self.dev.write_then_read(address, &[_]u8{RegsAddr.T0_DEGC_X8.v()}, self.read_buffer[0..1]);
150-
const t0_deg = @as(f32, @floatFromInt(@as(i10, @bitCast(@as(u10, @intCast(self.read_buffer[0])))) | t0msb)) / 8.0;
167+
const t0_degc_lsb = @as(u10, @intCast(try self.read_one_byte(RegsAddr.T0_DEGC_X8)));
168+
const t0_deg = @as(f32, @floatFromInt(@as(i10, @bitCast(t0_degc_lsb)) | t0msb)) / 8.0;
151169

152-
try self.dev.write_then_read(address, &[_]u8{RegsAddr.T1_DEGC_X8.v()}, self.read_buffer[0..1]);
153-
const t1_deg = @as(f32, @floatFromInt(@as(i10, @bitCast(@as(u10, @intCast(self.read_buffer[0])))) | t1msb)) / 8.0;
170+
const t1_degc_lsb = @as(u10, @intCast(try self.read_one_byte(RegsAddr.T1_DEGC_X8)));
171+
const t1_deg = @as(f32, @floatFromInt(@as(i10, @bitCast(t1_degc_lsb)) | t1msb)) / 8.0;
154172

155-
try self.dev.write_then_read(address, &[_]u8{RegsAddr.T0_OUT.auto_v()}, &self.read_buffer);
156-
const T0 = @as(f32, @floatFromInt(@as(i16, @intCast(self.read_buffer[0])) | (@as(i16, @intCast(self.read_buffer[1])) << 8)));
173+
const t0_raw = try self.read_two_byte(RegsAddr.T0_OUT);
174+
const T0 = @as(f32, @floatFromInt(@as(i16, @bitCast(t0_raw))));
157175

158-
try self.dev.write_then_read(address, &[_]u8{RegsAddr.T1_OUT.auto_v()}, &self.read_buffer);
159-
const T1 = @as(f32, @floatFromInt(@as(i16, @intCast(self.read_buffer[0])) | (@as(i16, @intCast(self.read_buffer[1])) << 8)));
176+
const t1_raw = try self.read_two_byte(RegsAddr.T1_OUT);
177+
const T1 = @as(f32, @floatFromInt(@as(i16, @bitCast(t1_raw))));
160178

161179
self.t_slop = ((t1_deg - t0_deg) / (T1 - T0));
162180
self.t_b0 = t0_deg - T0 * self.t_slop;
163181
}
164182

165-
fn setup_output_rate(self: *@This(), rate: ODR) !void {
166-
try self.dev.write_then_read(address, &[_]u8{RegsAddr.CTRL_REG1.v()}, self.read_buffer[0..1]);
167-
var reg = CTRL_REG1.from(self.read_buffer[0]);
183+
fn setup_output_rate(self: *@This(), rate: ODR) InterfaceError!void {
184+
var reg = CTRL_REG1.from(try self.read_one_byte(RegsAddr.CTRL_REG1));
168185
reg.modify(.{ .ODR = rate });
169186
try self.dev.write(address, &[_]u8{ RegsAddr.CTRL_REG1.v(), reg.raw });
170187
}
171188

172-
fn setup_average(self: *@This(), avgt: AVGT, avgh: AVGH) !void {
173-
try self.dev.write_then_read(address, &[_]u8{RegsAddr.AV_CONF.v()}, self.read_buffer[0..1]);
174-
var reg = AV_CONF.from(self.read_buffer[0]);
189+
fn setup_average(self: *@This(), avgt: AVGT, avgh: AVGH) InterfaceError!void {
190+
var reg = AV_CONF.from(try self.read_one_byte(RegsAddr.AV_CONF));
175191
reg.modify(.{
176192
.AVGH = avgh,
177193
.AVGT = avgt,
178194
});
179195
try self.dev.write(address, &[_]u8{ RegsAddr.AV_CONF.v(), reg.raw });
180196
}
181197

182-
pub fn turn_on(self: *@This()) !void {
183-
try self.dev.write_then_read(address, &[_]u8{RegsAddr.CTRL_REG1.v()}, self.read_buffer[0..1]);
184-
var reg = CTRL_REG1.from(self.read_buffer[0]);
198+
pub fn turn_on(self: *@This()) InterfaceError!void {
199+
var reg = CTRL_REG1.from(try self.read_one_byte(RegsAddr.CTRL_REG1));
185200
reg.modify(.{ .PD = 1 });
186201
try self.dev.write(address, &[_]u8{ RegsAddr.CTRL_REG1.v(), reg.raw });
187202
}
188203

189-
pub fn turn_off(self: *@This()) !void {
190-
try self.dev.write_then_read(address, &[_]u8{RegsAddr.CTRL_REG1.v()}, self.read_buffer[0..1]);
191-
var reg = CTRL_REG1.from(self.read_buffer[0]);
204+
pub fn turn_off(self: *@This()) InterfaceError!void {
205+
var reg = CTRL_REG1.from(try self.read_one_byte(RegsAddr.CTRL_REG1));
192206
reg.modify(.{ .PD = 0 });
193207
try self.dev.write(address, &[_]u8{ RegsAddr.CTRL_REG1.v(), reg.raw });
194208
}
195209

196-
pub fn configure(self: *@This(), config: Config) !void {
197-
try self.init_temp_callibration();
210+
pub fn configure(self: *@This(), config: Config) InterfaceError!void {
211+
try self.init_temp_calibration();
198212
try self.setup_output_rate(config.outputDataRate);
199213
try self.setup_average(config.temperatureAverageSample, config.humidityAverageSample);
200214
}
201215

202-
pub fn temperature_ready(self: *@This()) !bool {
203-
try self.dev.write_then_read(address, &[_]u8{RegsAddr.STATUS_REG.v()}, self.read_buffer[0..1]);
204-
const status = STATUS_REG.from(self.read_buffer[0]);
216+
pub fn temperature_ready(self: *@This()) InterfaceError!bool {
217+
const raw_status = try self.read_one_byte(RegsAddr.STATUS_REG);
218+
const status = STATUS_REG.from(raw_status);
205219
return status.read().T_DA == 1;
206220
}
207221

208-
pub fn read_temperature(self: *@This()) !f32 {
209-
try self.dev.write_then_read(address, &[_]u8{RegsAddr.T_OUT.auto_v()}, &self.read_buffer);
210-
const inter = @as(f32, @floatFromInt(@as(i16, @intCast(self.read_buffer[0])) | (@as(i16, @intCast(self.read_buffer[1])) << 8)));
222+
pub fn read_temperature(self: *@This()) InterfaceError!f32 {
223+
const raw_t = try self.read_two_byte(RegsAddr.T_OUT);
224+
const inter = @as(f32, @floatFromInt(@as(i16, @bitCast(raw_t))));
211225
return self.t_b0 + inter * self.t_slop;
212226
}
213227

examples/stmicro/stm32/src/stm32f303/hts221.zig

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,6 @@ pub noinline fn main() !void {
3333
},
3434
}).apply();
3535

36-
// // I2C1 is the magnetometer on pin PB6/7
3736
var i2c1 = stm32.i2c.I2CDevice.init(.I2C1);
3837
try i2c1.apply();
3938
var device = i2c1.as_device();

0 commit comments

Comments
 (0)