HPM SDK
HPMicro Software Development Kit
hpm_i2c_drv.h
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2021 HPMicro
3  *
4  * SPDX-License-Identifier: BSD-3-Clause
5  *
6  */
7 
8 #ifndef HPM_I2C_DRV_H
9 #define HPM_I2C_DRV_H
10 #include "hpm_common.h"
11 #include "hpm_i2c_regs.h"
12 #include "hpm_soc_feature.h"
13 
24 enum {
30 };
31 
32 /* convert data count value into register(CTRL[DATACNT] and CTRL[DATACNT_HIGH] if exist) */
33 /* x range from 1 to I2C_SOC_TRANSFER_COUNT_MAX */
34 /* 0 for I2C_SOC_TRANSFER_COUNT_MAX */
35 #define I2C_DATACNT_MAP(x) (((x) == I2C_SOC_TRANSFER_COUNT_MAX) ? 0 : x)
36 
40 #define I2C_CMD_NO_ACTION (I2C_CMD_CMD_SET(0))
41 #define I2C_CMD_ISSUE_DATA_TRANSMISSION (I2C_CMD_CMD_SET(1))
42 #define I2C_CMD_ACK (I2C_CMD_CMD_SET(2))
43 #define I2C_CMD_NACK (I2C_CMD_CMD_SET(3))
44 #define I2C_CMD_CLEAR_FIFO (I2C_CMD_CMD_SET(4))
45 #define I2C_CMD_RESET (I2C_CMD_CMD_SET(5))
46 
50 #define I2C_DIR_MASTER_WRITE (0U)
51 #define I2C_DIR_MASTER_READ (1U)
52 #define I2C_DIR_SLAVE_READ (0U)
53 #define I2C_DIR_SLAVE_WRITE (1U)
54 
58 #define I2C_EVENT_TRANSACTION_COMPLETE I2C_INTEN_CMPL_MASK
59 #define I2C_EVENT_BYTE_RECEIVED I2C_INTEN_BYTERECV_MASK
60 #define I2C_EVENT_BYTE_TRANSMIT I2C_INTEN_BYTETRANS_MASK
61 #define I2C_EVENT_START_CONDITION I2C_INTEN_START_MASK
62 #define I2C_EVENT_STOP_CONDITION I2C_INTEN_STOP_MASK
63 #define I2C_EVENT_LOSS_ARBITRATION I2C_INTEN_ARBLOSE_MASK
64 #define I2C_EVENT_ADDRESS_HIT I2C_INTEN_ADDRHIT_MASK
65 #define I2C_EVENT_FIFO_HALF I2C_INTEN_FIFOHALF_MASK
66 #define I2C_EVENT_FIFO_FULL I2C_INTEN_FIFOFULL_MASK
67 #define I2C_EVENT_FIFO_EMPTY I2C_INTEN_FIFOEMPTY_MASK
68 
69 #define I2C_EVENT_ALL_MASK (I2C_INTEN_CMPL_MASK \
70  | I2C_INTEN_BYTERECV_MASK \
71  | I2C_INTEN_BYTETRANS_MASK \
72  | I2C_INTEN_START_MASK \
73  | I2C_INTEN_STOP_MASK \
74  | I2C_INTEN_ARBLOSE_MASK \
75  | I2C_INTEN_ADDRHIT_MASK \
76  | I2C_INTEN_FIFOHALF_MASK \
77  | I2C_INTEN_FIFOFULL_MASK \
78  | I2C_INTEN_FIFOEMPTY_MASK)
82 #define I2C_STATUS_LINE_SDA I2C_STATUS_LINESDA_MASK
83 #define I2C_STATUS_LINE_SCL I2C_STATUS_LINESCL_MASK
84 #define I2C_STATUS_GENERAL_CALL I2C_STATUS_GENCALL_MASK
85 #define I2C_STATUS_BUS_BUSY I2C_STATUS_BUSBUSY_MASK
86 #define I2C_STATUS_ACK I2C_STATUS_ACK_MASK
87 
88 #define I2C_WR 0x0000 /* not operable with read flags*/
89 #define I2C_RD (1u << 0) /* not operable with write flags*/
90 #define I2C_ADDR_10BIT (1u << 2) /* this is a ten bit chip address */
91 #define I2C_NO_START (1u << 4) /* no start */
92 #define I2C_NO_READ_ACK (1u << 6) /* when I2C reading, we do not ACK */
93 #define I2C_NO_STOP (1u << 7) /* no stop */
94 
98 typedef struct {
100  uint8_t i2c_mode;
101 } i2c_config_t;
102 
106 typedef enum i2c_mode {
111 
118 typedef enum i2c_seq_transfer_opt {
123 
124 #ifdef __cplusplus
125 extern "C" {
126 #endif
127 
133 static inline void i2c_respond_Nack(I2C_Type *ptr)
134 {
135  ptr->CMD = I2C_CMD_NACK;
136 }
137 
143 static inline void i2c_respond_ack(I2C_Type *ptr)
144 {
145  ptr->CMD = I2C_CMD_ACK;
146 }
147 
153 static inline void i2c_clear_fifo(I2C_Type *ptr)
154 {
155  ptr->CMD = I2C_CMD_CLEAR_FIFO;
156 }
157 
166 static inline uint8_t i2c_get_data_count(I2C_Type *ptr)
167 {
168  uint32_t i2c_ctrl = ptr->CTRL;
169  return (I2C_CTRL_DATACNT_HIGH_GET(i2c_ctrl) << 8U) + I2C_CTRL_DATACNT_GET(i2c_ctrl);
170 }
171 
178 static inline bool i2c_fifo_is_full(I2C_Type *ptr)
179 {
180  return ptr->STATUS & I2C_STATUS_FIFOFULL_MASK;
181 }
182 
192 static inline bool i2c_fifo_is_half(I2C_Type *ptr)
193 {
194  return ptr->STATUS & I2C_STATUS_FIFOHALF_MASK;
195 }
196 
203 static inline bool i2c_fifo_is_empty(I2C_Type *ptr)
204 {
205  return ptr->STATUS & I2C_STATUS_FIFOEMPTY_MASK;
206 }
207 
217 static inline bool i2c_is_writing(I2C_Type *ptr)
218 {
219  return (ptr->CTRL & I2C_CTRL_DIR_MASK);
220 }
221 
231 static inline bool i2c_is_reading(I2C_Type *ptr)
232 {
233  return !i2c_is_writing(ptr);
234 }
235 
245 static inline bool i2c_get_line_sda_status(I2C_Type *ptr)
246 {
247  return I2C_STATUS_LINESDA_GET(ptr->STATUS);
248 }
249 
259 static inline bool i2c_get_line_scl_status(I2C_Type *ptr)
260 {
261  return I2C_STATUS_LINESCL_GET(ptr->STATUS);
262 }
263 
272 static inline void i2c_clear_status(I2C_Type *ptr, uint32_t mask)
273 {
274  ptr->STATUS = mask;
275 }
276 
285 static inline uint32_t i2c_get_status(I2C_Type *ptr)
286 {
287  return ptr->STATUS;
288 }
289 
298 static inline uint32_t i2c_get_irq_setting(I2C_Type *ptr)
299 {
300  return ptr->INTEN;
301 }
302 
311 static inline void i2c_disable_irq(I2C_Type *ptr, uint32_t mask)
312 {
313  ptr->INTEN &= ~mask;
314 }
315 
324 static inline void i2c_enable_irq(I2C_Type *ptr, uint32_t mask)
325 {
326  ptr->INTEN |= mask;
327 }
328 
336 static inline void i2c_disable_auto_ack(I2C_Type *ptr)
337 {
339 }
340 
348 static inline void i2c_enable_auto_ack(I2C_Type *ptr)
349 {
351 }
352 
363 static inline void i2c_enable_10bit_address_mode(I2C_Type *ptr, bool enable)
364 {
365  ptr->SETUP |= I2C_SETUP_ADDRESSING_SET(enable);
366 }
367 
379  uint32_t src_clk_in_hz,
380  i2c_config_t *config);
381 
397  const uint16_t device_address,
398  uint8_t *addr,
399  uint32_t addr_size_in_byte,
400  uint8_t *buf,
401  const uint32_t size_in_byte);
402 
418  const uint16_t device_address,
419  uint8_t *addr,
420  uint32_t addr_size_in_byte,
421  uint8_t *buf,
422  const uint32_t size_in_byte);
423 
437  const uint16_t device_address,
438  uint8_t *buf,
439  const uint32_t size);
440 
452 hpm_stat_t i2c_master_start_dma_write(I2C_Type *i2c_ptr, const uint16_t device_address, uint32_t size);
453 
465 hpm_stat_t i2c_master_start_dma_read(I2C_Type *i2c_ptr, const uint16_t device_address, uint32_t size);
466 
480  const uint16_t device_address,
481  uint8_t *buf,
482  const uint32_t size);
494 hpm_stat_t i2c_init_slave(I2C_Type *ptr, uint32_t src_clk_in_hz,
495  i2c_config_t *config, const uint16_t slave_address);
496 
508 hpm_stat_t i2c_slave_read(I2C_Type *ptr, uint8_t *buf, const uint32_t size);
509 
521 hpm_stat_t i2c_slave_write(I2C_Type *ptr, uint8_t *buf, const uint32_t size);
522 
528 void i2c_reset(I2C_Type *ptr);
529 
535 static inline void i2c_dma_enable(I2C_Type *ptr)
536 {
537  ptr->SETUP |= I2C_SETUP_DMAEN_MASK;
538 }
539 
545 static inline void i2c_dma_disable(I2C_Type *ptr)
546 {
547  ptr->SETUP &= ~I2C_SETUP_DMAEN_MASK;
548 }
549 
559 hpm_stat_t i2c_slave_dma_transfer(I2C_Type *ptr, const uint32_t size);
560 
567 static inline void i2c_write_byte(I2C_Type *ptr, uint8_t data)
568 {
569  ptr->DATA = I2C_DATA_DATA_SET(data);
570 }
571 
578 static inline uint8_t i2c_read_byte(I2C_Type *ptr)
579 {
580  return (uint8_t)I2C_DATA_DATA_GET(ptr->DATA);
581 }
582 
591 static inline uint8_t i2c_get_direction(I2C_Type *ptr)
592 {
593  return (uint8_t)I2C_CTRL_DIR_GET(ptr->CTRL);
594 }
595 
605 hpm_stat_t i2c_master_configure_transfer(I2C_Type *i2c_ptr, const uint16_t device_address, uint32_t size, bool read);
606 
617 hpm_stat_t i2c_master_seq_transmit(I2C_Type *ptr, const uint16_t device_address,
618  uint8_t *buf, const uint32_t size, i2c_seq_transfer_opt_t opt);
619 
630 hpm_stat_t i2c_master_seq_receive(I2C_Type *ptr, const uint16_t device_address,
631  uint8_t *buf, const uint32_t size, i2c_seq_transfer_opt_t opt);
632 
633 #if defined(HPM_IP_FEATURE_I2C_SUPPORT_RESET) && (HPM_IP_FEATURE_I2C_SUPPORT_RESET == 1)
640 static inline void i2s_gen_reset_signal(I2C_Type *ptr, uint8_t clk_len)
641 {
642  ptr->CTRL = (ptr->CTRL & ~I2C_CTRL_RESET_LEN_MASK) | I2C_CTRL_RESET_LEN_SET(clk_len) \
644 }
645 #endif
646 
657 hpm_stat_t i2c_master_transfer(I2C_Type *ptr, const uint16_t device_address,
658  uint8_t *buf, const uint32_t size, uint16_t flags);
663 #ifdef __cplusplus
664 }
665 #endif
666 
667 #endif /* HPM_I2C_DRV_H */
668 
uint32_t hpm_stat_t
Definition: hpm_common.h:119
#define MAKE_STATUS(group, code)
Definition: hpm_common.h:128
@ status_group_i2c
Definition: hpm_common.h:133
static void i2c_clear_fifo(I2C_Type *ptr)
clear I2C fifo
Definition: hpm_i2c_drv.h:153
hpm_stat_t i2c_master_start_dma_write(I2C_Type *i2c_ptr, const uint16_t device_address, uint32_t size)
I2C master start write data by DMA.
Definition: hpm_i2c_drv.c:709
static bool i2c_get_line_scl_status(I2C_Type *ptr)
get i2c scl line status
Definition: hpm_i2c_drv.h:259
static void i2c_respond_ack(I2C_Type *ptr)
respond ACK
Definition: hpm_i2c_drv.h:143
#define I2C_CMD_NACK
Definition: hpm_i2c_drv.h:43
hpm_stat_t i2c_init_slave(I2C_Type *ptr, uint32_t src_clk_in_hz, i2c_config_t *config, const uint16_t slave_address)
I2C slave initialization.
Definition: hpm_i2c_drv.c:549
hpm_stat_t i2c_master_write(I2C_Type *ptr, const uint16_t device_address, uint8_t *buf, const uint32_t size)
I2C master write data to certain slave device.
Definition: hpm_i2c_drv.c:458
#define I2C_EVENT_BYTE_RECEIVED
Definition: hpm_i2c_drv.h:59
hpm_stat_t i2c_master_address_write(I2C_Type *ptr, const uint16_t device_address, uint8_t *addr, uint32_t addr_size_in_byte, uint8_t *buf, const uint32_t size_in_byte)
I2C master write data to specific address of certain slave device.
Definition: hpm_i2c_drv.c:276
hpm_stat_t i2c_slave_dma_transfer(I2C_Type *ptr, const uint32_t size)
I2C slave dma transfer data.
Definition: hpm_i2c_drv.c:780
hpm_stat_t i2c_master_seq_transmit(I2C_Type *ptr, const uint16_t device_address, uint8_t *buf, const uint32_t size, i2c_seq_transfer_opt_t opt)
sequential transmit in master I2C mode an amount of data in blocking
Definition: hpm_i2c_drv.c:830
enum i2c_seq_transfer_opt i2c_seq_transfer_opt_t
I2c sequential transfer options.
static void i2c_write_byte(I2C_Type *ptr, uint8_t data)
I2C write byte into FIFO.
Definition: hpm_i2c_drv.h:567
i2c_seq_transfer_opt
I2c sequential transfer options.
Definition: hpm_i2c_drv.h:118
static bool i2c_fifo_is_half(I2C_Type *ptr)
check if I2C FIFO is half
Definition: hpm_i2c_drv.h:192
static void i2c_enable_auto_ack(I2C_Type *ptr)
enable auto ack
Definition: hpm_i2c_drv.h:348
static bool i2c_is_reading(I2C_Type *ptr)
check if I2C is reading
Definition: hpm_i2c_drv.h:231
static void i2c_disable_auto_ack(I2C_Type *ptr)
disable auto ack
Definition: hpm_i2c_drv.h:336
hpm_stat_t i2c_master_address_read(I2C_Type *ptr, const uint16_t device_address, uint8_t *addr, uint32_t addr_size_in_byte, uint8_t *buf, const uint32_t size_in_byte)
I2C master read data from specific address of certain slave device.
Definition: hpm_i2c_drv.c:161
static void i2c_dma_enable(I2C_Type *ptr)
Enable i2c DMA.
Definition: hpm_i2c_drv.h:535
static void i2c_respond_Nack(I2C_Type *ptr)
respond NACK
Definition: hpm_i2c_drv.h:133
static bool i2c_fifo_is_empty(I2C_Type *ptr)
check if I2C FIFO is empty
Definition: hpm_i2c_drv.h:203
static void i2c_dma_disable(I2C_Type *ptr)
Disable i2c DMA.
Definition: hpm_i2c_drv.h:545
static bool i2c_get_line_sda_status(I2C_Type *ptr)
get i2c sda line status
Definition: hpm_i2c_drv.h:245
static uint32_t i2c_get_irq_setting(I2C_Type *ptr)
i2c get interrupts setting
Definition: hpm_i2c_drv.h:298
static uint32_t i2c_get_status(I2C_Type *ptr)
get status
Definition: hpm_i2c_drv.h:285
#define I2C_CMD_ACK
Definition: hpm_i2c_drv.h:42
hpm_stat_t i2c_init_master(I2C_Type *ptr, uint32_t src_clk_in_hz, i2c_config_t *config)
I2C master initialization.
Definition: hpm_i2c_drv.c:135
static uint8_t i2c_get_direction(I2C_Type *ptr)
I2C get direction.
Definition: hpm_i2c_drv.h:591
void i2c_reset(I2C_Type *ptr)
reset I2C
Definition: hpm_i2c_drv.c:128
i2c_mode
I2C mode.
Definition: hpm_i2c_drv.h:106
hpm_stat_t i2c_master_read(I2C_Type *ptr, const uint16_t device_address, uint8_t *buf, const uint32_t size)
I2C master read data from certain slave device.
Definition: hpm_i2c_drv.c:368
static void i2c_disable_irq(I2C_Type *ptr, uint32_t mask)
disable interrupts
Definition: hpm_i2c_drv.h:311
static uint8_t i2c_get_data_count(I2C_Type *ptr)
check data count
Definition: hpm_i2c_drv.h:166
static void i2c_clear_status(I2C_Type *ptr, uint32_t mask)
clear status
Definition: hpm_i2c_drv.h:272
static bool i2c_fifo_is_full(I2C_Type *ptr)
check if I2C FIFO is full
Definition: hpm_i2c_drv.h:178
static uint8_t i2c_read_byte(I2C_Type *ptr)
I2C read byte into FIFO.
Definition: hpm_i2c_drv.h:578
hpm_stat_t i2c_master_seq_receive(I2C_Type *ptr, const uint16_t device_address, uint8_t *buf, const uint32_t size, i2c_seq_transfer_opt_t opt)
sequential receive in master I2C mode an amount of data in blocking
Definition: hpm_i2c_drv.c:907
static bool i2c_is_writing(I2C_Type *ptr)
check if I2C is writing
Definition: hpm_i2c_drv.h:217
#define I2C_CMD_CLEAR_FIFO
Definition: hpm_i2c_drv.h:44
static void i2c_enable_10bit_address_mode(I2C_Type *ptr, bool enable)
enable 10 bit address mode
Definition: hpm_i2c_drv.h:363
hpm_stat_t i2c_master_configure_transfer(I2C_Type *i2c_ptr, const uint16_t device_address, uint32_t size, bool read)
I2C master configure transfer setting.
Definition: hpm_i2c_drv.c:797
static void i2c_enable_irq(I2C_Type *ptr, uint32_t mask)
enable interrupts
Definition: hpm_i2c_drv.h:324
enum i2c_mode i2c_mode_t
I2C mode.
static void i2s_gen_reset_signal(I2C_Type *ptr, uint8_t clk_len)
generate SCL clock as reset signal
Definition: hpm_i2c_drv.h:640
hpm_stat_t i2c_master_transfer(I2C_Type *ptr, const uint16_t device_address, uint8_t *buf, const uint32_t size, uint16_t flags)
data transfer on master I2C mode in blocking
Definition: hpm_i2c_drv.c:995
hpm_stat_t i2c_master_start_dma_read(I2C_Type *i2c_ptr, const uint16_t device_address, uint32_t size)
I2C master start read data by DMA.
Definition: hpm_i2c_drv.c:745
hpm_stat_t i2c_slave_read(I2C_Type *ptr, uint8_t *buf, const uint32_t size)
I2C slave read data.
Definition: hpm_i2c_drv.c:642
hpm_stat_t i2c_slave_write(I2C_Type *ptr, uint8_t *buf, const uint32_t size)
I2C slave write data.
Definition: hpm_i2c_drv.c:577
@ i2c_next_frame
Definition: hpm_i2c_drv.h:120
@ i2c_last_frame
Definition: hpm_i2c_drv.h:121
@ i2c_frist_frame
Definition: hpm_i2c_drv.h:119
@ status_i2c_invalid_data
Definition: hpm_i2c_drv.h:26
@ status_i2c_transmit_not_completed
Definition: hpm_i2c_drv.h:28
@ status_i2c_no_addr_hit
Definition: hpm_i2c_drv.h:27
@ status_i2c_no_ack
Definition: hpm_i2c_drv.h:25
@ status_i2c_not_supported
Definition: hpm_i2c_drv.h:29
@ i2c_mode_fast_plus
Definition: hpm_i2c_drv.h:109
@ i2c_mode_normal
Definition: hpm_i2c_drv.h:107
@ i2c_mode_fast
Definition: hpm_i2c_drv.h:108
#define I2C_DATA_DATA_GET(x)
Definition: hpm_i2c_regs.h:336
#define I2C_STATUS_FIFOHALF_MASK
Definition: hpm_i2c_regs.h:292
#define I2C_STATUS_FIFOEMPTY_MASK
Definition: hpm_i2c_regs.h:310
#define I2C_CTRL_RESET_HOLD_SCKIN_MASK
Definition: hpm_i2c_regs.h:368
#define I2C_STATUS_LINESDA_GET(x)
Definition: hpm_i2c_regs.h:167
#define I2C_CTRL_DATACNT_HIGH_GET(x)
Definition: hpm_i2c_regs.h:351
#define I2C_STATUS_FIFOFULL_MASK
Definition: hpm_i2c_regs.h:301
#define I2C_CTRL_DATACNT_GET(x)
Definition: hpm_i2c_regs.h:456
#define I2C_CTRL_DIR_MASK
Definition: hpm_i2c_regs.h:439
#define I2C_CTRL_RESET_LEN_MASK
Definition: hpm_i2c_regs.h:358
#define I2C_DATA_DATA_SET(x)
Definition: hpm_i2c_regs.h:335
#define I2C_CTRL_RESET_LEN_SET(x)
Definition: hpm_i2c_regs.h:360
#define I2C_CTRL_RESET_ON_MASK
Definition: hpm_i2c_regs.h:379
#define I2C_CTRL_DIR_GET(x)
Definition: hpm_i2c_regs.h:442
#define I2C_SETUP_ADDRESSING_SET(x)
Definition: hpm_i2c_regs.h:573
#define I2C_SETUP_DMAEN_MASK
Definition: hpm_i2c_regs.h:547
#define I2C_STATUS_LINESCL_GET(x)
Definition: hpm_i2c_regs.h:178
Definition: hpm_i2c_regs.h:12
__RW uint32_t STATUS
Definition: hpm_i2c_regs.h:16
__RW uint32_t CMD
Definition: hpm_i2c_regs.h:20
__RW uint32_t DATA
Definition: hpm_i2c_regs.h:18
__RW uint32_t CTRL
Definition: hpm_i2c_regs.h:19
__RW uint32_t SETUP
Definition: hpm_i2c_regs.h:21
__RW uint32_t INTEN
Definition: hpm_i2c_regs.h:15
I2C config.
Definition: hpm_i2c_drv.h:98
uint8_t i2c_mode
Definition: hpm_i2c_drv.h:100
bool is_10bit_addressing
Definition: hpm_i2c_drv.h:99