请大神帮忙解决一下can正常模式上位收不到数据,回环模式却可以的问题!请原子哥进来看看,用的是你的例程

2019-08-14 17:03发布

我只改了波特率,加入400K,用usb转can,连接电脑和开发板,回环模式上位能能到数据,开发板自己也能收到,但是用正常模式,上位收不到数据,往下发下位也收不到,请问这是怎么回事,程序原码如下,请大神指导,完整程序见附件 实验25 CAN收发实验.rar (2.08 MB, 下载次数: 516) 2015-12-28 20:49 上传 点击文件名下载附件



1.JPG #include "led.h"
#include "delay.h"
#include "key.h"
#include "sys.h"
#include "lcd.h"
#include "usart.h"         
#include "can.h"
                                   
//ALIENTEK战舰STM32开发板实验25
//CAN 实验  
//技术支持:www.openedv.com
//广州市星翼电子科技有限公司         

int main(void)
{         
        u8 key;
        u8 i=0,t=0;
        u8 cnt=0;
        u8 canbuf[8];
        u8 res;
        u8 mode=CAN_Mode_LoopBack;//CAN工作模式;CAN_Mode_Normal(0):普通模式,CAN_Mode_LoopBack(1):环回模式

        delay_init();                     //延时函数初始化          
        NVIC_Configuration();          //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
        uart_init(9600);                 //串口初始化为9600
        LED_Init();                                  //初始化与LED连接的硬件接口
        LCD_Init();                                   //初始化LCD       
        KEY_Init();                                //按键初始化                        

        CAN_Mode_Init(CAN_SJW_1tq,CAN_BS2_8tq,CAN_BS1_6tq,6,CAN_Mode_LoopBack);//CAN初始化环回模式,波特率450Kbps   

        POINT_COLOR=RED;//设置字体为红 {MOD}
        LCD_ShowString(60,50,200,16,16,"WarShip STM32");       
        LCD_ShowString(60,70,200,16,16,"CAN TEST");       
        LCD_ShowString(60,90,200,16,16,"ATOM@ALIENTEK");
        LCD_ShowString(60,110,200,16,16,"2012/9/11");
        LCD_ShowString(60,130,200,16,16,"LoopBack Mode");         
        LCD_ShowString(60,150,200,16,16,"KEY0:Send WK_UP:Mode");//显示提示信息               
  POINT_COLOR=BLUE;//设置字体为蓝 {MOD}          
        LCD_ShowString(60,170,200,16,16,"Count:");                        //显示当前计数值       
        LCD_ShowString(60,190,200,16,16,"Send Data:");                //提示发送的数据       
        LCD_ShowString(60,250,200,16,16,"Receive Data:");        //提示接收到的数据               
        while(1)
        {
                key=KEY_Scan(0);
                if(key==KEY_RIGHT)//KEY0按下,发送一次数据
                {
                        for(i=0;i<8;i++)
                        {
                                canbuf=cnt+i;//填充发送缓冲区
                                if(i<4)LCD_ShowxNum(60+i*32,210,canbuf,3,16,0X80);        //显示数据
                                else LCD_ShowxNum(60+(i-4)*32,230,canbuf,3,16,0X80);        //显示数据
                        }
                        res=Can_Send_Msg(canbuf,8);//发送8个字节
                        if(res)LCD_ShowString(60+80,190,200,16,16,"Failed");                //提示发送失败
                        else LCD_ShowString(60+80,190,200,16,16,"OK    ");                         //提示发送成功                                                                  
                }else if(key==KEY_UP)//WK_UP按下,改变CAN的工作模式
                {          
                        mode=!mode;
                          CAN_Mode_Init(CAN_SJW_1tq,CAN_BS2_8tq,CAN_BS1_6tq,6,mode);//CAN普通模式初始化, 波特率450Kbps
                        POINT_COLOR=RED;//设置字体为红 {MOD}
                        if(mode==0)//普通模式,需要2个开发板
                        {
                                LCD_ShowString(60,130,200,16,16,"Nnormal Mode ");            
                        }else //回环模式,一个开发板就可以测试了.
                        {
                                LCD_ShowString(60,130,200,16,16,"LoopBack Mode");
                        }
                        POINT_COLOR=BLUE;//设置字体为蓝 {MOD}
                }                 
                key=Can_Receive_Msg(canbuf);
                if(key)//接收到有数据
                {                       
                        LCD_Fill(60,270,130,310,WHITE);//清除之前的显示
                        for(i=0;i<key;i++)
                        {                                                                            
                                if(i<4)LCD_ShowxNum(60+i*32,270,canbuf,3,16,0X80);        //显示数据
                                else LCD_ShowxNum(60+(i-4)*32,290,canbuf,3,16,0X80);        //显示数据
                        }
                }
                t++;
                delay_ms(10);
                if(t==20)
                {
                        LED0=!LED0;//提示系统正在运行       
                        t=0;
                        cnt++;
                        LCD_ShowxNum(60+48,170,cnt,3,16,0X80);        //显示数据
                }                  
        }
}




友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
24条回答
775647194
1楼-- · 2019-08-15 17:23
正点原子 发表于 2015-12-29 22:22
额,那你接线,跳线什么的,没问题吧?

都没有问题啊,回环模式能收到啊,为什么正常模式就不行了,所以都不知道问题出在哪
正点原子
2楼-- · 2019-08-15 22:10
775647194 发表于 2015-12-30 19:44
都没有问题啊,回环模式能收到啊,为什么正常模式就不行了,所以都不知道问题出在哪

回环模式,没有去判断总线仲裁了,估计问题就出在这里
775647194
3楼-- · 2019-08-15 22:57
 精彩回答 2  元偷偷看……
正点原子
4楼-- · 2019-08-16 02:45
775647194 发表于 2015-12-31 15:51
那要怎么解决呢?我现在用正常模式都无法通信啊

慢慢调试
mandy_0
5楼-- · 2019-08-16 03:26
你可以多下几个CAN通讯软件,看有没有哪个是可以手动设置波特率的,用原来的代码试试看
101yang
6楼-- · 2019-08-16 06:01
发送应该是正常的吧   只是接收进不了中断?  我现在就是这样的一种情况 有没完成了的呢 麻烦指点一下  

一周热门 更多>