The EEPROM used the SPI protocol but its API is not as straightforward as the Microchip EEPROMs.
After a day of work it seems that we can only write one byte at the time and for that we need to pass 4 bytes, of protocol. So write speed is very slow.
It does not seems that there is a concept of page per say, but since I want to re use a C# base class, I set up a page to 256 bytes, and the read performance in SPI out of the box is 10 K byte/S with Nusbio v1.
Since it is just an experiment I will not optimize the code to get 28 K byte/S like with the Microchip SPI EEPROM.
As a reminder Nusbio v 2 can transfer at the rate of 1 to 3 M byte/S in SPI and 100 K byte/S in I2C in
any .NET language. Nusbio v 2 is in prototype mode as 2017/01.
/* Copyright (C) 2015, 2016, 2017 MadeInTheUSB LLC Written by FT for MadeInTheUSB MIT License (MIT) */ using System; using System.Collections.Generic; namespace MadeInTheUSB.EEPROM { ////// m93c86 is a 2k byte spi cheap eeprom /// http://www.mouser.com/ds/2/389/m93c46-w-955034.pdf /// CS(PD-1k)[] [] VCC /// SCK [] [] Not used /// MOSI [] [] ORG Leave unconnected for 16kbit orf /// MISO [] [] GND /// public class EEPROM_M93C86 : EEPROM_25AAXXX_BASE { #if NUSBIO2 public EEPROM_M93C86() : base(16) { } #else public EEPROM_M93C86(Nusbio nusbio, NusbioGpio clockPin, NusbioGpio mosiPin, NusbioGpio misoPin, NusbioGpio selectPin, bool debug = false) : base(nusbio, clockPin, mosiPin, misoPin, selectPin, 16, debug, chipSelectActiveLow:false // << important ) { var b = this.MaxByte; var p = this.MaxPage; this.SetWriteRegisterEnable(); //this.SetWriteRegisterDisable(); } #endif public override bool Is3BytesAddress { get { return false; } } public override int PAGE_SIZE { get{ return 256; } } protected override bool SetWriteRegisterEnable() { var r = this.SpiTransfer( new List(){ 0x98 /*0b10011000*/, 00 } ); return r.Succeeded; } protected override bool SetWriteRegisterDisable() { var r = this.SpiTransfer(new List () { 0x80 /*0b10000000*/, 00 }); return r.Succeeded; } /// /// http://www.mouser.com/ds/2/389/m93c46-w-955034.pdf /// based on the data sheet in ORG: 8 byte (low) /// writing one byte require 22 Clock Cycle /// 1 start bit, 2 bit-opCode, 11-Addr == 2 Clock cycle /// We send 24 bits the first 2 bits are 00 /// I do not think that this EEPROM support write in bulk mode /// It does support Read in bulk /// /// /// ///public virtual bool WritePage(int addr, byte[] buffer) { int dt1, dt2, ans; for (var num = 0; num < buffer.Length; num++) { //dt1 = 0b00101000 | ((adrs & 0b0000011100000000) >> 8) ; //dt2 = (adrs & 0b0000000011111111) ; dt1 = 0x28 | ((addr & 0x700) >> 8); dt2 = (addr & 0xFF); var spiBuffer = new List () { (byte)dt1, (byte)dt2, buffer[num] }; var writeR = this.SpiTransfer(spiBuffer); var readR = this.SpiTransfer(new List () { 0 }); ans = readR.Buffer[0]; addr += 1; } return true; } public override EEPROM_BUFFER ReadPage(int addr, int len = -1) { if (len == -1) len = PAGE_SIZE; var eb = new EEPROM_BUFFER(); int dt1, dt2; //dt1 = 0b00110000 | ((adrs & 0b0000011100000000) >> 8) ; //dt2 = (adrs & 0b0000000011111111) ; dt1 = 0x30 | ((addr & 0x700) >> 8); dt2 = (addr & 0xFF); var spiBufferWrite = new List () { (byte)dt1, (byte)dt2 }; var spiBufferRead = GetEepromApiDataBuffer(len); var buffer = new List (); buffer.AddRange(spiBufferWrite); buffer.AddRange(spiBufferRead); var r = this.SpiTransfer(buffer); if (r.Succeeded) { eb.Succeeded = true; eb.Buffer = r.Buffer.GetRange(spiBufferWrite.Count, r.Buffer.Count - spiBufferWrite.Count).ToArray(); } return eb; } } }
No comments:
Post a Comment