Der CY7C680 ist ein 8051-kompatibler Mikrocontroller mit eingebauten USB Stack.
Es gibt eine Reihe von Punkten, die bei der Erstellung eines Schaltplans für den CY7C680 zu beachten sind:
Der SDCC ist ein freier Compiler, der für 8051 funktioniert.
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)
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])
Siehe auch: https://github.com/bkbme/cy7c680-lib
__sfr __at (0x80) PORTA; __sfr __at (0xb2) OEA; void main() { while(1) { OEA = 0xff; PORTA = 0xff; } }
Nachfolgend wird beschrieben, wie die Felder eines control transfers ausgefüllt werden müssen.
bmRequestType | 0x40 |
---|---|
bmRequest | 0xa0 |
wValue | <start addr> |
wIndex | 0 |
wLength | <bytelen> |
data | <theData> |
bmRequestType | 0xc0 |
---|---|
bmRequest | 0xa0 |
wValue | <start addr> |
wIndex | 0 |
wLength | <bytelen> |
data | n/a |
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.