Designing High-Speed SPI: The Pitfalls of Open-Drain Buffers and Pull-Ups

Serial Peripheral Interface (SPI) is widely used in embedded systems to communicate with  external Flash memory, displays, ADCs, sensors, and other peripherals. Its simple architecture, full-duplex communication, and support for high data rates make it a popular choice in microcontroller-based designs. Configuring an SPI peripheral is usually straightforward. Select the clock frequency, configure the clock

Designing High-Speed SPI: The Pitfalls of Open-Drain Buffers and Pull-Ups Read More »

When UART Talks to Itself: The Optical Probe Loopback Bug Nobody Expects

During the development of optical communication firmware for smart meters, a strange field issue was reported: “Communication randomly drops. Works perfectly on the bench. Fails in the field.” To investigate the issue, I swapped cables, verified baud rates, and analyzed logic analyzer captures frame by frame. Everything appeared correct until I noticed that the optical

When UART Talks to Itself: The Optical Probe Loopback Bug Nobody Expects Read More »

C Macro Override Bug: When #define Breaks Build System Configuration

In embedded firmware development, configuration is often controlled through compiler macros passed from the build system. This keeps the codebase flexible and allows easy customization for different products or hardware variants. In this blog post, we will explore how a macro can introduce a subtle bug, often referred to as a C macro override bug

C Macro Override Bug: When #define Breaks Build System Configuration Read More »

How to Detect Bit Changes in C/C++ Using the XOR Operator and Bit Masking

When working with C or C++, particularly in embedded systems and firmware development, the ability to detect bit changes in C/C++ is essential. Because instead of writing: bool flag1; bool flag2; bool flag3; bool flag4; bool flag5; bool flag6; In embedded systems, we often store multiple related status flags inside a single variable. Generally, we

How to Detect Bit Changes in C/C++ Using the XOR Operator and Bit Masking Read More »