mittels TWI Chipkarte schreiben.

Gast #4595966
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:
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
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
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
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
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

Eine eigene Frage? Dieser Thread ist über 10 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.