ShineLAN-X: Initiale Firmware + Hardware-Diagnose

- STM32F103RBT6 Firmware für Growatt ShineLAN-X
- Bitbang-SPI (EthernetENC) auf Port C (PC6/PC7/PC8/PC9)
- UART-Debug auf USART1 (PA9/PA10), Modbus temporär deaktiviert
- SO-Aktivitätstest und ESTAT-Register-Scan bestätigen:
  ENC28J60 läuft (SO aktiv), SI/MOSI-Verbindung unterbrochen
- Nächster Schritt: Pin 5 ENC28J60 nachlöten oder Bodge-Draht

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
retr0
2026-04-16 19:10:31 +02:00
parent 69ebf5d2de
commit 852ec90e6b
39 changed files with 19445 additions and 0 deletions
@@ -0,0 +1,57 @@
#pragma once
// ============================================================
// NETZWERK — ENC28J60 Ethernet (Bitbang-SPI auf Port C)
// STM32F103RBT6, LQFP-64
// Hardware-SPI nicht nutzbar — alle SPI-Pins liegen auf Port C
// ============================================================
// Bitbang-SPI Pins (alle gemessen)
#define ETH_CS_PIN PC7 // ENC28J60 Pin 7 /CS → STM32 Pin 36 (gemessen)
#define ETH_SCK_PIN PC6 // ENC28J60 Pin 6 SCK → STM32 Pin 35 (gemessen)
#define ETH_MISO_PIN PC8 // ENC28J60 Pin 4 SO → STM32 Pin 37 (gemessen)
#define ETH_MOSI_PIN PC9 // ENC28J60 Pin 5 SI → STM32 Pin ?? (noch unbekannt, Scan läuft)
// ENC28J60 Reset
#define ETH_RST_PIN PB13 // ENC28J60 Pin 18 /RESET → STM32 Pin 32, 500Ω
// 0 = DHCP, 1 = Statische IP
#define USE_DHCP 0
// Nur relevant wenn USE_DHCP = 0
#define STATIC_IP 192,168,2,15
#define STATIC_GW 192,168,2,1
#define STATIC_SUBNET 255,255,255,0
#define STATIC_DNS 192,168,2,1
// MAC-Adresse — muss im Netzwerk eindeutig sein
#define MAC_ADDRESS 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED
// ============================================================
// MQTT
// ============================================================
#define MQTT_BROKER "192.168.2.84"
#define MQTT_PORT 1883
#define MQTT_USER "" // Leer lassen wenn kein Auth
#define MQTT_PASSWORD ""
#define MQTT_CLIENT "growatt-shinelan"
// ============================================================
// RS485 / MODBUS
// RS485 DE/RE → STM32 Pin 25 = PB1 (LQFP-64 neu gemessen)
// USART1: TX=PA9 (Pin 40), RX=PA10 (Pin 41)
// ============================================================
#define RS485_DE_PIN PB1 // RE/DE Steuerpin → STM32 Pin 25
#define MODBUS_BAUD 9600 // Growatt Standard-Baudrate
#define MODBUS_ADDR 1 // Modbus Slave-Adresse des Wechselrichters
// ============================================================
// GERÄT
// ============================================================
#define DEVICE_ID "growatt_shinelan"
#define DEVICE_NAME "Growatt ShineLAN-X"
#define DEVICE_MODEL "ShineLAN-X"
#define DEVICE_MFR "Growatt"
// Abfrageintervall in Millisekunden
#define UPDATE_INTERVAL 10000UL
@@ -0,0 +1,29 @@
#pragma once
#include <Arduino.h>
#include "config.h"
// ============================================================
// Bitbang-SPI für ENC28J60 auf PC6/PC7/PC8/PC9
// ENC28J60 verwendet SPI Mode 0 (CPOL=0, CPHA=0)
// ============================================================
static inline void eth_spi_init() {
pinMode(ETH_SCK_PIN, OUTPUT); digitalWrite(ETH_SCK_PIN, LOW);
pinMode(ETH_MOSI_PIN, OUTPUT); digitalWrite(ETH_MOSI_PIN, LOW);
pinMode(ETH_MISO_PIN, INPUT);
pinMode(ETH_CS_PIN, OUTPUT); digitalWrite(ETH_CS_PIN, HIGH);
}
static inline void eth_cs_low() { digitalWrite(ETH_CS_PIN, LOW); }
static inline void eth_cs_high() { digitalWrite(ETH_CS_PIN, HIGH); }
static inline uint8_t eth_spi_transfer(uint8_t out) {
uint8_t in = 0;
for (int8_t i = 7; i >= 0; i--) {
digitalWrite(ETH_MOSI_PIN, (out >> i) & 1);
digitalWrite(ETH_SCK_PIN, HIGH);
in = (in << 1) | digitalRead(ETH_MISO_PIN);
digitalWrite(ETH_SCK_PIN, LOW);
}
return in;
}