写mcp2515的驱动要注意什么?
我在做mcp2515的驱动程序。但是接收始终不行。发送有时可以,有时不行。上代码。高手帮看看!
int main(void)
{
//adc_init();
#if (UART == 1)
uart_init();
#endif
gpio_init();
mcp2515_init();
init();
#if (LCD == 1)
lcd_init(LCD_DISP_ON);
#endif
uint8_t daten[8] = { 0x7B, 0x0F, 0x8E, 0x15, 0xC2, 0xAA, 0xAA, 0xFF };
/*
while(1)
{
//can_send_message( 0x048DABCD, daten, 8, CAN_EID );
can_send_message( 0x00000123, daten, 5, CAN_RTR );
daten[0] = daten[0] + 3;
delay(1000);
}
*/
while(1)
{
uint8_t temp=0, rtr = 0;
temp = mcp2515_read_register( CANINTF );
// if receive an frame ,do this
if ( temp & ((1<<RX0IF)|(1<<RX1IF)) ) {
uint8_t i;
uint16_t iTemp = 0;
#if (UART == 1)
uart_puts_P("have receive frame!\n");
gpio_set_led(LED2);
#endif
#if (LCD == 1)
lcd_gotoxy(0, 0);
#endif
// 躡erpr黤en was f黵 ein Identifier Empfangen wurde
temp = mcp2515_read_register( RXB0SIDL );
// 躡erpr黤en ob ein Extendet Identifer vorhanden ist
if ( temp & (1<<IDE) ) {
#if (UART == 1)
uart_puts_P("Extended Identifier : ");
uart_put_hex(mcp2515_read_register( RXB0SIDL) & 0x03 );
uart_put_hex(mcp2515_read_register( RXB0EID8) );
uart_put_hex(mcp2515_read_register( RXB0EID0) );
uart_putc('\n');
uart_puts_P("Standard Identifier : ");
#endif
iTemp = ( (uint16_t) mcp2515_read_register( RXB0SIDH ))<<3;
iTemp |= (temp>>5) & 0x07;
#if (UART == 1)
//Identifier ausgeben
uart_put_hex((uint8_t) (iTemp>>8));
uart_put_hex((uint8_t) iTemp & 0x00ff);
uart_putc('\n');
//躡erpr黤en ob es ein Remote Transmit Request Frame ist
if ( mcp2515_read_register( RXB0DLC ) & (1<<RTR))
uart_puts_P("Remote Transmit Request\n");
#endif
}
else {
#if (UART == 1)
uart_puts_P("Standard Identifier : ");
#endif
iTemp = ( (uint16_t) mcp2515_read_register( RXB0SIDH ))<<3;
iTemp |= (temp>>5) & 0x07;
#if (UART == 1)
//Identifier ausgeben //
uart_put_hex((uint8_t) (iTemp>>8));
uart_put_hex((uint8_t) iTemp & 0x00ff);
uart_putc('\n');
#endif
#if (LCD == 1)
lcd_puts_P("Id: ");
lcd_put_hex((uint8_t) (iTemp>>8));
lcd_put_hex((uint8_t) iTemp & 0x00ff);
#endif
//躡erpr黤en ob es ein Standard Remote Transmit Request Frame ist //
if ( temp & (1<<SRR)) {
#if (UART == 1)
uart_puts_P("Remote Transmit Request\n");
#endif
#if (LCD == 1)
lcd_puts_P(", RTR, ");
#endif
rtr = 1;
}
else {
#if (LCD == 1)
lcd_puts_P(", , ");
#endif
}
}
//Datenl鋘ge usw. einlesen
temp = mcp2515_read_register( RXB0DLC ) & 0x0F;
#if (LCD == 1)
lcd_putc(temp + '0');
lcd_gotoxy(0, 1);
#endif
if (rtr == 0) {
// read out data in register
for (i = 0;i < temp; i++ ) {
uint8_t daten = mcp2515_read_register( RXB0D0 + i );
#if (UART == 1)
uart_puts_P("DByte ");
uart_putc(i + '0');
uart_puts_P(" : ");
uart_put_hex( daten );
uart_putc('\n');
#endif
#if (LCD == 1)
lcd_put_hex(daten);
#endif
}
}
#if (LCD == 1)
for (i = temp;i < 8; i++ ) {
lcd_putc(' ');
lcd_putc(' ');
}
#endif
#if (UART == 1)
uart_putc('\n');
#endif
//clear interrupt flag
mcp2515_bit_modify( CANINTF, 0x01, 0x00 );
}
else{
gpio_set_led(LED1);
can_send_message( 0x00000123, daten, 5, CAN_RTR );
}
}
}