I2C Peripheral Addresses and Bus Configuration for DAC5578 and ADS7830 in PLFM RADAR Firmware
DAC5578 DACs use I²C bus hi2c1 with addresses 0x48 and 0x49, while ADS7830 ADCs use hi2c2 with addresses 0x48, 0x49, 0x4A, or 0x4B depending on hardware pin-strapping.
The PLFM RADAR project uses a STM32F7 microcontroller to manage multiple analog peripherals through separate I²C buses. Understanding the I2C peripheral addresses and bus configuration for DAC5578 and ADS7830 devices is essential for modifying the firmware or debugging communication issues. This article breaks down the exact addresses, HAL handles, and initialization code found in the open-source firmware.
I2C Bus Assignment Strategy
The firmware deliberately separates DAC and ADC devices across two I²C peripherals to eliminate bus contention and match the PCB routing.
| Peripheral | I²C Bus (HAL Handle) | Purpose |
|---|---|---|
| DAC5578 (2× devices) | hi2c1 |
Gate voltage (Vg) control for power amplifier channels |
| ADS7830 (3× devices) | hi2c2 |
Idq measurement and thermal monitoring |
This separation allows simultaneous transactions without arbitration delays and simplifies timing requirements for the 8-channel DAC updates.
DAC5578 I2C Configuration
Each DAC5578 is an 8-channel, 8-bit digital-to-analog converter. The PLFM RADAR Main Board contains two instances for independent PA channel control.
Default I²C Addresses
| Device | Address | PCB Reference | Handle Name |
|---|---|---|---|
| First DAC5578 | 0x48 |
U7 | hdac1 |
| Second DAC5578 | 0x49 |
U69 | hdac2 |
Initialization Code
In main.cpp (lines 1845-1855), both DACs are initialized with &hi2c1 and their respective addresses:
#include "DAC5578.H"
DAC5578_HandleTypeDef hdac1, hdac2;
/* Initialize first DAC5578 at 0x48 */
bool ok1 = DAC5578_Init(&hdac1, &hi2c1, 0x48, 8,
GPIOB, DAC5578_LDAC_PIN,
GPIOB, DAC5578_CLR_PIN);
/* Initialize second DAC5578 at 0x49 */
bool ok2 = DAC5578_Init(&hdac2, &hi2c1, 0x49, 8,
GPIOB, DAC5578_LDAC_PIN,
GPIOB, DAC5578_CLR_PIN);
The DAC5578_Init() function signature confirms:
- Bus:
hi2c1pointer (first STM32 I²C peripheral) - Resolution: Fixed at 8 bits (
resolution = 8) - Control pins:
LDACandCLRon GPIOB
Post-Initialization Setup
After successful init, the code configures both devices for synchronized updates:
/* Clear all outputs to zero scale */
DAC5578_SetClearCode(&hdac1, DAC5578_CLR_CODE_ZERO);
DAC5578_SetClearCode(&hdac2, DAC5578_CLR_CODE_ZERO);
/* Enable LDAC broadcast for all 8 channels */
DAC5578_SetupLDAC(&hdac1, 0xFF);
DAC5578_SetupLDAC(&hdac2, 0xFF);
ADS7830 I2C Configuration
The ADS7830 is an 8-channel, 8-bit analog-to-digital converter with address-selectable I²C operation. The PLFM RADAR firmware addresses three instances across two functional domains.
Address Selection via Pin Strapping
The ADS7830 datasheet (and ADS7830.H) defines four possible addresses based on the ADDR pin connection:
| ADDR Pin Connection | I²C Address |
|---|---|
| GND | 0x48 |
| VDD | 0x49 |
| SDA | 0x4A |
| SCL | 0x4B |
Deployed Instances
| Function | Address | PCB Reference | Handle Name | Lines in main.cpp |
|---|---|---|---|---|
| Idq measurement (ch 0-7) | 0x48 |
U88 | hadc1 |
1900-1909 |
| Idq measurement (ch 0-7) | 0x4A |
U89 | hadc2 |
1910-1919 |
| Thermal monitoring | 0x49 |
U10 | hadc3 |
1990-1999 |
ADC Initialization Code
All three instances use &hi2c2 (the second STM32 I²C peripheral):
#include "ADS7830.H"
ADS7830_HandleTypeDef hadc1, hadc2, hadc3;
/* Idq ADC #1: ADDR = GND → 0x48 */
bool okA = ADS7830_Init(&hadc1, &hi2c2, 0x48,
ADS7830_SDMODE_SINGLE,
ADS7830_PDIRON_ADON);
/* Idq ADC #2: ADDR = SDA → 0x4A */
bool okB = ADS7830_Init(&hadc2, &hi2c2, 0x4A,
ADS7830_SDMODE_SINGLE,
ADS7830_PDIRON_ADON);
/* Thermal monitor: ADDR = VDD → 0x49 */
bool okC = ADS7830_Init(&hadc3, &hi2c2, 0x49,
ADS7830_SDMODE_SINGLE,
ADS7830_PDIRON_ADON);
The ADS7830_SDMODE_SINGLE parameter configures single-ended measurements; the driver also supports differential mode via ADS7830_SDMODE_DIFF.
Reading ADC Channels
/* Read channel 3 from Idq ADC #1 */
uint8_t raw_value = ADS7830_Measure_SingleEnded(&hadc1, 3);
/* Convert TMP37 thermal sensor reading to temperature */
float temperature_c = raw_value * 0.64705f; // 165°C / 255 LSB
Key Source Files
| File | Path | Purpose |
|---|---|---|
DAC5578.H |
9_Firmware/9_1_Microcontroller/9_1_1_C_Cpp_Libraries/DAC5578.H |
Handle struct, API prototypes, command constants |
DAC5578.c |
9_Firmware/9_1_Microcontroller/9_1_1_C_Cpp_Libraries/DAC5578.c |
I²C write/read implementation, power modes |
ADS7830.H |
9_Firmware/9_1_Microcontroller/9_1_1_C_Cpp_Libraries/ADS7830.H |
Address constants, measurement mode enums |
ADS7830.c |
9_Firmware/9_1_Microcontroller/9_1_1_C_Cpp_Libraries/ADS7830.c |
I²C command sequencing, conversion timing |
main.cpp |
9_Firmware/9_1_Microcontroller/9_1_3_C_Cpp_Code/main.cpp |
System startup, peripheral instantiation |
Common Configuration Issues and Solutions
Address Collision on Shared Bus
The DAC5578 at 0x48 and 0x49 and the ADS7830 at 0x48/0x49 would conflict if placed on the same bus. The separate hi2c1/hi2c2 assignment prevents this.
Verifying Bus Communication
Both drivers return boolean status from *_Init(). The firmware checks these and logs via DIAG macros:
if (!ok1) {
DIAG_ERROR("DAC5578 @ 0x48 initialization failed");
}
Modifying Addresses for Custom Boards
To change an ADS7830 address:
- Physically restrap the
ADDRpin (GND, VDD, SDA, or SCL) - Update the address constant in
main.cppinitialization call - No driver modification needed—the
ADS7830.Halready defines all four options
Summary
- DAC5578 devices connect to
hi2c1at addresses0x48and0x49for gate voltage control - ADS7830 devices connect to
hi2c2at addresses0x48,0x4A, and0x49(selected by pin strapping) for current and temperature sensing - Initialization occurs in
main.cpplines 1845-1855 (DACs) and 1900-1999 (ADCs) - The separate bus architecture eliminates address conflicts despite overlapping address ranges
Frequently Asked Questions
What I2C addresses can the ADS7830 support?
The ADS7830 supports four addresses based on the ADDR pin strapping: 0x48 (GND), 0x49 (VDD), 0x4A (SDA), and 0x4B (SCL). The PLFM RADAR firmware uses 0x48, 0x4A for Idq measurement and 0x49 for thermal monitoring. These are hardware-determined and cannot be changed via software.
Why are DAC and ADC devices on separate I2C buses?
The DAC5578 and ADS7830 both use addresses in the 0x48-0x49 range. Placing them on separate buses (hi2c1 and hi2c2) prevents address collisions. This design also isolates the DAC's real-time gate voltage updates from the ADC's sampling operations, improving timing determinism.
How do I add a fourth ADS7830 to the system?
Strap the new device's ADDR pin to SCL to select address 0x4B (unused in the current design). Add a new ADS7830_HandleTypeDef declaration, then call ADS7830_Init() with &hi2c2 and 0x4B. Ensure your PCB routing connects the device to the second I²C peripheral's SDA/SCL lines.
Have a question about this repo?
These articles cover the highlights, but your codebase questions are specific. Give your agent direct access to the source. Share this with your agent to get started:
curl -s "https://instagit.com/install.md" Maintain an open-source project? Get it listed too →