Cypress CY7C680

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:

  • 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

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)

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.

  • Der erste Versuch; nicht schön, aber selten…