查看: 3162|回复: 4

[求助] imx6q CAN 通信

[复制链接]

该用户从未签到

22

主题

54

帖子

0

中级会员

Rank: 3Rank: 3

积分
268
最后登录
2015-8-25
发表于 2015-4-7 17:30:36 | 显示全部楼层 |阅读模式
最近调试设计的板子CAN通信部分,能够与SABRELITE进行数据传输。但是当我连到到要进行真正传输的板子是时是不通的。求大神...
以下是该板子的CAN 通信:
typedef struct
{
volatile uint32 ID;           // CAN Message ID (11-bit or 29-bit)
volatile uint32 data_A;           // CAN Message Data Bytes 0-3
volatile uint32 data_B;           // CAN Message Data Bytes 4-7
} CAN_Message;

CAN_Message CAN_Data_TX, CAN_Data_RX; // TX and RX Buffers for CAN message

接收部分:
void CAN_IRQHandler(void)
{
volatile auto uint32 can_icr;
can_icr = LPC_CAN1->ICR;                       //CAN1读取中断标志,并清除标志
if(Bit_check_1(can_icr,ICR_RI))                         //CAN1有接收中断
{
  if(((LPC_CAN1->RFS>>16)&0x0F)==0x08&&((LPC_CAN1->RFS>>30)&0x03)==0)//数据长度为8位,接收数据,报文地址11位,数据正确
  {
   if(Bit_check_0(CAN_Data_Receive_Flag,RECEIVE_OK))//可跟新数据
   {
    CAN_Data_RX.ID = LPC_CAN1->RID;
    CAN_Data_RX.data_A = LPC_CAN1->RDA;
    CAN_Data_RX.data_B = LPC_CAN1->RDB;
        Bit_set(CAN_Data_Receive_Flag,RECEIVE_OK);//设置接收成功标志
   }
   LPC_CAN1->CMR = 0x04;                       //清空接收缓存
  }
}
}


发送部分:
Send_CAN_Data(&CAN_Data_TX.data_A,&CAN_Data_TX.data_B);
void Send_Set_Ventilator_Assisted(volatile uint32 *data_a,volatile uint32 *data_b)
{
*data_a=(((uint32)Set_parameter.Flowmeter_FiO2)<<24)|(((uint32)Set_parameter.Flowmeter_Flow)<<8)|((uint32)Set_parameter.Anesthetic_Compensation);
*data_b=(((uint32)Set_parameter.TV_Plus)<<24)|(((uint32)Set_parameter.Gas_O2_Concentration)<<16)|(((uint32)Set_parameter.Gas_N2O_Compensation)<<8);
}

  CAN_Send_Message(LPC_CAN1,&CAN_Data_TX);
uint8 CAN_Send_Message(LPC_CAN_TypeDef *can,CAN_Message *tx_buf )
{
auto uint8 return_data=0;
if (Bit_check_1(can->SR,SR_TBS1))//检测状态寄存器缓冲1是否可用
{
  can->TFI1 = 0x00080000;//发送无优先级,固定字节为8,发送数据,11位ID
  can->TID1 = tx_buf->ID;
  can->TDA1 = tx_buf->data_A;
  can->TDB1 = tx_buf->data_B;
  can->CMR = 0x21;//信息已载入可以发送缓冲器1的数据
  return_data=1;
}
else if (Bit_check_1(can->SR,SR_TBS2))//检测状态寄存器缓冲2是否可用
{
  can->TFI2 =  0x00080000;//发送无优先级,固定字节为8,发送数据,11位ID
  can->TID2 = tx_buf->ID;
  can->TDA2 = tx_buf->data_A;
  can->TDB2 = tx_buf->data_B;
  can->CMR = 0x41;//信息已载入可以发送缓冲器2的数据
  return_data=1;
}
else if (Bit_check_1(can->SR,SR_TBS3))//检测状态寄存器缓冲3是否可用
{       
  can->TFI3 =  0x00080000;//发送无优先级,固定字节为8,发送数据,11位ID
  can->TID3 = tx_buf->ID;
  can->TDA3 = tx_buf->data_A;
  can->TDB3 = tx_buf->data_B;
  can->CMR = 0x81;//信息已载入可以发送缓冲器2的数据
  return_data=1;
}
else
  return_data=0;
return (return_data);
}


我知道答案 目前已有4人回答
回复

使用道具 举报

该用户从未签到

22

主题

54

帖子

0

中级会员

Rank: 3Rank: 3

积分
268
最后登录
2015-8-25
 楼主| 发表于 2015-4-14 11:37:32 | 显示全部楼层
版主在哪!!自己顶一下
回复 支持 反对

使用道具 举报

该用户从未签到

45

主题

2369

帖子

0

金牌会员

Rank: 6Rank: 6

积分
3278
最后登录
1970-1-1
发表于 2015-5-5 17:21:16 | 显示全部楼层
楼主你好,关于CAN的使用,我这里发给你一个我们官网开发板上使用的文档,供你参考,有问题我们再沟通。

How to enable CAN bus on i.MX6Q SabreSD.pdf

482.87 KB, 下载次数: 54, 下载积分: 威望 1

回复 支持 反对

使用道具 举报

该用户从未签到

45

主题

2369

帖子

0

金牌会员

Rank: 6Rank: 6

积分
3278
最后登录
1970-1-1
发表于 2015-5-5 17:21:39 | 显示全部楼层

非常感谢你关于i.mx的技术问题。如果你没有其他问题,我们将此帖默认为已解决。
如果没有解决,欢迎继续在这里讨论哈~~
回复 支持 反对

使用道具 举报

  • TA的每日心情
    开心
    2016-11-4 08:26
  • 签到天数: 2 天

    连续签到: 1 天

    [LV.1]初来乍到

    24

    主题

    291

    帖子

    0

    高级会员

    Rank: 4

    积分
    615
    最后登录
    2020-11-21
    发表于 2015-5-20 10:19:31 | 显示全部楼层

    谢谢楼主的分享..
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /3 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2025-9-7 22:46 , Processed in 0.104372 second(s), 26 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

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