请大神帮忙解决一下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);        //显示数据
                }                  
        }
}




友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。