DSPI to Serial Bridge
Overview
This NetBurner application demonstrates the Dual Serial Peripheral Interface (DSPI) functionality by creating a bridge between DSPI and UART serial communications. Data received on UART1 is transmitted via DSPI, and the received DSPI data is sent back through UART1, creating a complete bidirectional communication bridge.
Supported Platforms
- MOD5441X - DSPI1 pins on J2 connector
- NANO54415 - DSPI1 pins on carrier board
Hardware Requirements
- NetBurner module with DSPI capability
- UART1 connection for serial communication
- SPI slave device or loopback jumper for testing
- Serial terminal software for interaction
DSPI Pin Assignments
MOD5441X Platform
- SCK (Clock): J2[25] (PINJ2_25_DSPI1_SCK)
- SOUT (Master Out): J2[28] (PINJ2_28_DSPI1_SOUT)
- SIN (Master In): J2[27] (PINJ2_27_DSPI1_SIN)
- PCS0 (Chip Select): J2[30] (PINJ2_30_DSPI1_PCS0) - Optional/commented out
NANO54415 Platform
- SCK (Clock): Pin 31 (PIN_31_DSPI1_SCK)
- SOUT (Master Out): Pin 35 (PIN_35_DSPI1_SOUT)
- SIN (Master In): Pin 33 (PIN_33_DSPI1_SIN)
- PCS0 (Chip Select): Pin 15 (PIN_15_DSPI1_PCS0) - Optional/commented out
Application Functionality
Main Features
- UART to DSPI Bridge: Transfers UART data via SPI protocol
- DSPI to UART Echo: Returns received SPI data to UART
- Interrupt-Driven Transfers: Uses semaphores for efficient operation
- Loopback Testing: Simple jumper test without external devices
- Buffer Management: 10KB buffers for large data transfers
Program Flow
- Initialization
- Initialize network stack and diagnostics
- Configure DSPI1 pins for selected platform
- Initialize DSPI with default parameters
- Open UART1 at 115200 baud
- Create semaphore for DSPI synchronization
- Main Loop
- Monitor UART1 for incoming data
- Transfer received data via DSPI
- Wait for DSPI completion using semaphore
- Send DSPI response back to UART1
- Repeat continuously
Data Flow Architecture
UART1 --> Read Buffer --> DSPI TX --> SPI
Bus --> External Device
^ |
| v
+---- Write Buffer <---- DSPI RX <---- SPI
Bus <------+
@ Bus
Non-multiplexed bus mode (write only). Separate address and data buses. Reads are performed as AD-Mux...
Key Components
Files Structure
DSPI-to-Serial/
|-- src/
| +-- main.cpp # Complete application logic
|-- makefile # Build configuration
+-- README.md # This documentation
DSPI Configuration
Default Parameters:**
- Module: DSPI1 (DEFAULT_DSPI_MODULE)
- Baud Rate: 2 MHz (default)
- Frame Size: 8 bits (default)
- Chip Select: 0x0F (all CS inactive)
- CS Polarity: 0x0F (active low)
- Clock Polarity: 0x0 (idle low)
- Clock Phase: 0x1 (capture on leading edge)
- Data Output: Hi-Z when inactive
Core Functions
DSPI Operations:**
Testing and Usage
Loopback Testing (No External Device)
MOD5441X Setup:**
- Type characters in serial terminal
- Characters are sent via DSPI
- Looped-back data returns via DSPI
- Characters echo back to terminal
External SPI Device Testing
Connection Requirements:**
Building and Deployment
Build Commands
# Build for specific platform
make PLATFORM=MOD5441X
make PLATFORM=NANO54415
# Load to device
make load DEVIP=<device_ip_address>
Serial Terminal Setup
- Baud Rate: 115200
- Data Bits: 8
- Parity: None
- Stop Bits: 1
- Flow Control: None
Advanced DSPI Configuration
Custom Initialization Parameters
4000000,
16,
0x0E,
0x0F,
0x1,
0x0,
FALSE,
2,
3);
uint8_t DSPIInit(uint8_t SPIModule=DEFAULT_DSPI_MODULE, uint32_t Baudrate=2000000, uint8_t QueueBitSize=8, uint8_t CS=0x00, uint8_t CSPol=0x0F, uint8_t ClkPolarity=0, uint8_t ClkPhase=1, BOOL DoutHiz=TRUE, uint8_t QCD=0, uint8_t DTL=0)
Initialize a DSPI module.
Frame Size Options
- 4-32 bits: Extended range beyond standard SPI
- Automatic queuing: Hardware manages transfer queues
- Interrupt driven: Efficient CPU utilization
Multiple Chip Select Management
Performance Characteristics
Transfer Specifications
- Maximum Baud Rate: Up to 25 MHz (platform dependent)
- Frame Sizes: 4 to 32 bits (beyond standard 8/16-bit SPI)
- Buffer Size: 10KB for both TX and RX operations
- Latency: Interrupt-driven with minimal CPU overhead
Timing Characteristics
- CS to Clock Delay: Configurable timing
- Inter-frame Delay: Adjustable for slave device requirements
- Clock Polarity/Phase: Full SPI mode support (0,0 to 1,1)
Troubleshooting
Common Issues
- No data transfer
- Check pin configuration and connections
- Verify DSPI initialization success
- Confirm UART1 is opening correctly
- Test with loopback jumper first
- Corrupted data
- Check SPI clock polarity and phase settings
- Verify baud rate is appropriate for slave device
- Ensure proper voltage levels (3.3V logic)
- Add decoupling capacitors near DSPI pins
- Semaphore timeout
- Check if DSPI transfer is completing
- Verify interrupt system is working
- Monitor DSPI module status registers
- Consider using polling mode as alternative
- Serial communication issues
- Confirm UART1 baud rate (115200)
- Check serial terminal settings
- Verify UART1 pin connections
- Test with different terminal software
Debug Techniques
Transfer Monitoring:**
iprintf("DSPI transfer started, size: %d\n", num);
DSPI_SEM.Pend(0);
iprintf("DSPI transfer completed\n");
Buffer Inspection:**
for(int i = 0; i < num; i++) {
iprintf("TX[%d]: 0x%02X, RX[%d]: 0x%02X\n",
i, TXBuffer[i], i, RXBuffer[i]);
}
Status Monitoring:**
#define DEFAULT_DSPI_MODULE
Definition coldfire/cpu/MCF5441X/include/dspi.h:152
Application Extensions
Protocol Implementations
SPI EEPROM Interface:**
void WriteEEPROM(uint16_t address, uint8_t *data, int length) {
uint8_t cmd[3] = {0x02, address >> 8, address & 0xFF};
DSPI_SEM.Pend(0);
DSPI_SEM.Pend(0);
}
uint8_t DSPIStart(uint8_t SPIModule, puint8_t transmitBufferPtr, volatile uint8_t *receiveBufferPtr, uint32_t byteCount, OS_SEM *finishedSem=NULL, uint8_t enableDMA=TRUE, int csReturnToInactive=DEASSERT_AFTER_LAST)
Start DSPI Data Transfer.
Sensor Data Acquisition:**
int16_t ReadADC(uint8_t channel) {
uint8_t cmd[3] = {0x01, (channel << 4), 0x00};
uint8_t response[3];
DSPI_SEM.Pend(0);
return ((response[1] << 8) | response[2]) & 0x0FFF;
}
Network Integration
TCP to DSPI Bridge:**
int tcpFd =
connect(
"192.168.1.100", 8080);
int num =
read(tcpFd, (
char*)TXBuffer, 10000);
DSPI_SEM.Pend(0);
}
int dataavail(int fd)
Check the specified file descriptor to detmeine if data is available to be read.
int read(int fd, char *buf, int nbytes)
Read data from a file descriptor (fd).
int writeall(int fd, const char *buf, int nbytes=0)
Write the specified number of bytes to a file descriptor. Will block until all bytes are sent,...
int connect(const IPADDR &ipAddress, uint16_t remotePort, uint32_t timeout)
Establish a TCP connection to a remote host.
Definition tcp.h:1547
Web Interface Control:**
void HandleSPICommand(uint8_t *cmd, int cmdLen, uint8_t *response) {
DSPI_SEM.Pend(0);
}
Multi-Device Support
void SelectDevice(int device) {
uint8_t csConfig = 0x0F & ~(1 << device);
}
Performance Optimization
High-Speed Transfers
DMA Integration
void LargeDataTransfer(uint8_t *txData, uint8_t *rxData, int size) {
StartDMATransfer(txData, rxData, size);
WaitForDMAComplete();
}
Interrupt Optimization
void __attribute__((interrupt)) DSPIInterruptHandler() {
ClearDSPIInterrupt();
SignalTransferComplete();
}
Related Examples
- Serial Communication: UART bridging and protocols
- CAN to Serial: Alternative communication bridging
- I2C Examples: Inter-IC communication protocols
- SPI Device Drivers: Specific SPI device implementations
- Network Bridges: TCP/UDP to peripheral communication