Skip to content

Commit 26ed60d

Browse files
committed
Fixes
1 parent cc20bce commit 26ed60d

File tree

3 files changed

+44
-8
lines changed

3 files changed

+44
-8
lines changed

deploy/src/icm42688.jl

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -257,20 +257,18 @@ function read_reg(imu::ICM42688, reg::Integer)
257257
end
258258

259259
"""
260-
read_regs!(imu::ICM42688, reg::UInt8, dest::AbstractVector{UInt8}) -> Nothing
260+
read_regs!(imu::ICM42688, reg::Integer, count::Int) -> Nothing
261261
262-
Burst read multiple bytes starting from a register into dest.
262+
Burst read `count` bytes starting from a register.
263+
Data lands in `imu.rx_buf[2:count+1]` (index 1 is the discarded address echo).
263264
"""
264-
function read_regs!(imu::ICM42688, reg::Integer, dest::AbstractVector{UInt8})
265-
count = length(dest)
265+
function read_regs!(imu::ICM42688, reg::Integer, count::Int)
266266
n = count + 1 # 1 address byte + N data bytes
267267

268268
imu.tx_buf[1] = UInt8(reg) | SPI_READ_FLAG
269269
fill!(@view(imu.tx_buf[2:n]), 0x00)
270270

271271
SPI.transfer!(imu.device, @view(imu.tx_buf[1:n]), @view(imu.rx_buf[1:n]))
272-
273-
copyto!(dest, 1, imu.rx_buf, 2, count)
274272
return nothing
275273
end
276274

deploy/src/shift_driver.jl

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,39 @@
11
using PIOLib
22

3+
function shift_register_program(; ser_pin::Integer, clk_pin::Integer, rclk_pin::Integer,
4+
nbits::Integer, clkdiv::Real=1.0f0)
5+
1 <= nbits <= 31 || error("nbits must be 1-31 (SET immediate is 5 bits, and 32 encodes as 0 in autopull threshold)")
6+
7+
prog = build_program([
8+
WrapTarget(),
9+
Mov{:none}(RegX(), RegY(); sideset=0),
10+
Label(:bitloop),
11+
Out(Pins(), 1; sideset=0),
12+
Jmp{:x_dec}(:bitloop; sideset=1),
13+
Set(Pins(), 1; sideset=0),
14+
Set(Pins(), 0; sideset=0),
15+
Wrap(),
16+
]; sideset_bits=1)
17+
18+
config = SMConfig(;
19+
out_pins=(ser_pin, 1),
20+
set_pins=(rclk_pin, 1),
21+
sideset_pin_base=clk_pin,
22+
sideset=(1, false, false),
23+
out_shift=(true, true, nbits),
24+
clkdiv=Float32(clkdiv),
25+
wrap=(prog.wrap_target, prog.wrap),
26+
)
27+
28+
prog, config
29+
end
30+
31+
function setup_shift_register!(sm::StateMachine, nbits::Integer)
32+
exec!(sm, Set(RegY(), nbits - 1))
33+
end
34+
35+
shift_out!(sm::StateMachine, data::UInt32) = put!(sm, data)
36+
337
# --- Pin assignments ---
438
const SER_PIN = 26 # Serial data (SER/DS)
539
const CLK_PIN = 19 # Shift clock (SRCLK/SHCP)

deploy/src/spi.jl

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -333,12 +333,14 @@ Read into `dest` from the SPI device (half-duplex RX, TX sends zeros).
333333
"""
334334
function Base.read!(dev::SPIDevice, dest::AbstractVector{UInt8})
335335
len = length(dest)
336+
len > SPI_BUFFER_SIZE && error("read!: length $len exceeds buffer size $SPI_BUFFER_SIZE")
337+
336338
fill!(@view(dev.scratch[1:len]), 0x00)
337339

338340
xfer = SPIIocTransfer(UInt64(pointer(dev.scratch)), UInt64(pointer(dest)), UInt32(len), ZERO_XFER_TAIL...)
339341
unsafe_store!(Ptr{SPIIocTransfer}(pointer(dev.xfer_buf)), xfer)
340342

341-
do_xfer(dev, 1)
343+
do_xfer(dev, 1, "read")
342344
return dest
343345
end
344346

@@ -351,6 +353,8 @@ Useful for register reads: send command/address bytes in `tx`, receive response
351353
function write_then_read!(dev::SPIDevice, tx::AbstractVector{UInt8}, rx::AbstractVector{UInt8})
352354
tx_len = length(tx)
353355
rx_len = length(rx)
356+
rx_len > SPI_BUFFER_SIZE && error("write_then_read!: rx length $rx_len exceeds buffer size $SPI_BUFFER_SIZE")
357+
354358
xfer_ptr = Ptr{SPIIocTransfer}(pointer(dev.xfer_buf))
355359

356360
# First transfer: write, keep CS asserted
@@ -362,7 +366,7 @@ function write_then_read!(dev::SPIDevice, tx::AbstractVector{UInt8}, rx::Abstrac
362366
unsafe_store!(xfer_ptr,
363367
SPIIocTransfer(UInt64(pointer(dev.scratch)), UInt64(pointer(rx)), UInt32(rx_len), ZERO_XFER_TAIL...), 2)
364368

365-
return do_xfer(dev, 2)
369+
return do_xfer(dev, 2, "write_then_read")
366370
end
367371

368372
end # module SPI

0 commit comments

Comments
 (0)