en efecto. bueno es el mcp2510, pero si, tengo comunicación -via spi- entre el pic y el mcp. Pero solo eso, spi... Ahora puedo leer lo que "grabo" en algun registro suyo. Tenia mala configuración de SPI. Sin embargo por h o por B ( usando sw o hw) no consigo enviar nada por la patilla TX al transceiver. Para verificar si el estado es el correcto, hago esto :
can_init();
if (can_tbe()){
can_putd(0x01,&buffer[0],8,1,TRUE,0);//id,data,no bits,prio,extended,creates
output_high(pin_d2);
}
Ese led conectado a ese pin, no enciende. Esto quiere decir que nunca pasa por el if. Viendo la librería miro que pasa con can_tbe(). en can-mcp2510.c se lee esto :
int1 can_tbe(void) {
struct txbNctrl_struct b_TXB0CTRL, b_TXB1CTRL, b_TXB2CTRL;
b_TXB0CTRL=mcp2510_read(TXB0CTRL);
b_TXB1CTRL=mcp2510_read(TXB1CTRL);
b_TXB2CTRL=mcp2510_read(TXB2CTRL);
if (!b_TXB0CTRL.txreq || !b_TXB1CTRL.txreq || !b_TXB2CTRL.txreq)
{return(1);}
return(0);
}
Bien, se lee TXBnCTRL directamente. ¿ Directamente? Si, porque si vamos a can-mcp2510.h, vemos esto otro :
#define TXB0CTRL 0x30
#define TXB1CTRL 0x40
#define TXB2CTRL 0x50
que es define los 3 registros como variables, en las direcciones reales ( claro..) del mcp. de hecho en datasheet del mcp podemos verlo :
TXBNCTRL Transmit Buffer N Control Register
(ADDRESS: 30h, 40h, 50h)
Se pone en unas variables "modificables" el resultado de la lectura, y se va concretamente al bit especificado "txreq" de cada uno de los 3 buffers de transmision. Si alguno de ellos esta libre para enviar, pone un 1 . Como yo tengo el mcp, es direccion existe. Tengo pensado enviar datos tal como lo pongo, y para verifiar qu no hay nada ( porque no hay ninguna conexión mas a ese pin, solo desde el pic claro). SPi si comunica con mcp, pero por que con CAN no le hace tanta gracia ? Ahora cabe preguntarme por que dice mi MCP que no está preparado para enviar datos fuera ( al transceiver, y desde este al eterior, se entiende).