OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5049|回复: 9

CAN总线速度很低求解

[复制链接]

2

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
65
金钱
65
注册时间
2016-3-13
在线时间
12 小时
发表于 2016-4-8 16:35:11 | 显示全部楼层 |阅读模式
1金钱
F103和F407通过CAN总线通讯,在UCOSIII中,测试得到的通讯速度才28KByte,不知道是什么问题?求助!

F103 CAN初始化代码
[mw_shl_code=c,true]//CAN初始化,波特率500Kbps
CAN_Mode_Init(CAN_SJW_1tq, CAN_BS2_8tq, CAN_BS1_9tq, 4, 0);
[/mw_shl_code]
F103任务代码
[mw_shl_code=c,true]void can1_tx(void)
{
        OS_ERR err;
        CanTxMsg tx;
        u8 count = 1, i = 0;
        u32 eid;
        CAN_IdTypeDef id;
        id.SourId = CAN_ID;
        id.PrioId = 1;
        id.ArguId = 3;
        id.DestId = 1;
        eid = CAN_ID_Build(&id);
        while (1)
        {
tx.IDE = CAN_Id_Extended;
                tx.ExtId = eid;
                tx.DLC = 8;
                for (i = 0; i < tx.DLC; i++)
                {
                        tx.Data = count;
                        count++;
                }
                tx.RTR = CAN_RTR_Data;
                if (CAN_TxStatus_NoMailBox != CAN_Transmit(CAN1, &tx))
                        OSFlagPost(&RT_FLAG, TX_FLAG, (OS_OPT)OS_OPT_POST_FLAG_SET, &err);
}
}[/mw_shl_code]

最佳答案

查看完整内容[请看2#楼]

你这个28K BYTE是指28K 字节的数据吗? 如果是的话,差不多是这个速度了 500K/125*8=32K
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

13

主题

296

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2066
金钱
2066
注册时间
2012-5-26
在线时间
291 小时
发表于 2016-4-8 16:35:12 | 显示全部楼层
你这个28K BYTE是指28K 字节的数据吗?
如果是的话,差不多是这个速度了
500K/125*8=32K
活着才是王道!健康是一切的前提!
回复

使用道具 举报

2

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
65
金钱
65
注册时间
2016-3-13
在线时间
12 小时
 楼主| 发表于 2016-4-8 16:36:49 | 显示全部楼层
本帖最后由 gogoedv 于 2016-4-8 16:43 编辑

F407 CAN初始化代码
[mw_shl_code=c,true]CAN_Mode_Init(CAN_SJW_1tq, CAN_BS2_6tq, CAN_BS1_7tq, 6, CAN_Mode_Normal);[/mw_shl_code]

F407任务代码
[mw_shl_code=c,true]void can1_receive(void)
{
        OS_ERR err;
        int i=0;
        CAN_IdTypeDef id;
        u32 tick=0, lastTick=0;
        u32 lastCount = 0;
        u32 rate = 0;
        while(1)
        {
                OSSemPend(&CAN1_RX_SEM,0,OS_OPT_PEND_BLOCKING,0,&err); //等待CAN接收中断信号量
                tick = OSTimeGet(&err); //每个tick,5ms
                OSFlagPost(&RT_FLAG, RX_FLAG, (OS_OPT)OS_OPT_POST_FLAG_SET, &err); //LED灯
                CAN_ID_Parse(&can1RxMsg, &id);
                if(id.PrioId == 0x1)
                {
                        count = count + can1RxMsg.DLC;
                        if((tick - lastTick)>=200)// 一秒钟统计一次
                        {
                                rate = count - lastCount;
                                rate = rate / 1024;
                                LCD_ShowxNum(get_col_pix(1), get_row_pix(8), rate, 10,16,0);
                                lastTick = tick;
                                lastCount = count;
                        }
                }
        }
}[/mw_shl_code]
rate 显示为 28
回复

使用道具 举报

2

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
65
金钱
65
注册时间
2016-3-13
在线时间
12 小时
 楼主| 发表于 2016-4-8 16:45:02 | 显示全部楼层
本帖最后由 gogoedv 于 2016-4-8 16:46 编辑

UCOS系统里没有什么其他高级任务影响CAN通讯任务。CAN节点通讯距离40cm。
回复

使用道具 举报

58

主题

6293

帖子

1

精华

资深版主

Rank: 8Rank: 8

积分
11475
金钱
11475
注册时间
2014-4-1
在线时间
1297 小时
发表于 2016-4-8 17:00:12 | 显示全部楼层

发送方太懒?


回复

使用道具 举报

2

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
65
金钱
65
注册时间
2016-3-13
在线时间
12 小时
 楼主| 发表于 2016-4-8 17:11:20 | 显示全部楼层
我把无操作系统的CAN代码烧进去试了,速度还是基本一样。
无系统的F103代码
[mw_shl_code=c,true]#include "led.h"
#include "delay.h"
#include "key.h"
#include "sys.h"
#include "lcd.h"
#include "usart.h"         
#include "can.h"

int main(void)
{         
        u8 i=0;
        u8 cnt=0;
        u8 canbuf[8];

        delay_init();                     //延时函数初始化          
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置中断优先级分组为组2:2位抢占优先级,2位响应优先级
        uart_init(115200);                 //串口初始化为115200
        LED_Init();                                  //初始化与LED连接的硬件接口       
   
        CAN_Mode_Init(CAN_SJW_1tq,CAN_BS2_8tq,CAN_BS1_9tq,4,CAN_Mode_Normal);//CAN初始化环回模式,波特率500Kbps   

        while(1)
        {
               
                for(i=0;i<8;i++)
                        {
                                canbuf=cnt+i;//填充发送缓冲区
                        }
                        Can_Send_Msg(canbuf,8);//发送8个字节
        }
}
[/mw_shl_code]
回复

使用道具 举报

2

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
65
金钱
65
注册时间
2016-3-13
在线时间
12 小时
 楼主| 发表于 2016-4-8 17:13:10 | 显示全部楼层
接收方F407无系统代码
[mw_shl_code=c,true]#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "lcd.h"
#include "key.h"
#include "can.h"

int main(void)
{
        u32 temp;
        u8 key;
        u32 cnt=0;
        u8 canbuf[8];
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置系统中断优先级分组2
        delay_init(168);    //初始化延时函数
        uart_init(115200);        //初始化串口波特率为115200
        LED_Init();                                        //初始化LED
         LCD_Init();                                        //LCD初始化
        CAN1_Mode_Init(CAN_SJW_1tq,CAN_BS2_6tq,CAN_BS1_7tq,6,0);//CAN初始化环回模式,波特率500Kbps   
         POINT_COLOR=RED;//设置字体为红色
        LCD_ShowString(30,50,200,16,16,"Explorer STM32F4");        
        LCD_ShowString(30,70,200,16,16,"CAN TEST");        
        LCD_ShowString(30,90,200,16,16,"ATOM@ALIENTEK");
        LCD_ShowString(30,110,200,16,16,"2014/5/7");
        LCD_ShowString(30,130,200,16,16,"LoopBack Mode");         
        LCD_ShowString(30,150,200,16,16,"KEY0:Send WK_UP:Mode");//显示提示信息               
        POINT_COLOR=BLUE;//设置字体为蓝色           
        LCD_ShowString(30,170,200,16,16,"Count:");                          //显示当前计数值        
        LCD_ShowString(30,190,200,16,16,"Send Data:");                //提示发送的数据        
        LCD_ShowString(30,250,200,16,16,"Receive Data:");        //提示接收到的数据               
                                                         
        while(1)
        {
                key=CAN1_Receive_Msg(canbuf);
                if(key)//接收到有数据
                {                        
                        cnt = cnt + key;
                }
                if(cnt >=   1024 * 1024)
                {
                        LCD_ShowString(30,270,200,16,16,"New One MByte");        //提示接收到的数据
                        delay_ms(10000);
                }
        }
        
}
[/mw_shl_code]
回复

使用道具 举报

2

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
65
金钱
65
注册时间
2016-3-13
在线时间
12 小时
 楼主| 发表于 2016-4-8 17:14:40 | 显示全部楼层
F407提示收到 New One MByte 差不多要30秒。我用自己用秒表计时。
回复

使用道具 举报

2

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
65
金钱
65
注册时间
2016-3-13
在线时间
12 小时
 楼主| 发表于 2016-4-8 17:16:11 | 显示全部楼层
这个测试的速度怎么与500KB差距这么大?基本可以判断不是有无操作系统的问题。
回复

使用道具 举报

2

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
65
金钱
65
注册时间
2016-3-13
在线时间
12 小时
 楼主| 发表于 2016-4-8 17:28:50 | 显示全部楼层
这个应该是500Kbps / 8 = 62 KByte 吧?
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-2-26 19:47

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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