void CAN_Init(void)
{
//настройка скорости
#if defined(_18F4580)
CANCON_0 = 0b10010000;//run
while( (CANSTAT_0 & 0b11100000) != 0b10000000 );
#endif
#if defined(_18F458)
CANCON = 0b10010000;//run
while((CANSTAT & 0b11100000) != 0b10000000 );
#endif
#if defined(_18F258)
CANCON = 0b10010000;//run
while((CANSTAT & 0b11100000) != 0b10000000 );
#endif
BRGCON1 = 0b00111111;
BRGCON2 = 0b00111000;
BRGCON3 = 0b00000111;
//настройка портов
CIOCON = 0b000000;
RXB0CON = 0b01100000;
RXM0SIDH = 0x0;
RXM0SIDL = 0x0;
RXM1SIDH = 0xff;
RXM1SIDL = 0xff;
RXF0SIDH = 0;
RXF0SIDL = 0;
RXF1SIDH = 0;
RXF1SIDL = 0;
RXF2SIDH = 0;
RXF2SIDL = 0;
RXF3SIDH = 0;
RXF3SIDL = 0;
RXF4SIDH = 0;
RXF4SIDL = 0;
RXF5SIDH = 0;
RXF5SIDL = 0;
#if defined(_18F4580)
CANCON_0 = 0b00000000;//run
while( (CANSTAT_0 & 0b11100000) != 0b0 );
#endif
#if defined(_18F458)
CANCON = 0b00000000;//run
while((CANSTAT & 0b11100000) != 0b0 );
#endif
#if defined(_18F258)
CANCON = 0b00000000;//run
while((CANSTAT & 0b11100000) != 0b0 );
#endif
}
unsigned char CAN_SendMessage(void)
{
MSCount = 0;
while((TXB0CON & 0b00001000) != 0)if(MSCount>10000)return 0;
{
TXB0SIDH = ID >> 3;
TXB0SIDL = (ID & 255) << 5;
// TXB0DLC = 0b000001000;//8byte
TXB0DLC = 4;
TXB0D0 = CanData[0];
TXB0D1 = CanData[1];
TXB0D2 = CanData[2];
TXB0D3 = CanData[3];
TXB0D4 = CanData[4];
TXB0D5 = CanData[5];
TXB0D6 = CanData[6];
TXB0D7 = CanData[7];
TXB0CON |= 0b00001000;//start transmitt;
return 1;
}
}