Äntligen! EEPROMet fungerar

Att upprätta kommunikationen med minnet visade sig vara mer komplicerat än vad vi hade trott från början. Efter att ha lagt ner nästan två veckor på att läsa på om SPI och vårt EEPROM-minne så har vi fått det att fungera. Äntligen!

Lite kort om SPI. När SPI används kopplas EEPROM-minnet till microcontrollern med hjälp av minst sex ledningar. Den första används för att skicka klocksignalen från microcontrollen till minnet (SCK). Den andra för att skicka data från mastern till slaven (MOSI) och den tredje för att skicka data från slaven till master (MISO). En koppling används för matningsspänning och ytterligare en för att jorda enheten. Slutligen, den sista kopplingen används för att ange om minnet ska vara aktivt eller i stand-by läge, så kallad chip select (CS). Om en etta ges är minnet aktivt medan en nolla sätter minnet i stand-by läge. Ytterligare en pinne, en sjunde pinne, används för just modellen Microship 93C66C för att ange om 8-bitars eller 16-bitas organisation ska användas. En etta på denna port indikerar att 16-bitars register kommer att användas medan en nolla anger att 8-bitars ord kommer att användas. Minnet är 4Kbit stort och då ASCII-tecken används räcker det med 8-bitars långa minnesplatser. Det innebär att vi ska skriva 512 tecken i minnet.

EEPROM-minnet som används i detta projekt, Microchip 93C66C, ska till skillnad från andra EEPROM ha en hög signal på CS när den ska skicka data. Det är en av anledningarna till varför det inte har fungerat. När man sedan läser från, skriver till eller raderar minnet så ska en kod skickas först som anger vad man vill göra. Koden består oftast av tre bitar till exempel 101 (skriva), 110 (läsa) mm. Sedan följer adressen till vilken man skriver till/läser från. Efter adressen kommer datan, själva tecknet.

Det ger oss följande vid tex skrivning: 101 -> 9-bitar adress -> 8 bitar data. Det innebär att bitarna kommer att behöva skiftas, adress och databiten behöver förskjutas 3 bitar för att det ska bli rätt.

Ett annat problem som har bromsat in arbetet är att skrivningen till minnet inte tycks fungera som det ska. Enligt databladet så ska MISO, eller data output som det kallas i databladet, ligga på ett för att indikera att skrivingen till minnet har fungerat och att den är redo att ta emot nästa kommando. Bilden nedan visar hur det ska se ut. När vi jämförde detta med outputen från osciloskopet så kunde vi se att vår MISO låg på noll. Det innebar att det inte gick att skriva till minnet. Efter att ha lagt mycket tid på felsökning visade sig att felet var väldigt simpelt, pinsamt simpelt. Felet var att EEPROM-minnet är skrivskyddat per default och behöver ställas om till skrivläge. En viss bitsekvens behöver skickas till minnet för att kunna skriva till det. Efter att det var gjort fungerade det att skriva till och läsa från minnet.

Ett problem återstod och det var att när vi får tillbaka datan så är den förskjuten med tre bitar, så tecknet som är på 8 bitar är splittrad över två bytes. Men det var lätt åtgärdat genom att skriva en metod som skiftar runt den mottagna datan.  

Bild som visar hur kommunikationen med EEPROM fungerar

Bilden och information om EEPROM 93C66C hittar ni i Microchips datablad.

KarriärTjänsterOm ossBloggar