打印

请教C8051F506 CAN 问题

[复制链接]
5032|12
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
sk_haohao|  楼主 | 2012-2-9 10:40 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我用C8051F506 的CAN通讯,    用USB-CAN 工具总看不数据,然后我用官方的历程,也看不到数据,好像是有错误,然后就不发送了~ 我初次用CAN  初次用C8051的,求解答,谢谢,我打算用这和SJA1000的经典电路通讯。。

我测试CAN TX  单片机的IO  发现也是 仅2个字节后  就没有数据发送了

我不明白这个怎么设置帧类型?需要设置吗?我看SJA1000  有设置帧类型的

我电路是:单片机CAN光 耦隔离,接82C250,
我问过技术支持,他们说,发送程序单独是发送不出去??  需和接收程序的板子连接后,才发送成功! 为什么、、

初始化是官方例程一样呀。
void CAN0_Init (void)
{
   U8 iter;
   U8 SFRPAGE_save = SFRPAGE;
   SFRPAGE  = CAN0_PAGE;               // All CAN register are on page 0x0C
   CAN0CN |= 0x01;                     // Start Intialization mode
   //---------Initialize general CAN peripheral settings
   CAN0CN |= 0x4E;                     // Enable Status, Error,
                                       // Module Interrupts
                                       // Enable access to bit timing register
   // See the CAN Bit Timing Spreadsheet for how to calculate this value
   CAN0BT = 0x1402;                    // Based on 24 Mhz CAN clock, set the
                                       // CAN bit rate to 1 Mbps
   //---------Initialize settings common to all message objects
   // Command Mask Register
   CAN0IF1CM = 0x00F0;                 // Write Operation
                                       // Transfer ID Mask, MDir, MXtd
                                       // Transfer ID, Dir, Xtd, MsgVal
                                       // Transfer Control Bits
                                       // Don't set TxRqst or transfer data
   // Mask Registers
   CAN0IF1M1 = 0x0000;                 // Mask Bits 15-0 not used for filtering
   CAN0IF1M2 = 0x5FFC;                 // Ignore Extended Identifier for
                                       // filtering
                                       // Used Direction bit for filtering
                                       // Use ID bits 28-18 for filtering
   // Arbitration Registers
   CAN0IF1A1 = 0x0000;                 // 11-bit ID, so lower 16-bits not used
   // Message Control Registers
   CAN0IF1MC = 0x0880 | MESSAGE_SIZE;  // Enable Transmit Interrupt
                                       // Message Object is a Single Message
                                       // Message Size set by #define
   //---------Initialize unique settings for each valid message object
   for (iter = 0; iter < MESSAGE_OBJECTS; iter++)
   {
      // For example purposes, set 11-bit identifier based on the message
      // object that is used to send it.
      // Arbitration Registers
      CAN0IF1A2 = 0xA000 | (iter << 2);  // Set MsgVal to valid
                                         // Set Direction to write
                                         // Set 11-bit Identifier to iter
      CAN0IF1CR = iter;                // Start command request
      while (CAN0IF1CRH & 0x80) {}       // Poll on Busy bit
   }
   //---------Initialize settings for unused message objects
   for (iter = MESSAGE_OBJECTS; iter < 32; iter++)
   {
      // Set remaining message objects to be Ignored
      CAN0IF1A2 = 0x0000;              // Set MsgVal to 0 to Ignore
      CAN0IF1CR = iter;                // Start command request
      while (CAN0IF1CRH & 0x80) {}     // Poll on Busy bit
   }
   CAN0CN &= ~0x41;                    // Return to Normal Mode and disable
                                       // access to bit timing register
   SFRPAGE = SFRPAGE_save;
}

相关帖子

沙发
sk_haohao|  楼主 | 2012-2-13 11:04 | 只看该作者
此问题已解决,因为CAN 接收脚  的隔离电路有问题,没有应答

再问个问题:CAN 初始化配置好后,ID 就固定了。。。如果要扫描不同的ID ,我放数据时直接改,改不过来,问技术支持,说需要重新初始化,这是什么情况,难道我扫描1-n 就要初始化N遍。。。这还是CAN模块吗?还是技术支持不懂?在线等,请教指点

使用特权

评论回复
板凳
原野之狼| | 2012-2-13 11:12 | 只看该作者
有个FILTER的概念 先学习一下吧

使用特权

评论回复
地板
sk_haohao|  楼主 | 2012-2-13 11:49 | 只看该作者
过滤是接收的时候  选择性接收,符合的才接收

现在是发送,我发送很多同ID 开头的数据,一般都是  一次初始化,配置好,直接放ID+数据发送,但这个不同,意思是每个消息信箱只能有一个ID。。。初始化固定的,发送数据的时候不能更改?C8051F506 这款 或者是C8051的CAN 都是这样的。?

使用特权

评论回复
5
原野之狼| | 2012-2-13 11:51 | 只看该作者
我用的LPC的芯片   ID和数据都是可调整的

使用特权

评论回复
6
sk_haohao|  楼主 | 2012-2-14 14:01 | 只看该作者
内部是:Bosch can控制器    ....bosch can 控制器都不能再发送模式更改ID 吗??

使用特权

评论回复
7
sk_haohao|  楼主 | 2012-2-16 14:46 | 只看该作者
请教:有了解的吗?
C8051F50x  的单片机的 CAN控制器,初始化配置好ID  发送数据的时候不能更改ID吗?只能发初始化时固定的ID

使用特权

评论回复
8
sk_haohao|  楼主 | 2012-2-20 16:11 | 只看该作者
哦 问题解决了,发送的时候可以改,被技术支持误导厄

还发现个问题,就是我明明数据放进去,发送了,而且还是发送完了,但是CAN没有数据,大量发数据的时候会有丢失的帧,
发送前我判断的,消息信箱上次数据成功发送才再次发送

使用特权

评论回复
9
sk_haohao|  楼主 | 2012-2-21 10:36 | 只看该作者
OK  问题解决了,原因是 CPU更新消息信箱数据的时候,程序显示更新完成了,但发送不进入中断,我感觉是没更新进去。。。现在是更新后,不进入中断发送完成,我的处理方法:不进入中断发送完成,则还提交这组数据再次发送
也有可能是我判断消息信箱上次发送完成的 标志不对? ;) 我判断是发送信箱提交后,若为空,则发送完成。。。

使用特权

评论回复
10
Yager0203| | 2012-4-21 21:49 | 只看该作者
8# sk_haohao
请教下,怎么在发送是更改ID,是重新初始化?还是设置多个消息对象,每个消息对象采用不同的ID?

使用特权

评论回复
11
sk_haohao|  楼主 | 2012-6-12 11:03 | 只看该作者
不需要初始化 每个消息信箱都可以更改ID   寄存器 CAN0IF1CM 的  bit  5  是提交部分数据到消息信箱的 包括ID

使用特权

评论回复
12
xlsbz| | 2012-6-12 12:59 | 只看该作者
11# sk_haohao

一般做法是通过初始化来更改ID。


那么多邮箱是用来FIFO的。当然如果觉得麻烦也不用FIFO。FIFO配置起来比较麻烦

使用特权

评论回复
13
tjlwl| | 2013-5-20 19:52 | 只看该作者
mark

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

17

帖子

1

粉丝