diff --git a/lib/maca.c b/lib/maca.c index fdf9510d2..f4b180872 100644 --- a/lib/maca.c +++ b/lib/maca.c @@ -15,10 +15,14 @@ #endif #ifndef RECV_SOFTIMEOUT -//#define RECV_SOFTIMEOUT 4096 /* about 3.5 128 byte packets */ -#define RECV_SOFTIMEOUT 10000 /* about 3.5 128 byte packets */ +#define RECV_SOFTIMEOUT 4096 /* about 3.5 128 byte packets */ #endif +/* for 250kHz clock */ +/* (32 chips/sym) * (sym/4bits) * (8bits/byte) = (64 chips/byte) */ +/* (8 chips/clk) * (byte/64 chips) = byte/8clks */ +#define CLK_PER_BYTE 8 + #define MACA_CLOCK_DIV 95 #define reg(x) (*(volatile uint32_t *)(x)) @@ -100,9 +104,6 @@ volatile packet_t* get_free_packet(void) { free_head->right = 0; } - - for(i=0; i<9783; i++) { continue; } - // print_packets("get_free_packet"); irq_restore(); return p; @@ -117,8 +118,10 @@ void post_receive(void) { *MACA_TXLEN = (MAX_PACKET_SIZE << 16); if(dma_rx == 0) { dma_rx = get_free_packet(); - if (dma_rx == 0) + if (dma_rx == 0) { printf("trying to fill MACA_DMARX but out of packet buffers\n"); + return; + } } *MACA_DMARX = (uint32_t)&(dma_rx->data[0]); /* with timeout */ @@ -132,7 +135,7 @@ void post_receive(void) { (maca_ctrl_seq_rx)); */ *MACA_CONTROL = ( - (1 << maca_ctrl_asap) | + (1 << maca_ctrl_asap) | ( 4 << PRECOUNT) | (1 << maca_ctrl_prm) | (maca_ctrl_seq_rx)); } @@ -157,7 +160,7 @@ volatile packet_t* rx_packet(void) { void post_tx(void) { /* set dma tx pointer to the payload */ /* and set the tx len */ - + volatile uint32_t i; disable_irq(MACA); last_post = TX_POST; dma_tx = tx_head; @@ -169,13 +172,22 @@ void post_tx(void) { printf("trying to fill MACA_DMARX but out of packet buffers\n"); } *MACA_DMARX = (uint32_t)&(dma_rx->data[0]); - *MACA_TMREN = 0; + /* disable soft timeout clock */ + /* disable start clock */ + *MACA_TMRDIS = (1 << maca_tmren_sft) | ( 1 << maca_tmren_strt ) ; + /* set complete clock to long value */ + /* acts like a watchdog incase the MACA locks up */ + *MACA_CPLCLK = *MACA_CLK + (CLK_PER_BYTE * dma_tx->length+6) + (CLK_PER_BYTE * 0); + /* enable complete clock */ + *MACA_TMREN = (1 << maca_tmren_cpl); /* do the transmit */ enable_irq(MACA); - *MACA_CONTROL = ( (1 << maca_ctrl_prm) | + *MACA_CONTROL = ( (1 << maca_ctrl_prm) | ( 4 << PRECOUNT) | (maca_ctrl_mode_no_cca << maca_ctrl_mode) | (1 << maca_ctrl_asap) | (maca_ctrl_seq_tx)); + + for(i=0; i<10; i++) { continue; } } void tx_packet(volatile packet_t *p) { @@ -196,7 +208,7 @@ void tx_packet(volatile packet_t *p) { } // print_packets("tx packet"); irq_restore(); - if(get_field(*MACA_STATUS,CODE) != NOT_COMPLETED) { post_tx(); } + if(get_field(*MACA_STATUS,CODE) != NOT_COMPLETED) { post_tx(); } return; } @@ -254,17 +266,17 @@ void add_to_rx(volatile packet_t *p) { return; } -void decode_status(volatile uint32_t status) { +void decode_status(void) { volatile uint32_t code; - code = get_field(status,CODE); + code = get_field(*MACA_STATUS,CODE); /* PRINTF("status code 0x%x\n\r",code); */ switch(code) { case ABORTED: { - PRINTF("maca: aborted\n\r"); +// PRINTF("maca: aborted\n\r"); ResumeMACASync(); break; @@ -278,7 +290,7 @@ void decode_status(volatile uint32_t status) { } case CODE_TIMEOUT: { - PRINTF("maca: timeout\n\r"); +// PRINTF("maca: timeout\n\r"); ResumeMACASync(); break; @@ -292,7 +304,7 @@ void decode_status(volatile uint32_t status) { } case EXT_TIMEOUT: { - PRINTF("maca: ext timeout\n\r"); +// PRINTF("maca: ext timeout\n\r"); ResumeMACASync(); break; @@ -311,7 +323,7 @@ void decode_status(volatile uint32_t status) { } default: { - PRINTF("status: %x", status); + PRINTF("status: %x", *MACA_STATUS); ResumeMACASync(); } @@ -323,8 +335,6 @@ void maca_isr(void) { // print_packets("maca_isr"); - status = *MACA_STATUS; - if (data_indication_irq()) { *MACA_CLRIRQ = (1 << maca_irq_di); dma_rx->length = *MACA_GETRXLVL - 2; @@ -356,15 +366,15 @@ void maca_isr(void) { PRINTF("*MACA_IRQ %x\n\r", i); - if (bit_is_set(status, maca_status_ovr)) + if (bit_is_set(*MACA_STATUS, maca_status_ovr)) PRINTF("maca overrun\n\r"); - if (bit_is_set(status, maca_status_busy)) + if (bit_is_set(*MACA_STATUS, maca_status_busy)) PRINTF("maca busy\n\r"); if (bit_is_set(*MACA_STATUS, maca_status_crc)) PRINTF("maca crc error\n\r"); if (bit_is_set(*MACA_STATUS, maca_status_to)) PRINTF("maca timeout\n\r"); - decode_status(status); + decode_status(); if(tx_head != 0) { post_tx(); diff --git a/tests/per.c b/tests/per.c index 09b5230d2..a7e7d0239 100644 --- a/tests/per.c +++ b/tests/per.c @@ -47,7 +47,7 @@ uint32_t get_time(void) { #define random_short_addr() (*MACA_RANDOM & ones(sizeof(short_addr_t)*8)) void build_session_req(volatile packet_t *p) { - p->length = 127; + p->length = 4; p->data[0] = 0xff; p->data[1] = 0x01; p->data[2] = 0x23; @@ -59,20 +59,28 @@ void session_req(short_addr_t addr) { static volatile int time = 0; volatile packet_t *p; -// if((get_time() - time) > SESSION_REQ_TIMEOUT) { -// time = get_time(); - if((p = get_free_packet())) { - build_session_req(p); - tx_packet(p); - } else { -// printf("session_req: could not get free packet for transmit\n\r"); + if((get_time() - time) > SESSION_REQ_TIMEOUT) { + time = get_time(); + if((p = get_free_packet())) { + build_session_req(p); + tx_packet(p); + } } - -// } return; } -void print_packet(packet_t *p) { return; } +void print_packet(packet_t *p) { + volatile uint8_t i,j; + if(p) { + for(j=0; j < (p->length)%16; j++) { + for(i=0; ilength; i++) { + printf("%x02 ",p->data[i]); + } + printf("\n\r"); + } + } + return; +} session_id_t open_session(short_addr_t addr) { return 0; } void main(void) { @@ -120,7 +128,8 @@ void main(void) { case SCANNING: if((p = rx_packet())) { /* extract what we need and free the packet */ - print_packet(p); + printf("Recv: "); + print_packet(p); type = get_packet_type(p); addr = p->addr; free_packet(p);