搜索
bottom↓
回复: 4

CAN总线的问题求教(MCP2515+MCP2551)

[复制链接]

出0入0汤圆

发表于 2016-9-12 14:18:53 | 显示全部楼层 |阅读模式
用MCP2515+MCP2551搭的CAN总线,现在遇到的问题是这样的,往发送缓冲器0写完ID和数据之后启动发送,开始的时候EFLG会一直上涨,每次接受端的EFLG会变为1,之后自动变为0;当发送端的EFLG值到0x80时接受端能正常接受到数据,发送的是标准帧,前2位ID是正确的,后两位ID会在两个值之间变化,遇到过这个问题的朋友有没有什么建议

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

 楼主| 发表于 2016-9-12 14:40:33 | 显示全部楼层
发送函数:
  1. unsigned char can_send_message(uint32_t npcs,U32 id, U8 *data, U8 length, U8 flags)
  2. {
  3.         unsigned int time_out = 15000;
  4.         U8 temp[4] = {0x11,0x00,0x00,0x00};
  5.         U8 tem_data;
  6.         if (length > 8)
  7.         length = 0;
  8.         //清空发送等待发送的报文
  9.         mcp_bit_modify(npcs,TXB0CTRL,0x08,0);
  10.         //清空所有中断
  11.         mcp_write_register(npcs,CANINTF,0);
  12.         //设置发送缓冲器0 发送优先级,TXP[1:0] = 11 , 为最高发送优先级
  13.         mcp_bit_modify( npcs,TXB0CTRL, (1<<TXP1)|(1<<TXP0), (1<<TXP1)|(1<<TXP0) );
  14.        
  15.         // 根据标志位,确定其ID格式,标准格式或扩展格式,同时发送其ID
  16. //         if (flags & CAN_EID) //扩展格式,11+18位ID
  17. //         {
  18. //                 temp[0] = (U8) (id>>21);  //取出基本ID的高8位
  19. //                 //取出基本ID的低三位,加上扩展ID的高2位,同时设置扩展标示符EXIDE使能
  20. //                 temp[1] = (((U8) (id>>16)) & 0x03) | (((U8) (id>>13)) & 0xE0) | (1<<EXIDE);
  21. //                
  22. //                 temp[2] = (U8) (id>>8);  //取扩展ID
  23. //                 temp[3] = (U8) id;
  24. //         }
  25. //         else                                 //标准格式,11位ID
  26. //         {
  27. //                 temp[0] = (U8) (id>>3);                //取出基本ID的高8位
  28. //                 temp[1] = (U8) (id<<5);        //取出基本ID的低3位 , 同时设置扩展标示符EXIDE为0,即禁用
  29. //                 temp[2] = 0;
  30. //                 temp[3] = 0;
  31. //         }
  32.         mcp_write_register_p( npcs,TXB0SIDH, temp, 4 );                //发送ID
  33.        
  34.         // 根据标志位,设定报文是否为远程发送请求,同时设定数据字节数
  35.         if (flags & CAN_RTR)
  36.         {
  37.                 mcp_write_register( npcs,TXB0DLC, length | (1<<RTR) );                //设定发送的报文为远程发送请求,并定义报文数据字节数
  38.         }
  39.         else
  40.         {
  41.                 mcp_write_register( npcs,TXB0DLC, length );                        // 设定报文的数据字节数
  42.         }
  43.         //写入发送数据
  44.         mcp_write_register_p( npcs,TXB0D0, data, length );
  45.        
  46.         // 请求发送报文,发送缓冲器为TXB0
  47.         //mcp_bit_modify(npcs,TXB0CTRL,0x08,0x08);
  48.         //
  49.         slect_cs(npcs);
  50.         spi_write(CAN_SPI,CAN_SPI_RTS | 0x01);
  51.         unslect_cs(npcs);
  52.         //
  53.         while(time_out--);
  54.         mcp_read_register(npcs,TXB0CTRL,&tem_data);
  55.         if (GET_BIT(tem_data,3))
  56.         {
  57.                 mcp_bit_modify(npcs,TXB0CTRL,0x08,0);
  58.                 send_uart1_to_computer(0,0xEE);
  59.                 //DEBUG_STRING("send error!\r");
  60.         }
  61.         return 0;
  62. }
复制代码

出0入0汤圆

 楼主| 发表于 2016-10-10 09:52:00 | 显示全部楼层
  1. void mcp_rx_buff_int_task(uint32_t npcs,volatile fifo_desc_t *m_can_fifo)
  2. {
  3.         unsigned char tem_can_buff[100];
  4.         unsigned char ID_temp[4] = {0,0,0,0};
  5.         unsigned char tem_read,i,length;
  6.         //send_uart1_to_computer(0,0x05);
  7.         mcp_read_register(npcs,CANINTF,&tem_read);
  8.         DEBUG_STRING("CANINTF:");
  9.         debug_ascii(0,tem_read);
  10.         DEBUG_STRING("\r\n");
  11.         //send_uart1_to_computer(0,tem_read);
  12.         if (GET_BIT(tem_read,ERRIF))//报文错误
  13.         {
  14.                 unsigned char tem_eflg;
  15.                 mcp_read_register(npcs,EFLG,&tem_eflg);
  16.                 if (GET_BIT(tem_eflg,RX1OVR))
  17.                 {
  18.                         mcp_bit_modify(npcs,EFLG,1 << RX1OVR,0);
  19.                 }
  20.                 else if (GET_BIT(tem_eflg,RX0OVR))
  21.                 {
  22.                         mcp_bit_modify(npcs,EFLG,1 << RX0OVR,0);
  23.                 }
  24.                 else
  25.                 {
  26.                         mcp_bit_modify(npcs,EFLG,0x3F,0);
  27.                 }
  28.                 CLR_BIT(tem_read,5);
  29.         }
  30.         if (GET_BIT(tem_read,RX0IF))        //RX BUFF0 接收满中断
  31.         {
  32.                 length = 0;
  33.                 unsigned char rtr_tem;
  34.                 mcp_read_register(npcs,RXB0CTRL,&rtr_tem);
  35.                 if (GET_BIT(rtr_tem,RXRTR))
  36.                 {
  37.                         mcp_read_register_p( npcs,RXB0SIDH , ID_temp , 4);   //读取4个字节的ID信息
  38.                         DEBUG_STRING("RTR FRAME!\r");
  39.                 }
  40.                 else
  41.                 {
  42.                         mcp_read_register_p( npcs,RXB0SIDH , ID_temp , 2);   //读取4个字节的ID信息
  43.                 }
  44.                 mcp_read_register( npcs,RXB0DLC,&length);         //读取数据字节长度
  45.                 //
  46.                 length &= 0x0F;
  47.                 mcp_read_register_p(npcs,RXB0D0,tem_can_buff,length);
  48.                
  49.                 //send_uart1_to_computer(ID_temp,4);
  50.                 DEBUG_STRING("Receive data:");
  51.                 debug_ascii(tem_can_buff,length);
  52.                 //send_uart1_to_computer(tem_can_buff,length);
  53.                 //
  54.                 mcp_write_register(npcs,CANINTF,0);
  55.                 //mcp_bit_modify(npcs,CANINTF,1 << RX0IF,0);
  56. //                 for (i= 0;i<4;i++)
  57. //                 {
  58. //                         fifo_set_u8t(m_can_fifo,ID_temp[i]);
  59. //                 }
  60. //                 for (i=0;i<length;i++)
  61. //                 {
  62. //                         fifo_set_u8t(m_can_fifo,tem_can_buff[i]);
  63. //                 }
  64.                 CLR_BIT(tem_read,0);
  65.         }
  66.         //
  67.         if (GET_BIT(tem_read,RX1IF))        //RX BUFF1 接收满中断
  68.         {
  69.                 length = 0;
  70.                 unsigned char rtr_tem;
  71.                 mcp_read_register(npcs,RXB1CTRL,&rtr_tem);
  72.                 if (GET_BIT(rtr_tem,RXRTR))
  73.                 {
  74.                         mcp_read_register_p( npcs,RXB1SIDH , ID_temp , 4);   //读取4个字节的ID信息
  75.                         DEBUG_STRING("RTR FRAME!\r");
  76.                 }
  77.                 else
  78.                 {
  79.                         mcp_read_register_p( npcs,RXB1SIDH , ID_temp , 2);   //读取4个字节的ID信息
  80.                 }
  81.                 //mcp_read_register_p( npcs,RXB1SIDH , ID_temp , 4);   //读取4个字节的ID信息
  82.                 mcp_read_register( npcs,RXB1DLC,&length);         //读取数据字节长度
  83.                 //
  84.                 length &= 0x0F;
  85.                 mcp_read_register_p(npcs,RXB1D0,tem_can_buff,length);
  86.                 send_uart1_to_computer(tem_can_buff,length);
  87.                 //
  88.                 mcp_write_register(npcs,CANINTF,0);
  89.                 //mcp_bit_modify(npcs,CANINTF,1 << RX1IF,0);
  90. //                 for (i= 0;i<4;i++)
  91. //                 {
  92. //                         fifo_set_u8t(m_can_fifo,ID_temp[i]);
  93. //                 }
  94. //                 for (i=0;i<length;i++)
  95. //                 {
  96. //                         fifo_set_u8t(m_can_fifo,tem_can_buff[i]);
  97. //                 }
  98.                 CLR_BIT(tem_read,1);
  99.         }
  100.         if (GET_BIT(tem_read,TX0IF))
  101.         {
  102.                 mcp_write_register(npcs,CANINTF,0);
  103.                 //mcp_bit_modify(npcs,CANINTF,1 << TX0IF,0);
  104.                 CLR_BIT(tem_read,2);
  105.         }
  106.         if (GET_BIT(tem_read,TX1IF))
  107.         {
  108.                 mcp_write_register(npcs,CANINTF,0);
  109.                 //mcp_bit_modify(npcs,CANINTF,1 << TX1IF,0);
  110.                 CLR_BIT(tem_read,3);
  111.         }
  112.         if (GET_BIT(tem_read,TX2IF))
  113.         {
  114.                 mcp_write_register(npcs,CANINTF,0);
  115.                 //mcp_bit_modify(npcs,CANINTF,1 << TX2IF,0);
  116.                 CLR_BIT(tem_read,4);
  117.         }
  118.         if (GET_BIT(tem_read,MERRE))
  119.         {
  120.                 get_mcp_state(npcs);
  121.                 if (npcs == NPCSA)
  122.                 {
  123.                         //clear_mcp_rx_buf(npcs);
  124.                 }
  125.                 else if(npcs == NPCSB)
  126.                 {
  127.                         //clear_mcp_tx_buf(npcs);
  128.                 }
  129.                 mcp_write_register(npcs,CANINTF,0);
  130.                 CLR_BIT(tem_read,7);
  131.         }
  132. }
复制代码

中断接收函数

出0入0汤圆

 楼主| 发表于 2016-10-10 09:53:08 | 显示全部楼层
最终问题是硬件虚焊

出0入0汤圆

发表于 2017-5-28 10:03:44 | 显示全部楼层
我刚刚学MCP2515,能请教您接个问题么?
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-23 08:22

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表