#ifndef __C64__ #ifdef __AVR__ #include #include #endif #define asm asm volatile #endif #include "can.h" #include "spi.h" #define spi_clear_ss() SPI_PORT |= (1<msg.port_src << 2)) | (msg->msg.port_dst >> 4)); spi_data((unsigned char)((msg->msg.port_dst & 0x0C) << 3) | (1<msg.port_dst & 0x03)); spi_data(msg->msg.addr_src); spi_data(msg->msg.addr_dst); spi_data(msg->msg.dlc); for(x=0;xmsg.dlc;x++) { spi_data(msg->msg.data[x]); } spi_clear_ss(); spi_set_ss(); spi_data(WRITE); spi_data(TXB0CTRL); spi_data((1<msg.port_src = tmp1 >> 2; tmp2 = spi_data(0); tmp3 = (unsigned char)((unsigned char)(tmp2 >> 3) & 0x0C); msg->msg.port_dst = ((unsigned char)(tmp1 <<4 ) & 0x30) | tmp3 | (unsigned char)(tmp2 & 0x03); msg->msg.addr_src = spi_data(0); msg->msg.addr_dst = spi_data(0); msg->msg.dlc = spi_data(0) & 0x0F; for(x=0;xmsg.dlc;x++) { msg->msg.data[x] = spi_data(0); } spi_clear_ss(); mcp_bitmod(CANINTF, (1<flags & 0x01) ) { message_fetch(&RX_BUFFER[RX_HEAD]); RX_BUFFER[RX_HEAD].flags |= 0x01;//mark buffer as used if( ++RX_HEAD == CAN_RX_BUFFER_SIZE) RX_HEAD = 0; }else{ //buffer overflow //just clear the Interrupt condition, and lose the message mcp_bitmod(CANINTF, (1<flags & 0x01) { ((can_message_x*)&TX_BUFFER[TX_TAIL])->flags &= ~0x01; TX_INT = 1; message_load(&TX_BUFFER[TX_TAIL]); if(++TX_TAIL == CAN_TX_BUFFER_SIZE) TX_TAIL = 0; }else{ TX_INT = 0; } mcp_bitmod(CANINTF, (1<msg); } } can_message * can_get() { can_message_x *p; while(RX_HEAD == RX_TAIL) {}; p = &RX_BUFFER[RX_TAIL]; if(++RX_TAIL == CAN_RX_BUFFER_SIZE) RX_TAIL = 0; return &(p->msg); } //marks a receive buffer as unused again so it can be overwritten in Interrupt void can_free(can_message * msg) { can_message_x * msg_x = (can_message_x *) msg; msg_x->flags = 0; } //returns pointer to the next can TX buffer can_message * can_buffer_get() { can_message_x *p; p = &TX_BUFFER[TX_HEAD]; while (p->flags&0x01); //wait until buffer is free if(++TX_HEAD == CAN_TX_BUFFER_SIZE) TX_HEAD = 0; return &(p->msg); } //start transmitting can messages, and mark message msg as transmittable void can_transmit(can_message* msg2) { can_message_x* msg=(can_message_x*) msg2; if(msg) { msg->flags |= 0x01; } if(!TX_INT) { if(((can_message_x*)&TX_BUFFER[TX_TAIL])->flags & 0x01) { ((can_message_x*)&TX_BUFFER[TX_TAIL])->flags &= ~0x01; TX_INT = 1; message_load(&TX_BUFFER[TX_TAIL]); if(++TX_TAIL == CAN_TX_BUFFER_SIZE) TX_TAIL = 0; } } } #else // NON INTERRUPT VERSION can_message_x RX_MESSAGE, TX_MESSAGE; can_message * can_get_nb() { //check the pin, that the MCP's interrupt output connects to if(SPI_REG_PIN_MCP_INT & (1<