[PIC®/AVR®/dsPIC®产品] PIC18lf458 CAN配置进入工作模式后就一直不停的往外发数据

[复制链接]
1682|7
 楼主| 梦幻的帅帅 发表于 2021-4-28 22:09 | 显示全部楼层 |阅读模式
CAN配置进入工作模式后为就一直不停的往外发数据,我main函数并没有发送数据,上位机接收显示只有一位数据,而且ID还不对,求大神帮忙看看
 楼主| 梦幻的帅帅 发表于 2021-4-28 22:11 | 显示全部楼层
void InitCan(void)
{                                   
        TRISB=(TRISB|0x08)&0xFB;                // 数据方向寄存器   设置CANRX/RB3为输入,CANTX/RB2为输出   高电平输入,低电平输出

        CANCON = 0x80;                                    // CAN控制寄存器CANCON   请求配置模式  REQOP=100
        while(CANSTAT&0x80==0){;}                // 等待进入CAN配置模式OPMODE=100
                                    // 波特率寄存器BRGCONx(x=1,2, 3)决定了CAN 控制器的波特率、采样次数、同步跳转宽度和重同步方式
                                    // 500Kbps@16M     TBit=1*TQ+8*TQ+1*TQ+6*TQ=16*TQ=16*2/16=2      1/2 M=500 K              
//  BRGCON1 = 0x00;                  // 0000 0000       Sync_Seg=1*TQ     TQ = (2 x 1)/FOSC
//   BRGCON2 = 0xb8;                 // 1011 1000       Phase_Seg1=8*TQ  Prop_Seg=1*TQ
//   BRGCON3 = 0x05;                 // 0000 0101       Phase_Seg2=6*TQ
   
      BRGCON1 = 0xc0;                 // 1100 0000       Sync_Seg=4*TQ     TQ = (2 x 1)/20
      BRGCON2 = 0xb8;                 // 1011 1000       Phase_Seg1=8*TQ   Prop_Seg=1*TQ
      BRGCON3 = 0x06;                 // 0000 0110       Phase_Seg2=7*TQ
   

//  设置发送邮箱0标识符号和发送的数据
        TXB0CON=0x03;                                // TXB0发送优先级为最高优先级,TXPRI=11        00:最低优先级
        TXB0SIDH=0xFF;                                // 设置发送缓冲器0为标准标识符,ID = 0x7FF
        TXB0SIDL=0xE0;
        TXB0DLC=0x08;                                // 设置数据长度为8个字节

        TXB0D0=0X01;                                        // 写发送缓冲器数据区数据初值  TXBnDm:0 ≤ n < 3 and 0 < m < 8
        TXB0D1=0X02;                                       
        TXB0D2=0X03;                                          
        TXB0D3=0X04;       
        TXB0D4=0X05;       
        TXB0D5=0X06;       
        TXB0D6=0X07;       
        TXB0D7=0X08;       
//  设置接收邮箱0的标识符和初始化数据
        RXB0SIDH=0XFF;                                // 设置接收缓冲器0的标识符        ID = 0x3FF
        RXB0SIDL=0XE0;                      // SID2-SID0:111
        RXB0SIDH=0X00;                                // 设置接收缓冲器0的标识符        ID = 0x3FF
        RXB0SIDL=0X00;                      // SID2-SID0:111
   
        RXB0CON=0X20;                                        // 仅仅接收标准标识符,FILHIT0=0表示RXB0采用filter0
        RXB0DLC=0X08;                                        // 设置接收缓冲器0的数据区长度8个字节
       
        RXB0D0=0X00;                        // 初始化接收缓冲器0的数据区数据
    RXB0D1=0X00;
    RXB0D2=0X00;
    RXB0D3=0X00;
    RXB0D4=0X00;
    RXB0D5=0X00;
    RXB0D6=0X00;
    RXB0D7=0X00;

//  初始化接收滤波器0,Id = 0x26D = 0b 010 0110 1101
        RXF0SIDH=0b01001101;
        RXF0SIDL=0b10100000;

//  所有ID 都接受,不进行滤波
    RXM0SIDH=0X00;
        RXM0SIDL=0X00;

//        CIOCON=0X00;                    // 初始化CAN模块的I/O控制寄存器
        CANCON=0x00;                            //=0X40,进入自测试模式;=0x00,正常操作模式
        while(CANSTAT&0XE0!=0){;}   //1110 0000  等待进入正常操作模式

//初始化CAN的中断   PIC18F458
    PIR3=0X00;   //清所有中断标志
    PIE3=0X01;   //使能接收缓冲器0的接收中断  RXB0IE=1
    IPR3=0X01;   //接收缓冲器0的接收中断为最高优先级
}
 楼主| 梦幻的帅帅 发表于 2021-4-28 22:12 | 显示全部楼层
void main(void)
{
    InitPORT();      //IO口初始化
    Timer1_Init();   //定时器初始化
    InitCan();       //CAN初始化
    Sys_GetAddr();   //读取地址
    while(1)
    {
       GetSensor();  //读取传感器值
   
    }
}
 楼主| 梦幻的帅帅 发表于 2021-4-28 22:13 | 显示全部楼层
main函数都还没开始写呢,都没发送数据,上位机却一直收到数据
 楼主| 梦幻的帅帅 发表于 2021-4-28 22:14 | 显示全部楼层

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
 楼主| 梦幻的帅帅 发表于 2021-4-28 22:34 | 显示全部楼层
上位机用的是CAN-USB的调试工具
systemchip 发表于 2021-4-28 23:30 | 显示全部楼层
你该看一看CANTX引脚波形
shhludb 发表于 2021-4-29 20:21 | 显示全部楼层
PIC30F和33F都调试过没有问题,只是设置波特率寄存器手册弄反了,调试几天,才摸索对,后来看到勘误表里说到这点了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

37

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部