2749|8

7

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

CAN 程序请教 [复制链接]

CAN 程序请教
CAN 使用 不丢包 多机通信 程序应该怎样设计,收发确认机制应该怎么做 需要运行什么协议吗?
新手 STM32刚学不久 请大神指点下 谢谢!!
此帖出自stm32/stm8论坛

最新回复

可直接 使用 我们的 CANWeb协议,具体见 签名 链接  详情 回复 发表于 2018-5-21 10:35
点赞 关注
 

回复
举报

69

帖子

0

TA的资源

一粒金砂(中级)

沙发
 
哦!也希望学习学习!
此帖出自stm32/stm8论坛
 
 

回复

4005

帖子

0

TA的资源

版主

板凳
 
这个只能自己设计了呀
此帖出自stm32/stm8论坛
 
 

回复

7

帖子

0

TA的资源

一粒金砂(初级)

4
 
huo_hu 发表于 2017-12-14 11:07
这个只能自己设计了呀

可否指点下 CAN 发送中断程序
/*---------------------------------------------------------------------------------------
//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
此帖出自stm32/stm8论坛
 
 
 

回复

7

帖子

0

TA的资源

一粒金砂(初级)

5
 
发送中的
CAN_ITConfig(CAN1, CAN_IT_TME, ENABLE);//被使用的邮箱标记//
中断中的
CAN_ClearITPendingBit(CAN1,CAN_IT_RQCP0);//清除CANx的中断位//
            CAN_ITConfig(CAN1, CAN_IT_TME, DISABLE);//发送邮箱空中断//
反复在操作同一个标志
此帖出自stm32/stm8论坛

点评

确实不是这么用的  详情 回复 发表于 2017-12-20 20:01
 
 
 

回复

183

帖子

0

TA的资源

一粒金砂(中级)

6
 
你这个多机通信需要自己定协议的。CAN发送  接收都是按CAN协议走的。
此帖出自stm32/stm8论坛
 
 
 

回复

4005

帖子

0

TA的资源

版主

7
 
本帖最后由 huo_hu 于 2017-12-20 20:15 编辑
huadao 发表于 2017-12-14 23:21
发送中的
CAN_ITConfig(CAN1, CAN_IT_TME, ENABLE);//被使用的邮箱标记//
中断中的
CAN_ClearITPending ...

确实不是这么用的,之所以弄出三个缓冲区是因为不知道哪一段报文会先发送完成,所以每次发送前要检查三个缓冲的状态,找一个空的发送,所以关键是那个发送函数。没有看到。
接收端也不能假设先发送的就会先收到,特别是在can总线带宽拥挤的时候容易出问题。
此帖出自stm32/stm8论坛
 
 
 

回复

525

帖子

235

TA的资源

版主

8
 
多机通讯是一主多从还是多主机通讯?如果是一主多从可以给每个从机分配一个ID号, 地址可以动态分配也可以固定。通讯协议可以自己定也可以使用标准的通讯协议比如CANOPEN
此帖出自stm32/stm8论坛
 
个人签名爱电子,爱生活
 
 

回复

18

帖子

0

TA的资源

一粒金砂(中级)

9
 
可直接 使用 我们的 CANWeb协议,具体见 签名 链接
此帖出自stm32/stm8论坛
 
个人签名CAN总线STM32F105_Keil工程C++源程序
https://bbs.eeworld.com.cn/thread-553036-1-1.html
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表