写mcp2515的驱动要注意什么?

klangkang 2010-07-22 04:06:25
我在做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 );


}
}


}
...全文
633 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
Shane_Feng 2010-07-29
  • 打赏
  • 举报
回复
在工作模式下收发,你是用MCP2515模块和别的CAN模块通信,还是和另外的MCP2515模块通信呀?若是用MCP2515模块和别的CAN模块通信不能正常收发可能是你的发送缓冲标识符寄存器TXBnSIDH ,TXBnSIDL的ID存放位和接收的CAN模块的ID滤波器的位不对称。当然你在环回模式下主要是不存在ID滤波器的滤波接收所以能正确收发嘛
klangkang 2010-07-24
  • 打赏
  • 举报
回复
我的问题是在主函数里面写canctrl寄存器后,延时100毫秒,然后读取canstat寄存器,值不对!在初始化里面干这个事情,回到主函数读取的时候就对了!怪异的!
在环回模式下是能正确收发。但是在工作模式下不能收发,一般是什么原因?
PS:谢谢楼上指教!
klangkang 2010-07-23
  • 打赏
  • 举报
回复
我在mcp2515的初始化程序里面设定为环回模式后,到主程序里面读取CANSTAT的状态时对了。郁闷?为什么!还有我在环回模式下已经正常了。但是回到正常模式的时候,收发都不正常!谁能告诉我该怎么做?死这边了、我觉得我的程序没有问题了。不知道是不是硬件的问题!那个大侠指点指点呀
Shane_Feng 2010-07-23
  • 打赏
  • 举报
回复
你在发送报文之要读取CANSTAT寄存器,看看MCP2515是否工作在正常工作模式下,CANCTRL寄存器和CANSTAT寄存器的功能不一样,你读出来的当然就不一样哟!你要确认CANSTAT寄存器中的OPMOD<2:>位是000,也就是最高的三位是000,表示MCP2515在正常工作模式下,报文才能正常的发送和接收!
klangkang 2010-07-22
  • 打赏
  • 举报
回复
在往CANCTRL里面写回环模式的时候,是读取CANCTRL寄存器还是CANSTAT寄存器?好多例程上面写的是读取CANCTRL寄存器。但是datasheet要求去读CANSTAT寄存器。而且我CANCTRL寄存器后,从这两个寄存器中取出来的值不一样!哪位大哥帮忙解答一下!

27,383

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧