Forum: Mikrocontroller und Digitale Elektronik mittels TWI Chipkarte schreiben.


von Kemal (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,
Ich muss eine 2KB Chipkarte mittels TWIC beschreiben.
Bisher brauchte ich nur die erste 16 Seiten der Karte ( eine Seite = 16 
Byte) von daher hatte ich nie versucht den 257. Byte auf der Karte zu 
beschreiben.

Schreib vorgang
1
  void card_page_write (unsigned char* page_content , unsigned char page_index)
2
{
3
  TWI_PORT_SELECT.MASTER.ADDR = SLA_W;
4
  while( !WaitForTxTWIComplete() );
5
  
6
  TWIC_MASTER_DATA = CARD_PAGE_SIZE * page_index;
7
  while( !WaitForTxTWIComplete() );
8
  
9
  for(uint8_t i = 0; i < CARD_PAGE_SIZE; i++)
10
  {
11
    TWI_PORT_SELECT.MASTER.DATA = page_content[i];
12
    while( !WaitForTxTWIComplete() );
13
  }
14
15
  TWI_PORT_SELECT.MASTER.CTRLC = TWI_MASTER_CMD_STOP_gc;
16
  while( !WaitForTxTWIComplete() );
17
  _delay_ms(CARD_PAGE_WRITE_TIME_MS);
18
}  // void card_page_write (unsigned char* page_content , unsigned char page_index)


1
  TWIC_MASTER_DATA = CARD_PAGE_SIZE * page_index;
2
  while( !WaitForTxTWIComplete() );
 Hier setze ich den index auf CARD_PAGE_SIZE(16) * page_index( welche 
Seite ich schreiben möchte)
Sobald ich versuche die 16. ([0,.....16] ist eigentlich die 17. Seite) 
zu beschreiben, wird die erste Seite der Karte überschrieben.

Hatte jemand schon so ein ähnliches Problem ?
Ich würde mich auf jede Antword freuen.

PS:  Microcontroller: XMega 32A4

Gruß,
Kemal

von Christopher B. (chrimbo) Benutzerseite


Lesenswert?

Hi,
>  TWIC_MASTER_DATA = CARD_PAGE_SIZE * page_index
passen da denn mehr als 8Bit rein? 16*16 = 256 wenn du Seite 17 
beschreiben willst hast du nen Überlauf

von Michael U. (amiga)


Lesenswert?

Hallo,

CARD_PAGE_SIZE * page_index
16 Seiten mit 16 Byte sind 256 (0...255).
Mehr als 255 passt in ein Byte nummal nicht rein.
Da stimmt wohl was mit Deiner Adressierung der Karte nicht.
2k = 2048 Byte / 16 Byte Pagesize = 128 Pages a 16 Byte kann nicht in 
einem Byte adressiert werden.

Gruß aus Berlin
Michael

von Kemal (Gast)


Lesenswert?

Nein, leider passt da nur ein byte rein. Ich habe vor 4-5 Monaten quasi 
ein Projekt übernommen( da ein Mitarbeiter gekündigt hat) und die 
Erweiterung ist erst jetzt gekommen. Bin inder Microcontroller Welt 
ziemlich neu.
Daher reicht mein wissen nicht aus  wie man das Problem umgehen kann.

von mh (Gast)


Lesenswert?

In den Chpikarten steckt doch normalerweise ein normales I²C-EEPROM 
drin. In Deinem Fall wäre das wahrscheinlich ein 24XX16.
Im ersten Datenblatt, das ich gefunden habe, steht drin, dass der 
Speicher nicht nur in Pages, sondaern auch noch in Blocks organisiert 
ist.
Die Blockadresse ist in den unteren drei Bit der I²C-Adresse 
einzutragen...

von mh (Gast)


Lesenswert?

Hier noch das Datenblatt 
http://ww1.microchip.com/downloads/en/DeviceDoc/21703L.pdf --> Seite 7

von Kemal (Gast)


Lesenswert?

Vielen dank, ich werde es  heute Abend mal durch lesen.

Gruß,
Kemal

von Pic T. (pic)


Lesenswert?

Die 2048 sind bits, nicht byte. Ergeben also 256 bytes. Gültige Adresse 
ist also von 0-255. Wenn mehr als 256 bytes gebraucht werden, braucht 
man eine chipkarte mit mehr Speicher.

von Kemal (Gast)


Lesenswert?

Danke für deine Antwort.
Ne ne die 2048 sind bytes.

Ich kenn mich mit programmieren schon gut aus. Das was Fehlt ist halt 
das technisches was die Microwelt angeht.
Mir ist auch bekannt das ein byte max 2^8 als Wert annimt.

Problem ist  :
1
>  TWIC_MASTER_DATA = CARD_PAGE_SIZE * page_index
wenn CARD_PAGE_SIZE(16) * page_index (von mir aus 20)
320 %250 = 70. Also wird der 70. Byte überschrieben was ich eigentlich 
nicht möchte.

und dazu gehörene Frage ist. Wie kann ich den unteren Code umgehen. Wie 
auch
"mh (Gast)" mit block weise schreiben mir schon einen tipp gegeben. Hat.
1
>  TWIC_MASTER_DATA = CARD_PAGE_SIZE * page_index

von mh (Gast)


Lesenswert?

Mal so als Anregung...
1
void card_page_write (unsigned char* page_content , unsigned char page_index)
2
{
3
  TWI_PORT_SELECT.MASTER.ADDR = SLA_W + (page_index >> 4);
4
  while( !WaitForTxTWIComplete() );
5
  
6
  TWIC_MASTER_DATA = CARD_PAGE_SIZE * (page_index & 0x0F);
7
  while( !WaitForTxTWIComplete() );
8
  
9
  for(uint8_t i = 0; i < CARD_PAGE_SIZE; i++)
10
  {
11
    TWI_PORT_SELECT.MASTER.DATA = page_content[i];
12
    while( !WaitForTxTWIComplete() );
13
  }
14
15
  TWI_PORT_SELECT.MASTER.CTRLC = TWI_MASTER_CMD_STOP_gc;
16
  while( !WaitForTxTWIComplete() );
17
  _delay_ms(CARD_PAGE_WRITE_TIME_MS);
18
}  // void card_page_write (unsigned char* page_content , unsigned char page_index)

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.