Forum: Mikrocontroller und Digitale Elektronik CS8900A: kein Rdy4TxNOW Flag


von MarioFischer (Gast)


Lesenswert?

Hallo!

ich habe den CS8900A (via http://www.olimex.com/dev/cs8900a-h.html ) mit 
einem ATmega32 im 8bit-Mode verbunden. Ich kann auch bereits Frames 
korrekt empfangen.
Aber mit dem Senden habe ich kein Glueck. In der Beschreibung des CS ( 
http://www.cirrus.com/en/pubs/proDatasheet/CS8900A_F4.pdf S. 103 ) 
heisst es:
1. TxCmd geben ("start Sending after Complete Frame uploaded)
2. Laenge des Frames geben
3. Das Rdy4TxNOW in BusST auslesen und es muss 1 sein
4. Den Frame sequenziell in den TxFramePort schreiben.

Ich bekomme jedoch kein Rdy4TxNOW Flag, egal wie lange ich danach polle.
Hier mal ein Code-Snipplet, die LoLevel-Sachen wie ob das Hi/LoByte 
zurest/zuletzt von der hohen/niedrigen Adresse gelesen/geschrieben 
werden muss ("a0l_a1h") hab ich mal weggelassen, das sollte funzen (kann 
zB auch die MAC setzen und wieder korrekt auslesen).

Der ganze Code ist sehr eng an den Olimex-Democode ( 
http://olimex.com/dev/soft/msp430/easyweb_test.zip ) angelehnt. Hat 
jemand eine Idee, warum der CS keine Frames von mir haben will?

Danke und Gruesse aus Muenchen

Mario [ FischerMario bei geh em ix punkt net ]
1
void cs8900_init(void) {
2
  ... softreset, setmac, ...
3
  cs8900a_writerepp(PP_LineCTL, SERIAL_RX_ON | SERIAL_TX_ON);
4
  cs8900a_writerepp(PP_RxCTL,   RX_OK_ACCEPT | RX_IA_ACCEPT | RX_BROADCAST_ACCEPT);
5
}
6
7
bool_t cs8900a_gettxready(void) {
8
  return (cs8900a_readpp(PP_BusST) & READY_FOR_TX_NOW); 
9
}
10
11
void cs8900a_settxframelen(uint16_t len) {
12
  cs8900a_write_a0l_a1h(TX_CMD_PORT, TX_START_ALL_BYTES);
13
  cs8900a_write_a0l_a1h(TX_LEN_PORT, len);
14
}
15
16
void cs8900a_writetxframebuf(uint16_t data) {
17
  cs8900a_write_a0l_a1h(TX_FRAME_PORT, data);
18
}
19
20
bool_t cs8900a_writetxframe(uint16_t* data, uint16_t len) {
21
  cs8900a_settxframelen(len);
22
  if (!cs8900a_gettxready()) {
23
    return FALSE;
24
  }
25
  
26
  while (len--) {
27
    cs8900a_writetxframebuf(*data);
28
    data++;
29
  }
30
  return TRUE;
31
}

von MarioFischer (Gast)


Lesenswert?

Ergaenzung:
Hier ( http://blog.linuxsky.org/?uid-463-action-viewspace-itemid-12578 ) 
hatte ein Kollege aus Fernost wohl das selbe Problem.
Bei ihm hat es funktioniert, indem er staendig zum Senden Re-Requestet, 
also so was:
1
bool_t cs8900a_writetxframe(uint16_t* data, uint16_t len) {
2
  do {
3
    cs8900a_settxframelen(len); // redo that request on every reject
4
  } while (!cs8900a_gettxready());
5
6
  while (len--) {
7
    cs8900a_writetxframebuf(*data);
8
    data++;
9
  }
10
  return TRUE;
11
}

Zum einen fuktioniert das bei mir auch nicht, zum anderen ist damit auch 
nicht die Ursache geklaert.

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.