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 | }
|