NavHAL 0.1.0
NAVRobotec's architecture-agnostic HAL for embedded systems.
Loading...
Searching...
No Matches
i2c.c File Reference

HAL I2C driver implementation for STM32F4 series. More...

#include "core/cortex-m4/i2c.h"
#include "core/cortex-m4/clock.h"
#include "core/cortex-m4/i2c_reg.h"
#include "core/cortex-m4/rcc_reg.h"
#include <stdbool.h>
#include <stdint.h>
Include dependency graph for i2c.c:

Macros

#define TIMEOUT   1000000
 Maximum wait cycles for flag checks.
#define I2C1_EN   1
 Init status mask for I2C1.
#define I2C2_EN   2
 Init status mask for I2C2.
#define I2C3_EN   4
 Init status mask for I2C3.

Functions

uint8_t hal_i2c_get_init_status (void)
 Get initialization status of I2C buses.
hal_i2c_status_t hal_i2c_init (hal_i2c_bus_t bus, hal_i2c_config_t *config)
 Initialize I2C peripheral in master mode.
hal_i2c_status_t hal_i2c_write (uint8_t bus, uint8_t dev_addr, const uint8_t *data, uint16_t len)
 Write data to I2C device.
hal_i2c_status_t hal_i2c_read (uint8_t bus, uint8_t dev_addr, uint8_t *data, uint16_t len)
 Read data from I2C device.
hal_i2c_status_t hal_i2c_write_read (uint8_t bus, uint8_t dev_addr, const uint8_t *tx_data, uint16_t tx_len, uint8_t *rx_data, uint16_t rx_len)
 Combined write-read operation.

Detailed Description

HAL I2C driver implementation for STM32F4 series.

This file provides a complete hardware abstraction layer for I2C communication on STM32F4 microcontrollers. It supports:

  • Master mode operation (7-bit addressing)
  • Standard mode (100 kHz) and Fast mode (400 kHz)
  • Combined write/read operations
  • Timeout handling for robust operation
  • Automatic clock configuration

The implementation handles all low-level register operations and provides high-level functions for common I2C transactions.

Note
Slave mode is not currently implemented (marked as TODO)

Macro Definition Documentation

◆ I2C1_EN

#define I2C1_EN   1

Init status mask for I2C1.

◆ I2C2_EN

#define I2C2_EN   2

Init status mask for I2C2.

◆ I2C3_EN

#define I2C3_EN   4

Init status mask for I2C3.

◆ TIMEOUT

#define TIMEOUT   1000000

Maximum wait cycles for flag checks.

Function Documentation

◆ hal_i2c_get_init_status()

uint8_t hal_i2c_get_init_status ( void )

Get initialization status of I2C buses.

Get the initialization status of the I²C peripheral.

Returns
Bitmask indicating which I2C buses are initialized
Return values
Bit0: I2C1 status
Bit1: I2C2 status
Bit2: I2C3 status

◆ hal_i2c_init()

hal_i2c_status_t hal_i2c_init ( hal_i2c_bus_t bus,
hal_i2c_config_t * config )

Initialize I2C peripheral in master mode.

Initialize the I²C peripheral.

Parameters
[in]busI2C bus identifier (I2C1, I2C2, I2C3)
[in]configPointer to configuration structure
Returns
Status of initialization
Return values
HAL_I2C_OKInitialization successful
HAL_I2C_ERR_REINITBus already initialized
HAL_I2C_ERR_BUSUnsupported mode (slave not implemented)

Configures the specified I2C bus with:

  • Clock speed (standard/fast mode)
  • APB1 clock prescaler
  • Rise time calculation
  • Peripheral enable
Note
Automatically enables the required RCC clock for the I2C peripheral

< I²C base address

◆ hal_i2c_read()

hal_i2c_status_t hal_i2c_read ( uint8_t bus,
uint8_t dev_addr,
uint8_t * data,
uint16_t len )

Read data from I2C device.

Read data from an I²C device.

Parameters
[in]busI2C bus identifier
[in]dev_addr7-bit device address
[out]dataPointer to receive buffer
[in]lenNumber of bytes to receive
Returns
Status of operation
Return values
HAL_I2C_OKReception successful
HAL_I2C_ERR_TIMEOUTBus timeout occurred
HAL_I2C_ERR_BUSInvalid parameters

Performs complete I2C read transaction:

  1. START condition
  2. Address + Read bit
  3. Data bytes with proper ACK/NACK
  4. STOP condition

< I²C base address

◆ hal_i2c_write()

hal_i2c_status_t hal_i2c_write ( uint8_t bus,
uint8_t dev_addr,
const uint8_t * data,
uint16_t len )

Write data to I2C device.

Write data to an I²C device.

Parameters
[in]busI2C bus identifier
[in]dev_addr7-bit device address
[in]dataPointer to transmit buffer
[in]lenNumber of bytes to transmit
Returns
Status of operation
Return values
HAL_I2C_OKTransmission successful
HAL_I2C_ERR_TIMEOUTBus timeout occurred

Performs complete I2C write transaction:

  1. START condition
  2. Address + Write bit
  3. Data bytes
  4. STOP condition

◆ hal_i2c_write_read()

hal_i2c_status_t hal_i2c_write_read ( uint8_t bus,
uint8_t dev_addr,
const uint8_t * tx_data,
uint16_t tx_len,
uint8_t * rx_data,
uint16_t rx_len )

Combined write-read operation.

Write to a device register and read back data.

Parameters
[in]busI2C bus identifier
[in]dev_addr7-bit device address
[in]tx_dataPointer to transmit buffer
[in]tx_lenNumber of bytes to transmit
[out]rx_dataPointer to receive buffer
[in]rx_lenNumber of bytes to receive
Returns
Status of operation
Return values
HAL_I2C_OKOperation successful
HAL_I2C_ERR_TIMEOUTBus timeout occurred
HAL_I2C_ERR_BUSInvalid parameters

Performs combined I2C transaction:

  1. Write phase (registers/commands)
  2. Repeated START
  3. Read phase (data) Handles all ACK/NACK and STOP conditions automatically

< I²C base address