Hola.
Vamos por partes, como dijo Jack...
La directiva deberias ponerla DENTRO de can-mcp251x.c , reemplazando el resto de la seleccion en Can_Set_Baud().
Quedaria algo asi:
#ifdef Set_125K_Baud {
BRGCON1 = 0x01;
BRGCON2 = 0xBA; //modificado 5/11/07 para usar CAN a 125 KBps
BRGCON3 = 0x07; //con reloj a 10 MHz
}
#endif
#ifdef Set_250K_Baud {
BRGCON1 = 0x00;
BRGCON2 = 0xBA; //modificado 5/11/07 para usar CAN a 250 KBps
BRGCON3 = 0x07; //con reloj a 10 MHz
}
#endif
#ifdef Set_500K_Baud {
BRGCON1 = 0x00;
BRGCON2 = 0x92; //modificado 5/11/07 para usar CAN a 500 KBps
BRGCON3 = 0x02; //con reloj a 10 MHz
}
#endif
Cuidado que esto es para usar un cristal de 10 Mhz llevando al pic a 40 Mhz con el bit de configuracion H4 activo.
Si usas el MCP2515 deberias calcular los valores de los bytes BRGCON1, 2 y 3 nuevamente segun el cristal que utilizes.
Recomiendo leer las hojas de datos de tus modulos CAN para saber cuales serian esos valores dependiendo del cristal con que esten equipados.
Respecto a tu siguiente pregunta:
can_getd(rx_id, &datos_slave, rxlen, rxstat)
"&datos_slave" es el puntero a los datos entrantes (recibo bit a bit) y lo tngo que declarar como variable de recepción: int8 datos_slave=0¿?¿?.
"rxlen": cantidad de datos a recibir.Yo recibo 1 byte. ¿Qé coloco aqui? ¿1 o 8?.
Depende en realidad de cuanto bytes envia el esclavo (eso lo programas vos), el minimo es un byte y el maximo es 8.
Solo hay un mensaje sin ningun byte y es cuando un dispositivo se arranca y envia un mensaje para avisar que esta listo.
En la funcion Can_Getd no puedes seleccionar cuantos bytes recibes, solo recibes y haces el conteo segun lo que viene en RxLen, se entiende??
La funcion que devuelve un 1 si hay trafico en el bus es:
if ( can_kbhit() )
Si no se quiere utilizar se deben activar las interrupciones pero ese es un tema bastante mas complejo...
Respecto a como usar bits en este modo, te pongo un ejemplo de recepcion de un byte y el uso de cada bit de ese byte por separado. (precisamente enciende tres leds dependiento del estado de cada bit.) Es un ejemplo de CCS.
if ( can_kbhit() )
{
if(can_getd(rx_id, &buffer[0], rx_len, rxstat)) {
if (rx_id == ASK_FOR_ID_AD_B) {
printf("Channel B AD: %X\r\n",buffer
[0]); }
else if (rx_id == RESPOND_TO_LED_C_ID) {
//node C is an mcp250x0 which sends out a message upon edge detection on IO
//in_data[0]=iointfl, in_data[1]=gpio
a_leds=~(buffer[1]);
if (bit_test(a_leds,4)) {LED1_HIGH;} else {LED1_LOW;}
if (bit_test(a_leds,5)) {LED2_HIGH;} else {LED2_LOW;}
if (bit_test(a_leds,6)) {LED3_HIGH;} else {LED3_LOW;}
}
}
}
Aqui las definiciones de que es cada bit de esos:
#define PIN_LED1 PIN_A5
#define PIN_LED2 PIN_B5
#define PIN_LED3 PIN_B4
#define LED1_HIGH output_low(PIN_LED1)
#define LED1_LOW output_high(PIN_LED1)
#define LED2_HIGH output_low(PIN_LED2)
#define LED2_LOW output_high(PIN_LED2)
#define LED3_HIGH output_low(PIN_LED3)
#define LED3_LOW output_high(PIN_LED3)