Cypress CY7C680
Der CY7C680 ist ein 8051-kompatibler Mikrocontroller mit eingebauten USB Stack.
Hardware
Es gibt eine Reihe von Punkten, die bei der Erstellung eines Schaltplans für den CY7C680 zu beachten sind:
- Wenn I2C nicht verwendet wird: SDA, SCL mit Pullups versehen; es werden 2k2 empfohlen
- AVCC mit zusätzlich zu den üblichen 100n mit 10u (ich verwende 3u3) entkoppeln
- WAKEUP-Pin nach GND verbinden
- RESERVED-Pin nach GND verbinden
- RESET-Pin mit 10kR nach VCC und 100nC nach GND
- CLKOUT-Pin ist fürs debugging sinnvoll; evtl. herausführen
Compiler
Der SDCC ist ein freier Compiler, der für 8051 funktioniert.
Makefile für Windows
CC=sdcc TOHEX=packihx CFLAGS= APP=main.hex BUILDDIR=bin SRCDIR=src all: $(BUILDDIR) $(APP) $(BUILDDIR): mkdir $(BUILDDIR) %.hex: %.ihx $(TOHEX) $(BUILDDIR)\$< > $@ %.ihx: $(SRCDIR)\%.c $(CC) $(CFLAGS) $< -o "$(BUILDDIR)\\" .PHONY: clean prepare clean: del /Q $(BUILDDIR)\* del /Q $(APP)
Code in den RAM laden
Ich betreibe den Chip ohne EEPROM und verwende daher nur den internen RAM. Nach dem Anschließen an einen PC meldet sich das Gerät mit vid=0x04b4 und pid=0x8613. Jetzt kann man mittels sog. control transfer mit dem Device kommunizieren. Dies kann über libusb bewerkstelligt werden. Ich verwende hierzu pyusb , IntelHex und python3.
import usb.core import usb.util from intelhex import IntelHex dev = usb.core.find(idVendor=0x04b4, idProduct=0x8613) ih = IntelHex("main.hex") #Transfer programm data dev.ctrl_transfer(0x40, 0xa0, 0, 0 , ih.tobinarray()) #Get device out of reset dev.ctrl_transfer(0x40, 0xa0, 0xe600, 0 , [0])
Beispielprogramm
Siehe auch: https://github.com/bkbme/cy7c680-lib
__sfr __at (0x80) PORTA; __sfr __at (0xb2) OEA; void main() { while(1) { OEA = 0xff; PORTA = 0xff; } }
Endpoint0 Protokoll
Nachfolgend wird beschrieben, wie die Felder eines control transfers ausgefüllt werden müssen.
Daten zum Device übertragen
bmRequestType | 0x40 |
---|---|
bmRequest | 0xa0 |
wValue | <start addr> |
wIndex | 0 |
wLength | <bytelen> |
data | <theData> |
Daten vom Device abholen
bmRequestType | 0xc0 |
---|---|
bmRequest | 0xa0 |
wValue | <start addr> |
wIndex | 0 |
wLength | <bytelen> |
data | n/a |
CPUCS Register beschreiben
Nachdem man Daten in den RAM geladen hat, muss man das Device noch aus dem Reset holen. Dies geschieht durch das Schreiben von einem byte (0x00) an die Adresse 0xe600. Will man wieder Reset anlegen, so schreibt man einfach 0xff nach 0xe600.