Rose-Hulman Robotics Team

Changeset 250

Show
Ignore:
Timestamp:
10/21/08 17:09:28 (3 years ago)
Author:
auchtemm
Message:

fixed cannet_send.

Location:
trunk/electronics/avr/can
Files:
3 modified

Legend:

Unmodified
Added
Removed
  • trunk/electronics/avr/can/cannet.c

    r236 r250  
    3434int8_t send_canmsg(canmsg_t *msg) 
    3535{ 
    36         uint8_t i; 
    37         uint8_t reg; 
     36        uint8_t stat; 
     37        uint8_t rts; 
     38        uint8_t txbuf; 
    3839        uint8_t hdrbuf[4]; 
    3940 
    40         /* TODO: rewrite this to use load tx buffer */ 
    41         for (i = TXB0CTRL; i <= TXB0CTRL + 0x20; i += 0x10) { 
    42                 mcp_read(i, &reg, 1); 
    43                 if ((reg & (1 << 3)) == 0) { 
     41        stat = mcp_read_stat(); 
     42        txbuf = 0; 
     43        rts = 0; 
     44         
     45        /* See fig. 12-8 in MCP2515 datasheet. */ 
     46        rts |= !!(stat & (1 << 2)); 
     47        rts |= !!(stat & (1 << 4)) << 1; 
     48        rts |= !!(stat & (1 << 6)) << 2; 
    4449 
    45                         hdr2buf(&msg->hdr, hdrbuf); 
    46                         mcp_write(i + 1, hdrbuf, 4); 
    47                         reg |= 1 << 3; 
    48                         mcp_write_byte(i, reg); 
    49                         mcp_write_byte(i + 5, msg->dlc); 
    50                         mcp_write(i + 6, msg->data, msg->dlc); 
    51                         return 0; 
    52                 } 
     50        if (rts == 7) 
     51                return -1; 
     52 
     53        if ((rts & 1) == 0) { 
     54                txbuf = TXBUF0; 
     55                rts |= 1; 
     56        } else if ((rts & 2) == 0) { 
     57                txbuf = TXBUF1; 
     58                rts |= 2; 
     59        } else { 
     60                txbuf = TXBUF2; 
     61                rts |= 4; 
    5362        } 
    5463 
    55         return -1; 
     64        hdr2buf(&msg->hdr, hdrbuf); 
     65 
     66        mcp_load_txbuf(txbuf, hdrbuf, 4); 
     67        mcp_load_txbuf(txbuf + 1, msg->data, msg->dlc); 
     68        mcp_rts(rts); 
     69 
     70        return 0; 
    5671} 
     72 
    5773 
    5874/* rxbuf is the address of RXBnCTRL */ 
  • trunk/electronics/avr/can/mcp.c

    r233 r250  
    3939        addr &= 0x03; 
    4040        clrbit(CSP, CS); 
    41         spi_send(MCPRXBUF | (addr << 1)); 
     41        spi_send(MCPRXBUF | ((addr & 0x03) << 1)); 
    4242        for (i = 0; i < nbuf; i++) { 
    4343                buf[i] = spi_recv(); 
     
    7474        addr &= 0x07; 
    7575        clrbit(CSP, CS); 
    76         spi_send(MCPTXBUF | addr); 
     76        spi_send(MCPTXBUF | (addr & 0x07)); 
    7777        for (i = 0; i < nbuf; i++) { 
    7878                spi_send(buf[i]); 
  • trunk/electronics/avr/can/mcp.h

    r233 r250  
    6565 
    6666 
     67/* for mcp_read_rxbuf 
     68 * D suffix is data only 
     69 */ 
     70enum { 
     71        RXBUF0 = 0, 
     72        RXBUF0D, 
     73        RXBUF1 = 2, 
     74        RXBUF1D, 
     75}; 
     76 
     77/* For mcp_load_txbuf */ 
     78enum { 
     79        TXBUF0 = 0, 
     80        TXBUF0D, 
     81        TXBUF1, 
     82        TXBUF1D, 
     83        TXBUF2, 
     84        TXBUF2D, 
     85};