ra8-firmware 0.1.0
Bare-metal firmware for the Renesas RA8 family (RA8D2 / RA8P1)
Loading...
Searching...
No Matches
ra8_i2c.h
Go to the documentation of this file.
1
55
56#pragma once
57
58#ifdef __cplusplus
59extern "C" {
60#endif
61
62#include <stdint.h>
63
64#include "ra8_err.h"
65
66/* =============================================================================
67 * Public types
68 * =============================================================================
69 */
70
79typedef enum : uint32_t {
84
97typedef struct {
98 uint32_t bus_hz;
99 uint32_t pclkb_hz;
101
116
117/* =============================================================================
118 * Lifecycle
119 * =============================================================================
120 */
121
149[[nodiscard]] ra8_err_t ra8_i2c_init(uint8_t channel, const ra8_i2c_cfg_t* cfg);
150
166[[nodiscard]] ra8_err_t ra8_i2c_deinit(uint8_t channel);
167
185[[nodiscard]] ra8_err_t ra8_i2c_set_clock(uint8_t channel, uint32_t bus_hz, uint32_t pclkb_hz);
186
187/* =============================================================================
188 * Polling transfers
189 * =============================================================================
190 */
191
235[[nodiscard]] ra8_err_t ra8_i2c_write(uint8_t channel,
236 uint8_t peripheral_7b,
237 const uint8_t* data,
238 uint32_t len,
239 bool send_stop);
240
279[[nodiscard]] ra8_err_t
280ra8_i2c_read(uint8_t channel, uint8_t peripheral_7b, uint8_t* data, uint32_t len);
281
317[[nodiscard]] ra8_err_t ra8_i2c_transfer(uint8_t channel,
318 uint8_t peripheral_7b,
319 const uint8_t* wr,
320 uint32_t wr_len,
321 uint8_t* rd,
322 uint32_t rd_len);
323
348[[nodiscard]] ra8_err_t ra8_i2c_scan(uint8_t channel, uint8_t peripheral_7b, bool* out_acked);
349
350/* =============================================================================
351 * Status
352 * =============================================================================
353 */
354
372[[nodiscard]] ra8_err_t ra8_i2c_get_errors(uint8_t channel, uint8_t* out_mask);
373
389[[nodiscard]] ra8_err_t ra8_i2c_clear_errors(uint8_t channel);
390
391/* =============================================================================
392 * Target (peripheral) role
393 * =============================================================================
394 */
395
415
437
463
489
524[[nodiscard]] ra8_err_t ra8_i2c_peripheral_init(uint8_t channel,
525 const ra8_i2c_peripheral_cfg_t* cfg);
526
545[[nodiscard]] ra8_err_t ra8_i2c_peripheral_deinit(uint8_t channel);
546
576[[nodiscard]] ra8_err_t ra8_i2c_peripheral_poll(uint8_t channel,
577 ra8_i2c_peripheral_event_t* out_event);
578
613[[nodiscard]] ra8_err_t ra8_i2c_peripheral_receive(uint8_t channel,
614 uint8_t* buf,
615 uint32_t capacity,
616 uint32_t* out_received);
617
653[[nodiscard]] ra8_err_t
654ra8_i2c_peripheral_transmit(uint8_t channel, const uint8_t* data, uint32_t len, uint32_t* out_sent);
655
683[[nodiscard]] ra8_err_t
685
712void ra8_i2c_peripheral_dispatch(uint8_t channel);
713
714#ifdef __cplusplus
715}
716#endif
Error Code Definitions for ra8-firmware.
ra8_err_codes_t ra8_err_t
Canonical error-return type used by every ra8-firmware API.
Definition ra8_err.h:546
ra8_err_t ra8_i2c_deinit(uint8_t channel)
Tear down an IIC channel.
ra8_i2c_speed_t
Supported bus speeds.
Definition ra8_i2c.h:79
@ k_ra8_i2c_speed_standard
100 kHz Standard mode (Sm).
Definition ra8_i2c.h:80
@ k_ra8_i2c_speed_fast
400 kHz Fast mode (Fm).
Definition ra8_i2c.h:81
@ k_ra8_i2c_speed_fast_plus
1 MHz Fast-mode Plus (Fm+).
Definition ra8_i2c.h:82
ra8_err_t ra8_i2c_peripheral_transmit(uint8_t channel, const uint8_t *data, uint32_t len, uint32_t *out_sent)
Answer a controller-read transaction from data (target transmit).
ra8_err_t ra8_i2c_scan(uint8_t channel, uint8_t peripheral_7b, bool *out_acked)
Probe whether a 7-bit peripheral address ACKs.
Definition ra8_i2c.c:762
ra8_err_t ra8_i2c_init(uint8_t channel, const ra8_i2c_cfg_t *cfg)
Initialise an IIC channel as a controller and bring the bus up.
ra8_err_t ra8_i2c_peripheral_init(uint8_t channel, const ra8_i2c_peripheral_cfg_t *cfg)
Arm an IIC channel to answer as an I2C target (peripheral).
ra8_err_t ra8_i2c_write(uint8_t channel, uint8_t peripheral_7b, const uint8_t *data, uint32_t len, bool send_stop)
Polling write of len bytes to a 7-bit peripheral address.
Definition ra8_i2c.c:579
ra8_err_t ra8_i2c_get_errors(uint8_t channel, uint8_t *out_mask)
Read latched error flags from ICSR2 (AL / NACKF / TMOF).
ra8_err_t ra8_i2c_read(uint8_t channel, uint8_t peripheral_7b, uint8_t *data, uint32_t len)
Polling read of len bytes from a 7-bit peripheral.
Definition ra8_i2c.c:688
ra8_i2c_peripheral_slot_t
Which own-address register pair (SARLy/SARUy) holds the address.
Definition ra8_i2c.h:410
@ k_ra8_i2c_peripheral_slot_2
Own-address slot 2 (SARL2/SARU2).
Definition ra8_i2c.h:413
@ k_ra8_i2c_peripheral_slot_0
Own-address slot 0 (SARL0/SARU0).
Definition ra8_i2c.h:411
@ k_ra8_i2c_peripheral_slot_1
Own-address slot 1 (SARL1/SARU1).
Definition ra8_i2c.h:412
ra8_err_t ra8_i2c_clear_errors(uint8_t channel)
Clear latched error flags in ICSR2.
void(* ra8_i2c_peripheral_event_fn_t)(void *ctx, ra8_i2c_peripheral_event_t event)
Address-match callback fired by ra8_i2c_peripheral_dispatch.
Definition ra8_i2c.h:462
ra8_err_t ra8_i2c_peripheral_poll(uint8_t channel, ra8_i2c_peripheral_event_t *out_event)
Wait (bounded) for a controller to address this target.
ra8_i2c_err_mask_t
Error-mask bits returned by ra8_i2c_get_errors.
Definition ra8_i2c.h:110
@ k_ra8_i2c_err_none
No latched error.
Definition ra8_i2c.h:111
@ k_ra8_i2c_err_arb_lost
ICSR2.AL set (arbitration lost).
Definition ra8_i2c.h:112
@ k_ra8_i2c_err_nack
ICSR2.NACKF set (NACK received).
Definition ra8_i2c.h:113
@ k_ra8_i2c_err_timeout
ICSR2.TMOF set (bus timeout).
Definition ra8_i2c.h:114
ra8_err_t ra8_i2c_set_clock(uint8_t channel, uint32_t bus_hz, uint32_t pclkb_hz)
Update the bus clock without tearing the channel down.
ra8_err_t ra8_i2c_transfer(uint8_t channel, uint8_t peripheral_7b, const uint8_t *wr, uint32_t wr_len, uint8_t *rd, uint32_t rd_len)
Combined write-then-RESTART-then-read in one bus transaction.
Definition ra8_i2c.c:726
ra8_err_t ra8_i2c_peripheral_deinit(uint8_t channel)
Disarm own-address matching, returning the channel to controller use.
void ra8_i2c_peripheral_dispatch(uint8_t channel)
Snapshot the latched target status and fire the attached callback.
ra8_err_t ra8_i2c_peripheral_receive(uint8_t channel, uint8_t *buf, uint32_t capacity, uint32_t *out_received)
Drain a controller-write transaction into buf (target receive).
ra8_i2c_peripheral_event_t
Outcome of ra8_i2c_peripheral_poll / ra8_i2c_peripheral_dispatch.
Definition ra8_i2c.h:431
@ k_ra8_i2c_peripheral_event_none
No own-address match observed.
Definition ra8_i2c.h:432
@ k_ra8_i2c_peripheral_event_write
Controller WRITE: call receive next.
Definition ra8_i2c.h:433
@ k_ra8_i2c_peripheral_event_read
Controller READ: call transmit next.
Definition ra8_i2c.h:434
@ k_ra8_i2c_peripheral_event_stop
STOP ended the transaction (idle).
Definition ra8_i2c.h:435
ra8_err_t ra8_i2c_peripheral_attach_handler(uint8_t channel, ra8_i2c_peripheral_event_fn_t fn, void *ctx)
Attach (or detach) the address-match callback for a channel.
Configuration descriptor for ra8_i2c_init.
Definition ra8_i2c.h:97
uint32_t bus_hz
Target I2C clock rate in Hz.
Definition ra8_i2c.h:98
uint32_t pclkb_hz
Current PCLKB frequency in Hz for bit-rate calc.
Definition ra8_i2c.h:99
Configuration descriptor for ra8_i2c_peripheral_init.
Definition ra8_i2c.h:482
ra8_i2c_peripheral_slot_t slot
Own-address comparator slot.
Definition ra8_i2c.h:484
uint8_t own_addr_7b
7-bit own address to answer on.
Definition ra8_i2c.h:483
bool general_call
Also answer the general-call addr.
Definition ra8_i2c.h:485
bool irq_enable
Arm ICIER RIE / TIE / SPIE.
Definition ra8_i2c.h:487
bool clock_stretch
Arm ICMR3.WAIT clock stretching.
Definition ra8_i2c.h:486