====== 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 [[http://sdcc.sourceforge.net/|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 [[http://sourceforge.net/projects/pyusb/ | pyusb ]], [[http://pypi.python.org/pypi/IntelHex/1.3| IntelHex]] und [[http://python.org/|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 | | ^ wIndex | 0 | ^ wLength | | ^ data | | === Daten vom Device abholen === ^ bmRequestType | 0xc0 | ^ bmRequest | 0xa0 | ^ wValue | | ^ wIndex | 0 | ^ wLength | | ^ 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. ===== Bilder ===== * Der erste Versuch; nicht schön, aber selten... {{:projekte:cy7c680_1.jpg?650|}} ===== Links ===== * {{:projekte:ezusb.pdf|EZ-USB Technical Reference}} * {{:projekte:cy7c68013a_cy7c68014a_cy7c68015a_cy7c68016a.pdf| CY7C680 Datasheet}} * [[https://github.com/bkbme/cy7c680-lib]]