mittels TWI Chipkarte schreiben.

Gast #4595966
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
Angehängte Dateien:
#4595988
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
Gast #4595990
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.
Gast #4596021
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...
Gast #4596613
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
Gast #4596937
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)

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren