CS8900A: kein Rdy4TxNOW Flag

Gast #1030191
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
}
Gast #1030219
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.

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