使用原装TI 8962开发板,在8962原例程下,《CAN device FIFO mode example 》例程里修改CAN比特率,
//
// The CAN bit rate.
//
#define CAN_BITRATE 10000
问题:如果CAN_BITRATE为 80000时正常通讯没有问题,当CAN_BITRATE为 10000时无法通讯,CAN中断也没有??
使用原装TI 8962开发板,在8962原例程下,《CAN device FIFO mode example 》例程里修改CAN比特率,
//
// The CAN bit rate.
//
#define CAN_BITRATE 10000
问题:如果CAN_BITRATE为 80000时正常通讯没有问题,当CAN_BITRATE为 10000时无法通讯,CAN中断也没有??
楼主你好,例程里面是通过调用库函数CANBitRateSet来实现bit时间的设置的,而对一个bit时间内部prop 、phase1、phase2、swj的设置该函数里面有自己的规则,这个规则适合于绝大多数应用,有些特殊场合下还是需要客户自己设置bit内部的时间分配。楼主设置bitrate为10K的情况下调用该函数得出的bit时间内部的分配需要修改,所以建议楼主将demo程序中的调用CANBitRateSet语句注释掉,换成直接操纵寄存器来分配,给楼主一个参考:在10kbitrate下,可以设置seg2=10;seg1=6;swj=5;BRP=0x32
这个配置应该可以,我试过了,能够在bitrate为10k的时候跑起来
最近测试,我感觉CAN比特率已经配置到10K了,但是CAN收发器好像不支持10K的比特率。能否有低速率的CAN收发器
观察寄存器 值:seg2=6 seg1=7 sjw=3 BRP=0X31 配置标准 CAN CLK 8000000 CAN_BITRATE 10000
你是在8962的板子上跑的吗?建议先在8962的板子上跑起来。你是怎么设置bit时间的,是使用库函数,还是直接写寄存器来设置的?建议直接写寄存器,按照seg2=10;seg1=6;swj=5;BRP=0x32来试一下。
建议你直接操纵寄存器来设置,有些特殊场合下还是需要客户自己设置bit内部的时间分配,库函数满足不了。
给你一段代码参考一下:
temp = HWREG(0x40040000);
delay();
HWREG(0x40040000) |= (0x41|temp);
delay();
//HWREG(0x4004000C) = (0x04<<12)|(0x09<<8)|(0x03<<6)|(0x18);
HWREG(0x4004000C) = (0x09<<12)|(0x05<<8)|(0x04<<6)|(0x31); //seg2=10,seg1=6,swj=5,BRP=0x32
//HWREG(0x4004000C) = (0x07<<12)|(0x06<<8)|(0x05<<6)|(0x31);//seg2=8,seg1=7,BRP=0x32
delay();
HWREG(0x40040018) = 0x0;
delay();
HWREG(0x40040000) = temp;
delay();
can_device_fifo 和can_fifo工程的都要改
//
// Configure the bit rate for the CAN device, the clock rate to the CAN
// controller is fixed at 8MHz for this class of device and the bit rate is
// set to CAN_BITRATE.
//
//CANBitRateSet(CAN0_BASE, 8000000, CAN_BITRATE);
CANBitTimingSet(CAN0_BASE,(tCANBitClkParms*) &g_sCanFactory) ;
//*****************************************************************************
//
//! This structure instance contains the factory-default set of configuration
//! parameters for S2E module.
//
//*****************************************************************************
static const tCANBitClkParms g_sCanFactory =
{
//
// SEG1 8-(1)=7
//
8,
//
// SEG2 7-(1)=6
//
7,
//
// SJW 8-(5)=3
//
8,
//
// BPR 03-(01)=02
//
0x02,
};
//00-3F X 01-00 500K 02-01 10K=250K 03-02 X 04-03 5K=125K 05-04 100K
//(3F,3,7,6)-(00,8,7,8)
//01-00 1000K
//(00,2,3,2)
//01-00 800K 02-01 400K 04-03 200K 0A-09 80K
//(00,3,4,3)
使用CANBitTimingSet(unsigned long ulBase, tCANBitClkParms *pClkParms);函数设置CAN波特率也可以跑10K
但是有问题 10K 250K 都可以使用接收
楼主的问题是不是10k可以运行,但是接收数据出问题?如果是这样,楼主可以多试试几种bit timing 的组合,并且BPR可以设置大点,使得bit timing的配置更灵活,我原来建议的bit timing的分配不知道楼主试过没有,在10k下收发都是正常的
你好!谢谢你的帮助.你提供的程序可以运行在10K波特率,我自己修改为上面的配置也可以跑10K,但是同时还可以跑250K波特率,通讯都正常。不知道为什么?
按照你的程序,我观察寄存器的值和我上面的程序是一样的。也可以同时跑10K与250K波特率
谢谢您的帮助!还有关于如何配置CAN帧的数量问题? TI的例程给的是8*8(一次可以接收8帧,每一帧数据有8位)如何修改为 32*8 (32帧数据0