打印
[应用相关]

CAN 程序请教

[复制链接]
1391|14
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
CaLipton|  楼主 | 2018-7-23 16:53 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
CAN 程序请教
CAN 使用 不丢包 多机通信 程序应该怎样设计,收发确认机制应该怎么做 需要运行什么协议吗?
新手 STM32刚学不久 请大神指点下 谢谢!
/*---------------------------------------------------------------------------------------
//CAN1 发送数据//
----------------------------------------------------------------------------------------*/
int CAN_tx_msg(CanTxMsg TxMessage)
{
    uint8_t TransmitMailbox = 0;
    //OS_CPU_SR  cpu_sr = 0;
    TransmitMailbox = CAN_Transmit(CAN1, TxMessage);
    if(CAN_NO_MB == TransmitMailbox)//没有提供空邮箱//
    {
        printf("tx can fail\r\n");//打印邮箱错误//
        return 0;
    }
    else
    {
        //OS_ENTER_CRITICAL();         
        CAN_msg_num[TransmitMailbox] = 1;//被使用的邮箱标记//
       // OS_EXIT_CRITICAL();
    }
   
    CAN_ITConfig(CAN1, CAN_IT_TME, ENABLE);//被使用的邮箱标记//
    return 1;
}
/*---------------------------------------------------------------------------------------
//CAN1  发送中断//
----------------------------------------------------------------------------------------*/
void USB_HP_CAN1_TX_IRQHandler(void)
{
    if(CAN_msg_num[0])//发送邮箱0空中断//
    {
        if(SET == CAN_GetITStatus(CAN1,CAN_IT_RQCP0))//发送邮箱空中断//
        {
            CAN_ClearITPendingBit(CAN1,CAN_IT_RQCP0);//清除CANx的中断位//
            CAN_ITConfig(CAN1, CAN_IT_TME, DISABLE);//发送邮箱空中断//
            CAN_msg_num[0] = 0;
        }
    }
   
    if(CAN_msg_num[1])//发送邮箱1空中断//
    {
        if(SET == CAN_GetITStatus(CAN1,CAN_IT_RQCP1))//发送邮箱空中断//
        {
            CAN_ClearITPendingBit(CAN1,CAN_IT_RQCP1);//清除CANx的中断位//
            CAN_ITConfig(CAN1, CAN_IT_TME, DISABLE);//启用或禁用指定的CANx中断//
            CAN_msg_num[1] = 0;
        }
    }
   
    if(CAN_msg_num[2])//发送邮箱2空中断//
    {
        if(SET == CAN_GetITStatus(CAN1,CAN_IT_RQCP2))//发送邮箱空中断//
        {
            CAN_ClearITPendingBit(CAN1,CAN_IT_RQCP2);//清除CANx的中断位//
            CAN_ITConfig(CAN1, CAN_IT_TME, DISABLE);//启用或禁用指定的CANx中断//
            CAN_msg_num[2] = 0;
        }
    }
   
}
这段程序在网上看到的 怎么感觉3个邮箱和一个用法没区别,每个邮箱空的中断区分不开
#define CAN_IT_RQCP0   CAN_IT_TME
#define CAN_IT_RQCP1   CAN_IT_TME
#define CAN_IT_RQCP2   CAN_IT_TME
都是CAN_IT_TME
沙发
一路向北lm| | 2018-7-23 17:07 | 只看该作者
参考下CANfestival Canopen 协议

使用特权

评论回复
板凳
一路向北lm| | 2018-7-23 17:12 | 只看该作者
参考一下 ,这个是我调试的canfestival
pro_canfestival.zip (4.33 MB)

使用特权

评论回复
地板
Rospiers| | 2018-7-23 17:42 | 只看该作者
只能自己设计了

使用特权

评论回复
5
Lewisnx| | 2018-7-23 17:51 | 只看该作者
发送中的
CAN_ITConfig(CAN1, CAN_IT_TME, ENABLE);//被使用的邮箱标记//
中断中的
CAN_ClearITPendingBit(CAN1,CAN_IT_RQCP0);//清除CANx的中断位//
            CAN_ITConfig(CAN1, CAN_IT_TME, DISABLE);//发送邮箱空中断//
反复在操作同一个标志

使用特权

评论回复
6
CCompton| | 2018-7-23 18:10 | 只看该作者
这个多机通信需要自己定协议的

使用特权

评论回复
7
Richardd| | 2018-7-23 18:37 | 只看该作者
CAN发送  接收都是按CAN协议走的

使用特权

评论回复
8
Mattheww| | 2018-7-23 18:48 | 只看该作者
确实不是这么用的,之所以弄出三个缓冲区是因为不知道哪一段报文会先发送完成,所以每次发送前要检查三个缓冲的状态,找一个空的发送,所以关键是那个发送函数。

使用特权

评论回复
9
Erichk| | 2018-7-23 19:13 | 只看该作者
接收端也不能假设先发送的就会先收到,特别是在can总线带宽拥挤的时候容易出问题

使用特权

评论回复
10
Thorald| | 2018-7-23 19:34 | 只看该作者
多机通讯是一主多从还是多主机通讯?如果是一主多从可以给每个从机分配一个ID号, 地址可以动态分配也可以固定

使用特权

评论回复
11
Bjorn| | 2018-7-23 19:50 | 只看该作者
通讯协议可以自己定也可以使用标准的通讯协议比如CANOPEN

使用特权

评论回复
12
junpeng324| | 2018-7-23 21:27 | 只看该作者
一路向北lm 发表于 2018-7-23 17:12
参考一下 ,这个是我调试的canfestival

这个CANopen的不错,拿走了,谢谢啦

使用特权

评论回复
13
junpeng324| | 2018-7-23 21:30 | 只看该作者
优化CAN 发送和接收函数 ,可以是查询方式或者中断方式。

使用特权

评论回复
14
八层楼| | 2018-7-24 08:56 | 只看该作者
个人认为直接走中断就可以

使用特权

评论回复
15
labasi| | 2018-7-24 11:02 | 只看该作者
没有必要用那么多的邮箱吧

使用特权

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

本版积分规则

126

主题

369

帖子

0

粉丝